web-dev-qa-db-ja.com

仮想マイクをセットアップし、node.jsからそれにオーディオをパイプする方法

私が達成しようとしていることの要約

私は現在、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を介してオーディオをストリーミングすることです。

Audio devices

9
Niellles

これはそこで答えられます: 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

1
sebpiq