Orange Pi Zero 3やESP32 S3カメラ等から成る自作テレビドアホンの通話にLAN内にサーバを置いたローカル環境なボイスチャット|VoIPアプリMumbleを採用してみた話。
専用に作ったタッチモニター付き親機の他、スマホやPCなども参加させれば、通常は宅内通話、ドアホン子機ボタンが押された場合は、応答(今回の実装では自作PTT)ボタンを押せば、何れのデバイスでも子機と通話できる感じ。
復数デバイスで、また何台運用できるかは、ハウリング対策ができるか次第となるでしょう。
Mumble、DiscordやTeamSpeakのような高品質・低遅延なVoIP・ボイスチャットアプリ。
そんなボイチャアプリMumbleは、クラウド不要、ローカル完結、CLI実装できるし、実装しやすく、今回のドアホンシステムにも組み込みやすそうだったから。
GUIが不要なら、今回もそうしていますが、Xvfb(xvfb-run)等と併用すればOK。
今回、ドアホン親機のSBCは、Orange Pi Zero 3 RAM4GB、マイクはUSB、スピーカーは拡張ボードを使用しつつ、3.5mmフォーンプラグ&USBスピーカーという中、Pulseaudio/ALSAにおいてdefault設定すべく、(aplay/arecordなど再生・音声入力・録音においてオプション未設定で録音・再生できる(任意のアプリでスピーカー/マイクとして機能する)よう調整。
今回は、ホームディレクトリの.asoundrcファイル(なければ作成)に、それぞれ、type及びaplay -l、arecord -lなどで調べたCARD番号を設定し、こんな風にpcm(スピーカー)とctl(マイク)を設定。
ちなみにBluetoothスピーカーを使う場合、こんな感じ。
ただ、なぜか、Bluetoothスピーカーを試した際は、-fオプションを使わないとダメで苦肉の策を講じたのですが、.profileだからでしょう、これだとCLI環境では効きますが、GUI環境だとマイクやスピーカーなどを別途指定できるAudacityなどでしか録音・再生できませんでした。
だからと言って.xinitrcならいけるとかいう問題なのかどうか。
よってBluetoothスピーカーに関しては、これだけでは片手落ちで追加で何らかの対策が必要ですが。
Mumbleの実装については、mumble再考でも触れていますが、以下のようにとても簡単です。
ここでは、ドアホン親機・子機共にそれぞれ使用のSBC Orange Pi Zero 3の他、AndroidスマホにMumbleクライアントMumla、ラズパイ400パソコン、DebianノートPCにMumbleをインストール・使用し、ドアホン親機は、専用機とします。
Androidスマホについては、F-DroidやGoogle Play、もしくは、他のアプリストアからMumlaをインストールします。
他は、全てDebian系を使っている自身の場合、aptでmumbleをインストール。
ドアホン親機用Orange Pi Zero 3には、mumbleのみならず、mumble-serverもインストール。
ドアホン親機用のOpi Zero 3のmumble-server(murmur/murmurd)については、/etc/mumble-server.iniで必要ならmumbleサーバを適宜設定、dpkg-reconfigure mumble-serverを実行(するとsystemctl start|enable mumble-serverしたことになり)、自動起動の設定を行うだけ。
ただ、今回のドアホン親機のようにMumbleサーバ&クライアント併用の場合、自動起動前にsystemctl restart mumble-server.serviceしておかないとIPv6接続はできてもIPv4接続できない状態になるかもしれません。
ドアホン子機用Opi Zero 3、ラズパイ400、Debianノートには、mumbleをインストール。
尚、ドアホン子機用Opi Zero 3については、追加で仮想デスクトップ用のxvfbもインストールしておきます。
自動起動させるべく、~/.config/autostartディレクトリにこんな感じに適宜編集した設定ファイルを配置して再起動。
Mumbleクライアントとするドアホン子機用のOpi Zero 3やスマホ、パソコンについては、GUIでサーバ(mumble-server|murmur|murmurd)に接続、初回はポップアップされるガイドに沿って認証など設定、サーバ(チャネル)に接続するだけで、次回含む以降は、自動起動するので起動後は、常に通話が可能となります。
その後、Mumbleサーバ、Mumbleクライアント共に個別にオーディオ設定ウィザードで感度などマイクやスピーカーの入出力を設定しておきます。
尚、今回は、音声認識については、MumbleサーバはMumble内蔵のではなく、pythonで自前のPTT機能を使用、子機側のMumbleクライアントは、[声で有効化]で音声通信するので親機、子機共に[声で有効化]で設定しておきました。
運用にあたり、ドアホン子機については、ドアホンのコールボタンが押されたことを検知した際、ドアホン親機から子機のMumbleをバッグラウンドかつ、仮想モニタ(実質GUIなし)で起動させるべく、xvfb-runを使って起動、ドアホン親機の終了ボタンなりで同じく親機から子機へSSH経由でmumbleを、更にssh経由で仮想デスクトップで起動させた親機上のプロセスを終了させて切断。
xvfb-runは、apt系の場合、前述のようにxvfb|Xvfbパッケージをインストールすることで使用できます。
今回、xvfbの利用は、ドアホン子機用SBCのみにしていますが、以後設定・調整などが不要であれば、水平展開しても良いかもしれません。
尚、確認した限りにおいては、MumbleサーバやMumbleクライアントにおいて自動起動設定していれば再起動時でも、サスペンド含め、なんらかのネットワーク切断があっても再度接続した際には、滞りなく、それぞれ再接続されるので安心です。
また、スマホの場合、電話の発信・受信の際は、Mumble側に音が流れることもなく、通話できました。
自作ワイヤレスドアホンとの連携は、親機のOrange Pi Zero 3からpythonで。
ここでは復数デバイスにmumbleをと述べていますが、基本、インターネットを介して離れた場所で距離をとって会話できることを想定していると思われるボイチャアプリにおいて宅内で復数のデバイスからボイチャアプリに接続・会話しようとする場合、単一デバイスにおけるマイク・スピーカーもさることながら、デバイス間についても相応の距離をあけないとハウリングを回避しきれない可能性があるでしょう。
よってドアホンに流用する場合、ドアホン親機・子機各1台で、かつ、PTT採用、更には前述のように常時接続ではなく、必要都度接続&切断で運用するのが賢明ということもあるでしょう。