Как настроить виртуальный микрофон и передать на него аудио из node.js - PullRequest
0 голосов
/ 05 сентября 2018

Резюме того, чего я пытаюсь достичь:

В настоящее время я работаю над ботом Discord. Я пытаюсь присоединиться к голосовому каналу, что является самой легкой частью, а затем использовать объединенный звук динамиков в этом голосовом канале в качестве входных данных для веб-страницы в веб-браузере. На самом деле не имеет значения, каким браузером он является, если им можно управлять с помощью Selenium.


Что я пробовал / изучал до сих пор

Мой бот до сих пор написан на Python с использованием API-оболочки discord.py . К сожалению, прослушивание, в отличие от вставки, аудио не было реализовано точно - не говоря уже о документировании - с discord.py. Это заставило меня принять решение переключиться на node.js (то есть discord.js ) для голосового канала моего бота.

После перехода на discord.js было довольно легко определить, кто говорит, и создать аудиопоток (поток PCM) для этого пользователя. В следующей части я решил, что просто передаст аудиопоток на виртуальный микрофон и выберет его в качестве аудиовхода в браузере. Вы даже можете использовать FFMPEG из node.js 1 , чтобы получить что-то похожее на это:

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

Последняя часть, создание и передача на виртуальный микрофон, оказалась довольно сложной. Я прочитал тонну SO сообщений и документации по Advanced Linux Sound Architecture (ALSA) и JACK Audio Connection Kit, но я просто не могу понять, как настроить виртуальный микрофон, который будет в моем браузере отображается как микрофон, или как транслировать аудио на него.

Любая помощь или указатели для решения будет принята с благодарностью!


Добавление

Последние пару дней я продолжал изучать эту проблему. Теперь я узнал о петлевых устройствах ALSA и чувствую, что решение должно быть там.

Я в значительной степени следовал за постом , в котором говорится о петлевых устройствах и нацелен на достижение следующего:

Просто представьте, что у вас есть физическая связь между одним OUT и одним IN того же устройства.

Я настроил устройства, как описано в посте, и теперь при выборе микрофона в Firefox появляются два новых аудиоустройства. Я бы ожидал, но это может быть потому, что я не совсем понимаю петлевые устройства (пока).

Устройства с обратной связью созданы, и я думаю, что они связаны (если я правильно понял вышеупомянутую статью). Предполагая, что это тот случай, единственная проблема, которую мне нужно решить, - это потоковая передача аудио через FFMPEG из node.js.

Audio devices

1 Ответ

0 голосов
/ 13 октября 2018

Там ответили: Аудио-файл канала Linux на вход микрофона

Создание виртуального микрофона:

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

Передайте вывод ffmpeg в файл virtmic, и он должен работать:

ffmpeg -re \
    -i input.mp3 \
    -f s16le -ar 16000 -ac 1 - > /tmp/virtmic

Примечание : Я заметил, что если на канале нет считывателей, ffmpeg просто зависает. Это можно исправить, просто открыв счетчик Pulse Audio VU, команду pavucontrol

...