jetson nano とmomoでWebRTCで送信するときにマイクの代わりに音声ファイルを使用する
以前この記事を書いたのですが、それの更新版です。
jetson nanoのリビジョンは以下の通り。
$ cat /etc/nv_tegra_release
# R32 (release), REVISION: 7.1, GCID: 29818004, BOARD: t210ref, EABI: aarch64, DATE: Sat Feb 19 17:05:08 UTC 2022
今回使用したmomoのバージョンは以下の通り。
$ ./momo --version
nvbuf_utils: Could not get EGL display connection
WebRTC Native Client Momo 2022.2.0 (e8243cba)
WebRTC: Shiguredo-Build M102.5005@{#1} (102.5005.1.0 ba846916)
Environment: [aarch64] Ubuntu 18.04.6 LTS (nvidia-l4t-core 32.7.1-20220219090432)
USE_MMAL_ENCODER=0
USE_JETSON_ENCODER=1
USE_NVCODEC_ENCODER=0
USE_SDL2=1
現在のjetson nano用のmomoはオーディオにALSAでなくpulse audioを使うようになっています。
pulseaudioのデフォルトのサンプルレートを48000Hzに変更する
$ pactl info
Server String: /run/user/1000/pulse/native
Library Protocol Version: 32
Server Protocol Version: 32
Is Local: yes
Client Index: 2
Tile Size: 65472
User Name: koba
Host Name: koba-jet2g
Server Name: pulseaudio
Server Version: 11.1
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-sound.analog-stereo
Default Source: alsa_input.platform-sound.analog-stereo
Cookie: a854:70a2
Default Sample Specification: s16le 2ch 44100Hz
となっています。
momoで扱うオーディオはs16le 2ch 48000Hz
なので、これを修正します。
その方法は以下のページで見つけました。
/etc/pulse/daemon.conf
をバックアップをとってから編集します。
$ sudo cp /etc/pulse/daemon.conf{,.org}
$ sudo vi /etc/pulse/daemon.conf
$ diff -u /etc/pulse/daemon.conf.org /etc/pulse/daemon.conf
--- /etc/pulse/daemon.conf.org 2022-05-13 12:45:54.298884690 +0900
+++ /etc/pulse/daemon.conf 2022-05-13 12:46:45.791764100 +0900
@@ -77,6 +77,7 @@
; default-sample-format = s16le
; default-sample-rate = 44100
+default-sample-rate = 48000
; alternate-sample-rate = 48000
; default-sample-channels = 2
; default-channel-map = front-left,front-right
pulseaudioのデーモンを終了させると自動で再起動します。
$ pulseaudio -k
$ pactl info
Server String: /run/user/1000/pulse/native
Library Protocol Version: 32
Server Protocol Version: 32
Is Local: yes
Client Index: 2
Tile Size: 65472
User Name: koba
Host Name: koba-jet2g
Server Name: pulseaudio
Server Version: 11.1
Default Sample Specification: s16le 2ch 48000Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.platform-sound.analog-stereo
Default Source: alsa_input.platform-sound.analog-stereo
Cookie: 0ef3:5da6
デフォルトのサンプリングレートが48000Hzに変わりました。
pactl info がエラーになるとき
$ pactl info
xcb_connection_has_error() returned true
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
このようになったときは、pulseaudioのデーモンが動いていませんでした。
以下の方法でpulseaudioのデーモンを起動してから再度試したらうまくいきました。
$ pulseaudio --start
$ ps ax |grep [a]udio
8135 ? Sl 0:01 pulseaudio --start
ALSAのオーディオループバックのカーネルモジュールをロードする
以前の記事とは違い、最近のjetson nanoのリリースではsnd-aloopが含まれているので、自分でビルドする必要がなくなりました。
$ sudo modprobe snd-aloop
起動時に自動的にロードするには以下のようにします。
$ sudo sh -c "echo snd_aloop >> /etc/modules"
Loopback ができていることの確認
$ arecord -L |grep Loopback
...
hw:CARD=Loopback,DEV=0
Loopback, Loopback PCM
hw:CARD=Loopback,DEV=1
Loopback, Loopback PCM
plughw:CARD=Loopback,DEV=0
Loopback, Loopback PCM
plughw:CARD=Loopback,DEV=1
Loopback, Loopback PCM
pulseaudioのデフォルトのsourceをループバックに変更
$ pactl list sources |grep Name
Name: alsa_input.usb-GG-210226_Depstech_webcam_MIC_01.00.00-02.analog-stereo
Name: alsa_output.platform-sound.analog-stereo.monitor
Name: alsa_input.platform-sound.analog-stereo
Name: alsa_output.platform-snd_aloop.0.analog-stereo.monitor
Name: alsa_input.platform-snd_aloop.0.analog-stereo
$ pactl set-default-source alsa_input.platform-snd_aloop.0.analog-stereo
音声ファイルを流し込む
-vv オプションをつけるとVUメータが表示される。
$ aplay -D hw:Loopback,1 -vv sample.wav
defaultのオーディオキャプチャデバイスに音がきていることの確認
上記のコマンドを実行したままで、別のターミナルを開いて
$ arecord -D default -vv -f dat > /dev/null
これでVUメータが振れていればOK。^C で止める。
動作確認
音楽を再生するときには、会話用のオーディオフィルタを全て無効にします。
--disable-echo-cancellation --disable-auto-gain-control --disable-noise-suppression --disable-highpass-filter
$ ./momo --disable-echo-cancellation --disable-auto-gain-control --disable-noise-suppression --disable-highpass-filter test
複数のwavファイルを順番に繰り返して流す場合のスクリプト
#!/bin/sh
TEST_SOUND_DIR=~/wav/
while :; do
for i in $TEST_SOUND_DIR/*.wav; do
aplay -D hw:Loopback,1 "$i"
done
done
ブラウザのステレオ音声の対応状況
momoからはステレオで送信しているのですが、Chrome, Safariで受信するとモノラルになってしまいます。Firefoxだけがステレオで受信できます。
私かが確認したバージョンは以下の通り。
いずれもMacで
Chrome: バージョン: 101.0.4951.64(Official Build) (x86_64)
Safari: バージョン15.4 (17613.1.17.1.13)
Firefox: 100.0 (64 ビット)
ステレオのテスト音声ファイルとしては以下のサイトのものを使用しました。
古い関連記事
ラズパイ+momoでWebRTCで送信するときにマイクの代わりに音声ファイルを使用する
ラズパイのmomoでステレオ音声でWebRTCで配信する
Discussion