🌊

jetson nano とmomoでWebRTCで送信するときにマイクの代わりに音声ファイルを使用する

2022/05/13に公開

以前この記事を書いたのですが、それの更新版です。
https://qiita.com/tetsu_koba/items/f81b4fda5935d4f7ad63

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なので、これを修正します。
その方法は以下のページで見つけました。

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Audiophile/

/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 ビット)

ステレオのテスト音声ファイルとしては以下のサイトのものを使用しました。
http://www.aoakley.com/articles/2018-08-24-stereo-test.php

古い関連記事

ラズパイ+momoでWebRTCで送信するときにマイクの代わりに音声ファイルを使用する
ラズパイのmomoでステレオ音声でWebRTCで配信する

Discussion