AndroidスマートフォンをLinuxデスクトップのスピーカーにしてビデオ会議中に離席しても話に付いていけるようにする

以下の記事で「AudioRelay」というアプリを知りました．

Web会議中に席を外す、音声だけでもスマホで聞きたいときに使うアプリ「AudioRelay」 – ケータイ Watch

Stream your PC audio to your phone – AudioRelay

ちょっと飲み物を取ってくるとかいうときなどに便利そう．
しかしこれはWindowsからAndroidへ転送するもので他の環境では動作しません．Linuxでも動作するものを探してみました．

AudioRelay Alternatives for Linux | AlternativeTo

「SoundWire」

SoundWireはWindow若しくはLinux x64_64(64bit)/x86(32bit)，Raspberry Pi OSからAndroidへオーディオを転送してくれるようです．

GeorgieLabs

SoundWire (free) – Google Play のアプリ

SoundWire – Google Play のアプリ

バイナリが配布されているので対応するそれを入手して展開，実行してAndroidアプリから接続すればオーディオが転送されます．デスクトップファイルやアイコンも同梱されているので必要に応じて登録すると便利そうです．

$ tar tvf SoundWire_Server_linux64.tar.gz (1)
drwxrwxrwx Georgie/None 0 2020-01-26 21:22 SoundWireServer/
-rwxrwxrwx Georgie/None 2913 2020-01-16 09:00 SoundWireServer/INSTALL.txt
-rwxrwxrwx Georgie/None 1393 2020-01-16 08:46 SoundWireServer/license.txt
-rwxrwxrwx Georgie/None 2235 2014-09-16 09:08 SoundWireServer/opus_license.txt
-rwxrwxrwx Georgie/None 1583 2014-09-16 09:09 SoundWireServer/readerwriterqueue_license.txt
-rwxrwxrwx Georgie/None 6915 2020-01-26 21:22 SoundWireServer/README.txt
-rwxrwxrwx Georgie/None 448 2019-12-31 11:00 SoundWireServer/SoundWire-Server.desktop
-rwxrwxrwx Georgie/None 1611672 2020-01-16 11:55 SoundWireServer/SoundWireServer
-rwxrwxrwx Georgie/None 237351 2012-11-22 17:28 SoundWireServer/sw-icon.xpm
$ tar xf SoundWire_Server_linux64.tar.gz (2)
$ clamscan SoundWireServer/SoundWireServer (3)
$ ha512sum SoundWireServer/SoundWireServer
a0c1da0afad9e94aef82e19b2555ccf33494ec56fdbd6193a838beae31cec58ca75cae1949f520db84c6793bab13c9c3283b519416bebb1c54bbd66b5c489676 SoundWireServer/SoundWireServer
$ SoundWireServer/SoundWireServer (4)

アーカイブの確認

アーカイブの展開

念の為手動でもウィルス確認

実行

ソースは公開されていないようです．

ファイアウォールを利用している場合は，UDP:59010, 59011 を開放する必要があるようです．(起動オプションや環境変数でカスタマイズ可能)
その他， -nogui オプションでX無しでも動作します．

「WifiAudio」

「WifiAudio」はWindows若しくはLinux x86_64(64bit)からAndroidへオーディオを転送してくれるようです．

Home | WiFiAudio – Use Android Device as Wireless speaker for Windows/Linux

wireless speaker for android – Google Play のアプリ

PC側は以下のページでバイナリが配布されているのですが，ダウンロードするにはフォーラムに登録が必要のようです．登録には氏名，メールアドレス，生年月日などを求められます．

Wifiaudio Support and Links to Download PC application | WiFiAudio – Use Android Device as Wireless speaker for Windows/Linux

$ clamscan ./wifiaudio_linux (1)
$ sha512sum ./wifiaudio_linux
6c78f47066ad550b988468c74e9bd56e099393a61a11ffffeda31fc181c60cbd5209763e80da9000d6453fef5cc829b9329b26d46993cc3f00c0bb76ffc81864 ./wifiaudio_linux
$ chmod u+x ./wifiaudio_linux (2)
$ ./wifiaudio_linux (3)

念の為手動でもウィルス確認

実行権付与

実行

$ lsof -i | grep wifiaudio
wifiaudio 1818239 matoken 12u IPv4 15191466 0t0 UDP *:32000

利用ポートを確認すると UDP:32000 のようなのでファイアウォールを利用している場合は開放しておきます．

「ffmpegとVLC」

クローズドソースのものしか見当たらないなということで例によってffmpegで試してみます．
アプリケーションの音声をキャプチャしてmp3形式でスマートフォンのipアドレスに配信します．

$ pactl list short sources (1)
0 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz RUNNING
1 alsa_input.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 48000Hz RUNNING
2 alsa_input.pci-0000_00_1b.0.analog-stereo.echo-cancel module-echo-cancel.c float32le 1ch 32000Hz RUNNING
3 alsa_output.pci-0000_00_1b.0.analog-stereo.echo-cancel.monitor module-echo-cancel.c float32le 1ch 32000Hz RUNNING
4 alsa_input.hw_Loopback_1_0 module-alsa-source.c s16le 1ch 16000Hz RUNNING
$ ffmpeg -f pulse -i alsa_output.pci-0000_00_1b.0.analog-stereo.monitor -ac 2 -acodec libmp3lame -f rtp rtp://10.42.0.90:1234/ (2)

PulseAudioのデバイスを確認

ffmpegでAndroidのIPに対してmp3形式で配信

この状態でVLC等で rtp://@:1234 を再生するとLinuxDesktopの音が流れてきます．

VLC for Android – Google Play のアプリ

ffmpegのオプションについてはこのあたりを．

Capture/PulseAudio – FFmpeg

Capture/ALSA – FFmpeg

StreamingGuide – FFmpeg

AndroidでmDNSが使えればいいのですが，使えなさそうなのでIPアドレスを確認するのがちょっとめんどうですね．固定IPにしたりマルチキャスト配信してしまってもいいかもしれません．

とりあえずはarpでごまかしてみました．

#!/bin/bash

MONITOR=`pactl list short sources | grep analog-stereo.monitor | cut -f2 -d' '`
PHONE_MAC=18:d6:1c:00:00:00
PHONE_IP=`arp -i wlp3s0 | grep ${PHONE_MAC} | cut -f1 -d' '`
PORT=1234

ffmpeg -f pulse -i ${MONITOR} -acodec libmp3lame -ar 22050 -f rtp rtp://${PHONE_IP}:${PORT}/

「ffmpegとicecast2」

Wi-Fiの届く自宅内であればこれまでのものでいいですが，長丁場でご飯買いにコンビニまで行ってこようというような時には使えません．

外のサーバーに投げてストリーミングしてみます．今回はicecast2を利用しています．

$ ffmpeg -f pulse -i alsa_output.platform-snd_aloop.0.analog-stereo.monitor -loglevel 31 -stats -f adts -content_type audio/aac icecast://$USER:PASS@example.com:8000/stream

Androidでicecast2のurlを開くとLinuxデスクトップの音が聞こえてきます :)
ffmpegの部分をOBS StudioにするとGUIなのでとっつきやすいかもしれませんね．

帯域が気になる場合はビットレートを落とすといいと思います．このままだと128kbps程ですが， -ar 22050 として 64kbps， -ar 11025 をつけると32kbpsになります．
32kbpsはちょっと音が悪い感じなので，64kbps以上は欲しいかな?

icecast2などはこのあたりでも

webapp:icecast2 [wiki.matoken.org]

YoutubeLiveを細い回線で「聴く」 | edocr

ちなみに，VPSなどのサウンドカードのない計算機の場合以下のようにダミーデバイスを読み込むことで同じことが出来て便利です．
帯域が細かったりPCのスペックが足りないけど音声だけでも聞きたいといったときなどに使えます．

$ sudo modprobe -v snd-dummy
insmod /lib/modules/4.19.0-14-amd64/kernel/sound/drivers/snd-dummy.ko

終わりに

SoundWireとWifiAudioではLinuxではSoundWireの方がいいかなという感じです．しかしffmpeg+VLCでいいのではという感じも．
PC側の操作ですが，ボリュームは反映されず音量0でも配信されますが，ミュートすると聞こえなくなるので注意が必要です．
再生デバイスに迷った場合は pavucontrol などで Recordicg タブでプルダウンメニューからデバイスを順番に試していくといいと思います．音は出るけどノイズが多い場合はスピーカーからの音を拾っているマイクデバイスを選んで要る可能性があります．

そして現在自宅のWi-Fiは去年の台風時に壊れてNotePCをAPにしていて部屋を出ると電波が届かず実際は家の中ではどれも使えないという問題が．家を出て少し行くとmobile回線使えるんですけどね……．

環境

PC環境

$ SoundWireServer/SoundWireServer -nogui
:
SoundWire Server v3.0
:

$ dpkg-query -W ffmpeg lsof
ffmpeg 7:4.3.1-8
lsof 4.93.2+dfsg-1.1
$ lsb_release -dr
Description: Debian GNU/Linux bullseye/sid
Release: unstable
$ uname -m
x86_64

Android環境

SoundWire (free)

Version 3.0

WiFiAudio

Version 2.0

VLC

Version 3.3.4

本体

Rakuten mini(C330)

Android

9(セキュリティ アップデート:2020年12月5日)