私が達成しようとしていることの要約:
私は現在、Discordボットでいくつかの作業を行っています。簡単な部分である音声チャネルに参加し、その音声チャネルのスピーカーの結合されたオーディオをWebブラウザーのWebページへの入力として使用しようとしています。 Seleniumで制御できる限り、どのブラウザーであるかは実際には問題ではありません。
これまでの私のボットは、 discord.py APIラッパーを使用してPythonで記述されています。残念ながら、オーディオを入力するのではなく、聞くことは正確に実装されていません。素晴らしい-文書化はもちろん-discord.pyで。これにより、ボットの音声チャネルのものをnode.js(つまり、 discord.js )に切り替えることにしました。
Discord.jsに切り替えた後、誰が話しているのかを判断し、そのユーザーのオーディオストリーム(PCMストリーム)を作成するのは非常に簡単でした。次のパートでは、オーディオストリームを仮想マイクにパイプしてパイプし、ブラウザのオーディオ入力として選択します。 node.js内からFFMPEGを使用することもできます 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');
この最後の部分である仮想マイクの作成とストリーミングは、かなり複雑であることが証明されています。 Advanced Linux Sound Architecture(ALSA)とJACK Audio ConnectionKitの両方に関するSOの投稿とドキュメントをたくさん読みましたが、ブラウザにマイクとして表示される仮想マイクを設定する方法や、オーディオをマイクにパイプする方法がわかりません。
どんな助けや解決策へのポインタも大歓迎です!
過去数日間、私はこの問題を調査し続けてきました。 ALSAループバックデバイスについて学び、解決策が必要だと感じました。
ループバックデバイスについて説明し、次のことを達成することを目的とした post をほぼフォローしました。
同じデバイスの1つのOUTと1つのINの間に物理的なリンクがあると想像してみてください。
投稿で説明されているようにデバイスをセットアップしましたが、Firefoxでマイクを選択すると2つの新しいオーディオデバイスが表示されます。私はそれを期待しますが、それは私がループバックデバイスを完全に理解していないためかもしれません(まだ)。
ループバックデバイスが作成され、リンクされていると思います(前述の記事を正しく理解していれば)。その場合、私が取り組む必要がある唯一の問題は、node.js内からFFMPEGを介してオーディオをストリーミングすることです。
これはそこで答えられます: 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 AudioVUメーターを開くだけで修正できます。コマンドpavucontrol