この記事ではWSL2のUbunutuで音を出す方法を説明する。WSL2では現状、PCのサウンドデバイスを直接扱えない。/devにサウンドデバイスが認識されていない。そのためWSL2のUbuntuだけでは音を出すことはできない。いろいろ調べた結果、以下の参考サイトが一番わかりやすかった。この記事はそれの意訳とささやかな説明を加えたもの。
参考サイト
環境
- Windows10 バージョン2004
- WSL2
- Ubuntu 18.04.5
手法の概要
- Linuxで良く使われるクロスプラットフォームのサウンドサーバー。WSLのUbuntuでサウンドデバイスにアクセスできないので、PulseAudioクライアントからTCPでデータをWindowsのPulseAudioサーバーへ送りPCからサウンドを奏でる。
インストール
- Windowsでの作業
- Cドライブ直下にWSLというフォルダを作成する。
- ビルド済みのWindows用PulseAudioを次のサイトから上で作成したWSLフォルダにダウンロードする。
- ダウンロードしたファイルを解凍する。以下の2つのファイルを変更する。
- C:\WSL\pulseaudio-1.1\etc\pulse\default.paの61行目
- 変更前
#load-module module-native-protocol-tcp
- 変更後
load-module module-native-protocol-tcp auth-anonymous=1
- 変更前
- c:\WSL\pulseaudio-1.1\etc\pulse\daemon.confの39行目
- 変更前
; exit-idle-time = 20
- 変更後
exit-idle-time = -1
- 変更前
- C:\WSL\pulseaudio-1.1\etc\pulse\default.paの61行目
- エクスプローラーで以下のファイルをダブルクリックしてPulseAudioサーバーを起動する。
- C:\WSL\pulseaudio-1.1\bin\pulseaudio.exe
- 以下のようなウインドウが表示される。一番下の行に “daemon/main.c: Failed to load directory.”と表示されるが問題ない。
- Windows Defender ファイアウォールでアプリを許可
- アプリpulseaudioに通信の許可を与える。これをしないとWSLとWindows間で通信できない。方法については以下のリンクを参照。
- Ubuntuでの作業
- Pulseaudioのコマンドラインツールをインストールする。
$ sudo apt install pulseaudio-utils
- WindowsのPulseaudioサーバーを使うための設定。~/.bashrcに以下の1行を追加する。
$ export PULSE_SERVER=tcp:$(grep nameserver /etc/resolv.conf | awk '{print $2}');
- Pulseaudioサーバーと通信できるか次のコマンドで確認する。
$ source ~/.bashrc
$ nc -vz $(grep nameserver /etc/resolv.conf | awk '{print $2}') 4713
- 成功すると次のように表示される。
- nc: connection to 4713 port [tcp/*] succeeded!
- Pulseaudioのコマンドラインツールをインストールする。
実 行
- Windowsでの作業
- Ubunutでの作業
- これで音がなるはず。ウェブブラウザchromeを開きYoutubeで素敵な音楽でも聴いてみよう!
終わり
コメント
割と新しくて安定している pulseaudio 6.0 on windows が以下にあります。
https://github.com/kitor/wsl/raw/master/pulse6.zip
普通に上の設定をしてPATHを通し .profile に以下を仕込めば、余分な窓も開かず起動します。
if [ $(tasklist.exe | grep -c [p]ulseaudio) = 1 ] ; then
taskkill.exe /F /IM pulseaudio.exe 2> /dev/null > /dev/null
fi
export PULSE_SERVER=tcp:$HOSTNAME.mshome.net
pulseaudio.exe -D &
XOPT=”-clipboard -noprimary -nowgl -dpi auto”
XKBD=”-xkblayout jp -xkbmodel jp106″
XMODE=”-multiwindow”
if [ $(tasklist.exe | grep -c [v]cxsrv) = 0 ] ; then
vcxsrv.exe :0 $XOPT $XKBD $XMODE 2> /dev/null > /dev/null &
fi
export DISPLAY=$HOSTNAME.mshome.net:0
xauth.exe -f ~/.Xauthority generate $DISPLAY . trusted timeout 0
xrdb -merge ~/.Xdefaults
VcXsrv側の xauth.exe を用いてWSL2側のHOMEに .Xauthority を直接作るのが肝です。
Pulseaudio 6.0 on windowsの情報ありがとうございます!