Резюме того, чего я пытаюсь достичь:
В настоящее время я работаю над ботом 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.