Open4

SSHとPulseAudioを使用してLinuxからWindowsに音声をストリームする

hrkohrko

PulseAudioとは

簡単に言えば Linux のオーディオミキサー。Linux デスクトップを触ったことがあれば聞いたことのある名前だと思う。アプリケーションとオーディオデバイス間に挟まっているデーモンで、主に複数のアプリケーションの音をミキシングする役割を担っている。

PulseAudio のネットワーク機能

実は、PulseAudio にはネットワーク経由でオーディオデバイスを共有する機能がついている。

例えば、Linux マシン A と Linux マシン B があったとして、マシン A のアプリケーションで再生する音を、マシン B のオーディオデバイスで流したいとする。その場合は、それぞれのマシンの /etc/pulse/default.pa に以下の記述を追加すれば実現できる。

マシン A の /etc/pulse/default.pa:

load-module module-tunnel-sink server=tcp:<マシン B の IP アドレス>:4713

マシン B の /etc/pulse/default.pa:

load-module module-native-protocol-tcp auth-anonymous=1

設定後、PulseAudio を再起動すれば、マシン A のオーディオデバイス選択画面に、マシン B のオーディオデバイスも表示されるようになる。

(上記では後述の設定に合わせて IP アドレスを直打ちしているが、同一サブネット内のマシン同士であれば mDNS を使って自動設定する方法もある。)

hrkohrko

Windows 版 PulseAudio

PulseAudio は Linux 用のオーディオサーバーだが Windows にも移植されている。ただし、Windows における PulseAudio は他のアプリケーション(ブラウザ, 音楽プレイヤー等)と同列であり、オーディオサーバーの役割は担わない点は留意したい。

では Windows 版の PulseAudio は何の役に立つのかというと、もうお分かりだろうが、Linux で実行しているアプリケーションの音を Windows マシンで再生したいときに役に立つ。

ダウンロード

古めの記事だとここからダウンロードできる PulseAudio を使っている例が多いが、バージョンが 1.1 とあまりにも古いので使う気になれない。

ありがたいことに、現在ではインストーラー付きの別のビルドが存在するので、こちらを使わせてもらうことにする。Full installer を使うと、PulseAudio の自動起動や、ネットワーク共有の設定を行ってくれるのでおすすめ。

https://pgaskin.net/pulseaudio-win32/

インストール

インストールするコンポーネントは特に変える必要はないだろう。

今回は SSH ポートフォワーディング経由でネットワーク共有するのが目的なので、ローカルホスト以外から PulseAudio にアクセスできる必要はない。したがって「Deny external connectons」を選択する。(もし LAN 内の Linux マシンとネットワーク共有したければ他の選択肢を選ぶ)

これで自動起動の設定や、load-module module-native-protocol-tcp auth-anonymous=1 に相当する設定が行われた。

hrkohrko

SSH 経由で Linux から Windows に音声をストリームする

まずは、リモートポート転送する必要がある。
いつもの ssh コマンドに以下のオプションを付け足せば良い:

-R 14713:localhost:4713

例えば、

> ssh -R 14713:localhost:4713 user@example.com

のようにする。

次に、Linux 上のPulsuAudio に module-tunnel-sink モジュールをロードする。

$ pactl load-module module-tunnel-sink server=tcp:127.0.0.1:14713

これで、Linux 側のオーディオ出力先一覧に Windows マシンが現れるはずである。あとは Linux 側のオーディオ出力先を Windows マシンに指定して、任意の Linux アプリケーションで音を流せば、Windows のスピーカーから音が流れるのが確認できる。

hrkohrko

余談

今後の Linux デスクトップでは PulseAudio から PipeWire に置き換わっていく流れなので、今後もこの方法が通用するか若干心配だったが、どうやら以下のモジュールを使えば PipeWire から PulseAudio に接続することができるようだ。

https://docs.pipewire.org/page_module_pulse_tunnel.html