Windows Subsystem for Linux (WSL)は、Windows上でLinuxのバイナリ実行ファイルを直接実行できる強力な機能です。しかし、WSLでは音声の再生が直接サポートされていないため、外部ソフトウェアを使用してこの機能を実現する必要があります。この記事では、PulseAudioを使用してWSLで音声を再生する方法をステップバイステップで説明します。
こちらの記事もおすすめ
デモ動画
WSLでPulseAudioを使用して音を出してみた!
次はDockerとの連携! https://t.co/YmFWTGRJ1L pic.twitter.com/iQ02nXUTVL— Maki@Sunwood AI Labs. (@hAru_mAki_ch) March 4, 2024
## **Windowsの準備**
まず、Windows側でPulseAudioサーバーを設定する必要があります。以下の手順に従って設定してください。
1. **PulseAudioのダウンロード** : [PulseAudioの公式サイト](https://www.freedesktop.org/wiki/Software/PulseAudio/Ports/Windows/Support/) から「zipfile containing preview binaries」をダウンロードし、適切な場所に解凍します。
![file](https://hamaruki.com/wp-content/uploads/2024/03/image-1709536767510.png)
2. **環境変数の設定** : 解凍したフォルダ内のbin
ディレクトリをシステムの環境変数PATHに追加します。
![file](https://hamaruki.com/wp-content/uploads/2024/03/image-1709536947156.png)
3. **設定ファイルの編集** : 解凍したフォルダ内のetc\pulse\default.pa
ファイルに以下の行を追記します。
```lua
load-module module-waveout sink_name=output source_name=input record=0
load-module module-native-protocol-tcp auth-anonymous=1
```
4. **デーモン設定の変更** : 同じくetc\pulse\daemon.conf
ファイルにexit-idle-time = -1
を追記します。これにより、PulseAudioサーバーがアイドル状態で自動的に終了するのを防ぎます。
## **WSLの準備**
次に、WSL側でPulseAudioクライアントを設定します。
1. **PulseAudioのインストール** : WSLのターミナルを開き、以下のコマンドを実行してPulseAudioをインストールします。
```sql
sudo apt update
sudo apt install pulseaudio
sudo apt -y install ffmpeg
```
2. **クライアント設定の変更** : /etc/pulse/client.conf
ファイルを編集し、以下の行を追記します。
```arduino
default-server = tcp:localhost
```
3. **デフォルト設定の変更** : /etc/pulse/default.pa
ファイルを開き、load-module module-native-protocol-tcp
行を確認または追記します。
## **音声の再生**
設定が完了したら、音声を再生してみましょう。
### **Windows側の操作**
コマンドプロンプトを開き、pulseaudio
コマンドを実行します。エラーメッセージが表示されるかもしれませんが、これは通常、無視して構いません。
```bash
C:\Users\MakiMaki>pulseaudio
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
```
### **WSL側の操作**
1. 新しいWSLのターミナルを開き、sudo pulseaudio --system
を実行します。こちらもいくつかの警告メッセージが表示されますが、問題ありません。
```bash
maki@TurtleTower:~$ sudo pulseaudio --system
W: [pulseaudio] main.c: Running in system mode, but --disallow-exit not set.
W: [pulseaudio] main.c: Running in system mode, but --disallow-module-loading not set.
N: [pulseaudio] main.c: Running in system mode, forcibly disabling SHM mode.
N: [pulseaudio] main.c: Running in system mode, forcibly disabling exit idle time.
W: [pulseaudio] main.c: Home directory of user 'pulse' is not '/var/run/pulse', ignoring.
W: [pulseaudio] main.c: OK, so you are running PA in system mode. Please make sure that you actually do want to do that.
W: [pulseaudio] main.c: Please read http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system mode is usually a bad idea.
W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/var/run/pulse/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to open cookie file '/var/run/pulse/.pulse-cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/var/run/pulse/.pulse-cookie': No such file or directory
W: [pulseaudio] cli-command.c: stat('/etc/pulse/system.pa.d'): No such file or directory
```
2. 音声ファイルをWSL上に用意し、ffplay audio.wav
のようにして再生します。
```bash
maki@TurtleTower:~/audio$ ffplay audio.wav
ffplay version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2003-2021 the FFmpeg developers
built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100
Input #0, wav, from 'audio.wav': 0KB vq= 0KB sq= 0B f=0/0
Duration: 00:00:04.06, bitrate: 705 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, s16, 705 kb/s
^CSegmentation faultfd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0
```
![file](https://hamaruki.com/wp-content/uploads/2024/03/image-1709536663622.png)
これで、WSL上で音声ファイルが正常に再生されれば成功です。この方法を利用すれば、WSLでの開発作業中にも音声に関連するテストやアプリケーションの利用が可能になります。
## 参考サイト
コメント