Como configurar um microfone virtual e um áudio pipe a partir de node.js

0

Resumo :

Já fiz esta pergunta em StackOverflow , chamou a atenção, mas infelizmente ninguém conseguiu ajudar. Eu acho que isso acontece porque os dispositivos ALSA são um tópico bastante específico e a comunidade de SOs pode não ser a pessoa certa para perguntar. Então estou tentando aqui novamente.

Atualmente estou fazendo algum trabalho em um bot Discord. Estou tentando ingressar em um canal de voz, que é a parte fácil, e depois usar o áudio combinado dos alto-falantes nesse canal de voz como entrada para uma página da Web em um navegador da web. Não importa qual navegador é, desde que possa ser controlado com o Selenium.

O que eu tentei / olhei até agora

Meu bot até agora foi escrito em Python usando o discord.py wrapper da API. Infelizmente, ouvir, ao invés de colocar, o áudio não foi exatamente implementado - e muito menos documentado - com o discord.py. Isso me fez decidir mudar para node.js (ou seja, discord.js ) para o coisas do canal de voz do meu bot.

Depois de mudar para discord.js, foi muito fácil determinar quem está falando e criar um fluxo de áudio (fluxo PCM) para esse usuário. Para a próxima parte, pensei em apenas encaminhar o fluxo de áudio para um microfone virtual e selecioná-lo como entrada de áudio no navegador. Você pode até usar o FFMPEG dentro do node.js 1 , para obter algo parecido com isto:

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');

Esta última parte, criando e transmitindo para um microfone virtual, provou ser bastante complicada. Eu li uma tonelada de posts SO e documentação em ambos O Advanced Linux Sound Architecture (ALSA) e o JACK Audio Connection Kit, mas eu simplesmente não consigo descobrir como configurar um microfone virtual que vai aparecer como um microfone no meu navegador, ou como canalizar áudio para ele.

Anypointers para uma solução seria muito apreciada!

Adendo

Nos últimos dias, continuei analisando essa questão. Agora aprendi sobre dispositivos de loopback do ALSA e sinto que a solução deve estar lá.

Eu praticamente segui uma postagem que fala sobre dispositivos de loopback e visa alcançar o seguinte:

Simply imagine that you have a physical link between one OUT and one IN of the same device.

Eu configurei os dispositivos conforme descrito na postagem e agora dois novos dispositivos de áudio aparecem ao selecionar um microfone no Firefox. Eu esperaria um, mas isso pode ser porque eu não entendo completamente os dispositivos de loopback (ainda).

Os dispositivos de loopback são criados e eu acho que eles estão ligados (se eu entendi o artigo acima mencionado corretamente). Supondo que esse seja o caso, o único problema que tenho de resolver é transmitir o áudio via FFMPEG dentro do node.js.

    
por Niellles 07.10.2018 / 23:14

0 respostas