WSL2:PCから音を出す方法

この記事では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
    • エクスプローラーで以下のファイルをダブルクリックしてPulseAudioサーバーを起動する。
      • C:\WSL\pulseaudio-1.1\bin\pulseaudio.exe
    • 以下のようなウインドウが表示される。一番下の行に “daemon/main.c: Failed to load directory.”と表示されるが問題ない。
    • Windows Defender ファイアウォールでアプリを許可
  • 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!

実 行

  • Windowsでの作業
    • エクスプローラーで以下のファイルをダブルクリックしてPulseAudioサーバーを起動する。
      • C:\WSL\pulseaudio-1.1\bin\pulseaudio.exe
    • 以下のようなウインドウが表示される。
  • Ubunutでの作業
    • これで音がなるはず。ウェブブラウザchromeを開きYoutubeで素敵な音楽でも聴いてみよう!

終わり

コメント

  1. enaka より:

    割と新しくて安定している 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 を直接作るのが肝です。

タイトルとURLをコピーしました