Pulseaudioシンクを仮想ソースにリダイレクトする

Pulseaudioシンクを仮想ソースにリダイレクトする

私は、プログラム (私の場合は ffmpeg) のサウンドをソースにリダイレクトして、問題のサウンドを Zoom (ビデオ会議ソフトウェア) で再生できるようにしようとしています。これを行うための一般的な方法は、すべてのシンクにモニターが付属しているため、Zoom のサウンド ソースとして SinkName.monitor ソースを選択することです。しかし、

1) Zoom のマイクのドロップダウンにモニター ソースが表示されません。モニターの device.class プロパティを (「モニター」ではなく)「サウンド」に設定して、Zoom がそれを受け入れるようにしようとしましたが、効果はありませんでした。

2) Zoom では、pavucontrol から自分でソースを設定することができないようです。録音タブで、Zoom で聞く別のソースを設定しようとすると、何を選択しても、その選択は無視されます。ドロップダウン オプションも変更されません。どこかで、~/.alsoftrc を作成し、"[pulse]" (改行) "allow-moves=yes" と記述すると役立つと読んだことがありますが、私の場合は何も起こりませんでした。

したがって、私は独自のソースを設定し、「サウンドをそれにリダイレクト」しようとしています。ヌル シンク、ヌル ソース、およびループバックを作成しましたが、pavucontrol を開いたときに、おそらく逆になっていることがわかりました。ループバックは、ソースをシンクにリダイレクトするために使用され、その逆ではないようです (pavucontrol の [再生] の下に「MySource の [...] MySink へのループバック」と表示され、MySink は右側のドロップダウン リストの値です)。

私がやろうとしていることを実現する方法はありますか? 次のいずれかです:

a) モニターを改造して通常のマイクのように見えるようにする、または

b) シンクの音を音源にリダイレクトしますか?

ありがとう。

答え1

次の設定は、Linux 上の Zoom とアプリケーション オーディオを共有するのに有効です。この設定では、マイクとアプリケーション オーディオが Zoom に送られます。ただし、最後に説明するように、どちらか一方のみを使用するように変更することもできます。

マイクとアプリケーション オーディオをミックスするシンクを作成します。

pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone

アプリケーション オーディオを取得してスピーカーと、先ほど作成した特別なミキシング シンクに送信するシンクを作成します (alsa_output….analog-stereoシンクの名前に置き換えますpactl list sinks short。 を参照してください)。

pactl load-module module-combine-sink sink_name=virtual-microphone-and-speakers \
slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo

実際のマイクをミキシング シンクにループバックします (alsa_input…analog-stereoソースの名前に置き換えます。 を参照してくださいpactl list sources short)。

pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo \
sink=mix-for-virtual-mic latency_msec=20

Zoom が実際にマイクを判別する方法は私にはよく分かりません。モニターを使用するように指示することはできませんが、echo-cancel(Paul が説明したように) は聞き取ります。実際にキャンセルするエコーがないため、キャンセルするための偽のシンクを作成します。

pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel

最後に、Zoom が検出するマイクとして機能するエコーキャンセル ソースを作成します。

pactl load-module module-echo-cancel \
sink_name=virtual-microphone source_name=virtual-microphone \
source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null \
source_properties=device.description=Virtual-Microphone \
sink_properties=device.description=Virtual-Microphone

これで、Zoom のマイクセクションに仮想マイクが表示されます。

アプリケーション オーディオを Virtual-Microphone に送信するには、 でpavucontrol、アプリケーションのシンクを Mix-for-Virtual-Microphone (仮想マイクにのみ送信) に設定するか、または「Mix-for-Virtual-Microphone の同時出力、…」に設定してマイクとスピーカーに送信します。

なお、 の「同時出力…」の音量を変更することで、実際のマイクの音量とは関係なく、仮想マイクとスピーカーのアプリケーション オーディオの音量をミュートしたり変更したりすることもできますpavucontrol

当然のことながら、「入力デバイス」セクションでマイクをミュートして、アプリケーションのオーディオのみを共有することもできます。

理解しやすいように、この設定を視覚化したものを以下に示します。

セットアップのグラフ

答え2

別の方法を見つけました: module-pipe-source。

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

それから:

ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic

(これはモジュール v412loopback を使用してウェブカメラを偽装することに注意してください)

答え3

OBSをZoomにルーティングしたかったので、ビデオを接続するためにV4l2loopbackを使用しました(https://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/)。オーディオを接続するには、次のようにします。

#!/bin/sh

# This created something I could see in OBS.  Set it as the monitor device in Settings->Audio.  Then
# turn on monitoring for the microphone and the video.

pactl load-module module-null-sink sink_name=Virtual-Speaker sink_properties=device.description=Virtual-Speaker

# Now I need to take the monitor stream from the Virtual-Speaker and turn it into a source that Zoom can use
# as a microphone.

pactl load-module module-remap-source source_name=Remap-Source master=Virtual-Speaker.monitor

OBS からビデオを再生するときにオーディオとビデオが揃っていても、ビデオに解説を追加しようとすると、正しく同期されません。

アップデート:

これをしばらく使用してみたところ、次のような流れになりました。

  1. ブートコンピュータ、
  2. スクリプトを実行、
  3. OBSを起動します(カメラを制御し、仮想ビデオフィードを開始します)。
  4. Zoom を起動します (仮想フィードを取得しますが、音声が遅れる場合があります)。
  5. OBSを終了し、
  6. OBS を起動します (オーディオに遅延はありません)。
  7. 授業を教える

別のクラスを教えなければならない場合:

  1. ズームを終了し、
  2. 新しいZoomミーティングを開始、
  3. OBSを終了し、
  4. OBSを起動します。
  5. 2年生を教える

このプロセスは、私にとってはしばらくの間信頼できるものでした。プロセスにさらなる自動化を追加しようとはしていません。理論 (実際の証拠はありません): プログラムが適切なデバイスを取得するには、ZOOM の前に OBS を起動する必要があります。OBS はオーディオ パイプラインにデータを入れ始めるので、パイプラインをフラッシュするには OBS を停止して再起動する必要があります。

答え4

Zoom でも同じ問題が発生しました。代替案としては、 が考えられますmodule-echo-cancel。これにより、既存のモニター ソースから新しいソースを作成できます。デフォルト設定では、ほとんど処理が行われないと思います。

pactl load-module module-echo-cancel \
   sink_name="echo_cancel" \
   source_master="YourSink.monitor" \
   sink_master="DefaultSink" \
   aec_method="webrtc"

DefaultSinkデフォルトの出力デバイスとYourSink.monitorシンクのモニター (この場合はストリーム シンク)に設定します。

この解決策はipwebcam-gst スクリプト

関連情報