sound_splitでは、実行結果を表示するのにディスプレイが、再生するのにスピーカーが必要です。 しかし、GPUを手軽に試すことのできるAmazon EC2やGoogle Compute Engine(GCE)などのサーバーシステムでは、sshで接続するだけでディスプレイやスピーカーがありません。こういったサーバーで実行して、結果だけ手元のホストで表示/再生する方法を紹介します。 ここでは、手元のホストがLinux/macであることを想定しています。Windowsであっても、同様のアイデアで共有できます。
まず、GUI表示を見るためにリモートディスプレイ環境を構築します。ここではTightVNC Serverを使用します。
$ sudo apt install xfce4 xfce4-goodies
$ sudo apt install tightvncserver
デスクトップ環境に、軽量のxfceを使います。
リモートに、仮想ディスプレイを立ち上げます。(1920x1200は適宜自分のディスプレイにあったサイズに変更してください)
$ vncserver -geometry 1920x1200
初回は、接続に必要となるパスワードの設定があります。接続できると、仮想ディスプレイ番号が与えられ表示されます。 いくつもディスプレイは作成でき、接続する待ち受けポートが異なります。 デフォルトでは、:1ディスプレイはport 5901、:2ディスプレイはport 5902というふうに割り当てられています。 待ち受けが必要でなくなった場合は、以下のコマンドで仮想ディスプレイを削除できます。
$ vncserver -kill :1
ここで:1は削除したい仮想ディスプレイ番号を与えます。
次に、待ち受けポートのポート転送の設定を行います。 ファイアウォールに穴を空けて直接接続してもよいのですが、セキュリティ上パスワードの管理をしっかりしないと危険になります。 そのため、sshのポートフォワード機能によりリモートのポートをローカルに振り替えます。
$ ssh user@lithium03.info -L 5901:127.0.0.1:5901
ssh接続をする際に、-Lオプションを与えることでポートフォワードすることができます(サーバーで許可されている場合)。 この場合、ssh接続を開始するローカルホストの5901番ポートに接続をかけると、あたかもリモートサーバーから見た127.0.0.1:5901に接続をかけたのと同様の効果が得られます。
vncserverの:1ディスプレイは、リモートのport 5901で待ち受けしています。このポートフォワードを行った上で、ローカルのport 5901にVNC接続を行うことでssh接続の安全性と同等のセキュリティでVNC接続できます。
次にスピーカーを転送します。ここではPulseAudioのtcp接続による再生を利用します。
先程と同様に、今度は逆方向にポートフォワードをします。
$ ssh user@lithium03.info -R 4713:127.0.0.1:4713
ssh接続をする際に、-Rオプションを与えることで先程とは逆に、ssh接続先のプロセスがリモートホストの4713番ポートに接続をかけると、あたかもローカルホストから見た127.0.0.1:4713に接続をかけたのと同様の効果が得られます。
ここで、リモートサーバーで音声出力をするPulseAudioの出力先をtcpの127.0.0.1:4713とした上で、ローカルホストでPulseAudioサーバーを立ててtcp待ち受けを許可しておくと、リモートで実行したプロセスが音声出力をしようとした際に、ローカルのスピーカーを鳴らすことができます。
macの場合
$ brew install pulseaudio
linuxの場合
$ sudo apt install pulseaudio
windowsの場合は、バイナリが用意されているので公式サイトからダウンロードして利用します。 https://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Support/
インストールできたら、/etc/pulse/default.pa を~/.config/pulse/にコピーして、コメントアウトされているload-module module-native-protocol-tcpの行を編集します。 もしくは直接default.paを編集します。
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
設定が終わったら、PulseAudioを再起動します。
$ sudo pulseaudio -k
$ sudo pulseaudio --start
サービスとして動かしていない場合は、フォアグラウンドで動かしてもよいでしょう。
$ pulseaudio&
リモートホストでもpulseaudioの設定が必要です。sound_splitをコンパイルする際に依存関係で既にインストールされているはずです。
プログラムを起動する前にシェルで環境変数を設定してから起動すると、音声出力先を容易に切り替えることができます。
$ export PULSE_SERVER=tcp:127.0.0.1:4713
$ ./sound_split input.wav
ここまでの設定が済めば、画面と音を同時に転送することができます。ssh接続の際に、以下のように両方のポートフォワードを設定します。
$ ssh user@lithium03.info -L 5901:127.0.0.1:5901 -R 4713:127.0.0.1:4713
あとはそれぞれの接続の手順を両方行った上で、VNC接続上のシェルからsound_splitを実行することで、ローカルで画面と音を両方得ることができます。