🎵

WSL2上のDockerコンテナから音を再生する

2024/07/08に公開

これはなに

WSL2上のDockerコンテナ内から音を鳴らすときに必要な設定のメモ。

解決したい問題

何も設定せずにWSL2上のDockerコンテナ内から音を鳴らそうとすると、下記のようなエラーが発生する。

$ aplay /usr/share/sounds/alsa/Front_Center.wav
ALSA lib confmisc.c:855:(parse_card) cannot find card '0'
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_card_inum returned error: No such file or directory
ALSA lib confmisc.c:422:(snd_func_concat) error evaluating strings
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1334:(snd_func_refer) error evaluating name
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5703:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2666:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:831: audio open error: No such file or directory

ただし、再生するファイルは存在するものとする。

$ ls -a /usr/share/sounds/alsa/
.   Front_Center.wav  Front_Right.wav  Rear_Center.wav  Rear_Right.wav  Side_Right.wav
..  Front_Left.wav    Noise.wav        Rear_Left.wav    Side_Left.wav

結論 | 解決策

WSL2上のDockerコンテナ内から音を再生するのに必要な設定は下記3つである。

  1. Dockerコンテナにpulseaudioをインストールする
  2. Dockerコンテナで/mnt/wslg/をマウントする
  3. 環境変数PULSE_SERVERを設定する

Dockerfileの設定

Dockerfilepulseaudioをインストールする。
今回は音の再生にaplayを使うため、alsa-utilsもインストールする。

Dockerfile
FROM debian:bookworm-slim

ARG USERNAME=user

# `pulseaudio`をインストールする
# `aplay`のために`alsa-utils`もインストールしている
RUN apt-get update -y \
  && DEBIAN_FRONTEND=noninteractive \
  apt-get install -y --no-install-recommends \
  pulseaudio \
  alsa-utils \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

RUN useradd -m -s /bin/bash $USERNAME

WORKDIR /home/$USERNAME/workspace

USER $USERNAME

ENTRYPOINT ["/bin/bash"]

環境変数とボリュームの設定

Dockerコンテナを起動するときに環境変数PULSE_SERVERを設定する。
また、Dockerコンテナで/mnt/wslg/をマウントする。

docker run -it --rm -e PULSE_SERVER=${PULSE_SERVER} -v /mnt/wslg/:/mnt/wslg/ <image>

Docker composeを使う場合は、下記のように記述する。

compose.yaml
services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    volumes:
      - /mnt/wslg/:/mnt/wslg/
    environment:
      - PULSE_SERVER=${PULSE_SERVER}

上記の設定は、Dockerコンテナ内で音を再生したときに、WSL2のPulseAudioサーバーへアクセスできるようにするためのものである。こうすることで、WSL2上のDockerコンテナ内から音を再生すると、ホストPCから音が出るようになる。

音を鳴らしてみる

Dockerコンテナ内で音を再生してみる。下記コマンドで音が鳴るはずである。

aplay /usr/share/sounds/alsa/Front_Center.wav

おわりに

今回の検証コード一式をGitHubにアップロードしている。

参考文献・URL

Discussion