如何设置虚拟麦克风并通过node.js将音频通过管道传输到虚拟麦克风

时间:2018-09-05 08:54:41

标签: node.js ffmpeg alsa discord.js jack

摘要我要实现的目标:

我目前正在使用Discord机器人进行一些工作。我正在尝试加入语音通道(这是很简单的部分),然后使用该语音通道中扬声器的组合音频作为Web浏览器中网页的输入。只要可以使用Selenium对其进行控制,实际上并不重要。


到目前为止我一直在尝试/研究的内容

到目前为止,我的机器人是使用discord.py API包装器以Python编写的。不幸的是,与放入音频相反,收听音频并没有完全与discord.py一起实现(更不用说记录了)。这使我决定切换到Node.js(即discord.js)作为我的机器人的语音通道内容。

切换到discord.js后,很容易确定谁在讲话并为该用户创建音频流(PCM流)。在下一部分中,我将 just 管道传输到虚拟麦克风,然后将其选择为浏览器上的音频输入。您甚至可以从node.js 1中使用FFMPEG来获取如下内容:

const Discord = require("discord.js");
const client = new Discord.Client();

client.on('ready', () => {
  voiceChannel = client.channels.get('SOME_CHANNEL_ID');
  voiceChannel.join()
    .then(conn => {
      console.log('Connected')

      const receiver = conn.createReceiver();

      conn.on('speaking', (user, speaking) => {
        if (speaking) {
          const audioStream = receiver.createPCMStream(user);

          ffmpeg(stream)
              .inputFormat('s32le')
              .audioFrequency(16000)
              .audioChannels(1)
              .audioCodec('pcm_s16le')
              .format('s16le')
              .pipe(someVirtualMic);          
        }
      });
    })
    .catch(console.log);
  }); 

client.login('SOME_TOKEN');

最后一部分,创建并流式传输到虚拟麦克风,已证明相当复杂。我已经阅读了 Advanced Linux Sound Architecture (ALSA)和JACK Audio Connection Kit上的大量SO帖子和文档,但是我根本不知道如何设置一个虚拟麦克风来会在我的浏览器中显示为麦克风,或显示如何将音频通过管道传输。

任何帮助或指向解决方案的指针将不胜感激!


附录

在过去的几天里,我一直在研究这个问题。我现在已经了解了ALSA环回设备,并认为解决方案必须存在。

我已经非常关注post,该话题谈论回送设备,旨在实现以下目标:

  

简单地假设您在一个OUT和一个OUT之间建立了物理链接   同一设备的IN。

我已经按照文章中的描述设置了设备,现在在Firefox中选择麦克风时会出现两个新的音频设备。我希望有一个,但是那可能是因为我还不完全了解回送设备。

已创建回送设备,并且我认为它们已链接(如果我正确理解了上述文章)。假设是这种情况,我唯一要解决的问题是从node.js内部通过FFMPEG传输音频。

Audio devices

1 个答案:

答案 0 :(得分:2)

在这里回答:Linux pipe audio file to microphone input

创建虚拟麦克风:

OnCallStateChanged

将ffmpeg管道输出到incomingNumber文件中,它应该可以工作:

pactl load-module module-pipe-source source_name=virtmic file=/tmp/virtmic format=s16le rate=16000 channels=1

注意:我注意到,如果管道中没有读者,virtmic会挂起。只需打开Pulse Audio VU表,命令ffmpeg -re \ -i input.mp3 \ -f s16le -ar 16000 -ac 1 - > /tmp/virtmic

即可解决此问题。