WSL+DockerでPulseAudioを使用して音を出す方法

Linux

Windows Subsystem for Linux (WSL)とDockerを使用して、Linux環境で音声アプリケーションを動作させる方法を紹介します。この記事では、PulseAudioを利用して音を出す手順について、初心者にも分かりやすく解説していきます。Dockerのコンテナ内で音声アプリケーションを動かし、WSL上で音を出すことが可能になります。


こちらの記事もおすすめ

WSLでPulseAudioを使用して音を出す方法
Windows Subsystem for Linux (WSL)は、Windows上でLinuxのバイナリ実行ファイルを直接実行できる強力な機能です。しかし、WSLでは音声の再生が直接サポートされていないため、外部ソフトウェアを使用してこ...
Style-Bert-VITS2でずんだもんの声を学習させてみた(GoogleColabのノート付き)
近年、AI技術の進化は目覚ましく、その一環として音声合成技術も大きく前進しています。特に、話者の声質や話し方を模倣する技術は、エンターテイメントから教育まで幅広い分野での応用が期待されています。この記事では、Style-Bert-VITS2...

必要な準備

まずは、WSLとDockerがWindows上で正しく設定され、動作していることを確認してください。これらの環境が未設定の場合は、公式のドキュメントに従ってセットアップを行ってください。

Dockerfileの作成

音声アプリケーションを動作させるためには、適切な環境をDockerコンテナ内に構築する必要があります。以下は、必要なパッケージをインストールするためのDockerfileの例です。


FROM ubuntu:latest

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    pulseaudio \
    ffmpeg \
    alsa-utils \
    libsdl2-dev \
    && rm -rf /var/lib/apt/lists/*

このDockerfileは、Ubuntuをベースイメージとし、音声関連の操作に必要なpulseaudioffmpegalsa-utilslibsdl2-devパッケージをインストールします。

docker-compose.ymlの設定

次に、Docker Composeを使用して、アプリケーションを簡単に起動・管理できるようにします。以下は、docker-compose.ymlの設定例です。


version: '3.8'
services:
  audio_app:
    build: .
    environment:
      - PULSE_SERVER=/mnt/wslg/PulseServer
      - DISPLAY=$DISPLAY
      - WAYLAND_DISPLAY=$WAYLAND_DISPLAY
      - XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
    volumes:
      - .:/app
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /mnt/wslg:/mnt/wslg
    tty: true

この設定では、環境変数PULSE_SERVER/mnt/wslg/PulseServerに設定しています。これにより、Dockerコンテナ内のアプリケーションがWSLのPulseAudioサーバーを通じて音声を出力できるようになります。

environmentセクションの解説

  • PULSE_SERVER=/mnt/wslg/PulseServer:
    • PULSE_SERVER環境変数は、PulseAudioサーバーのアドレスを指定します。/mnt/wslg/PulseServerは、WSLgを利用している場合に、WSL2とWindows間でPulseAudioサーバーを共有するためのパスです。これにより、Dockerコンテナ内のアプリケーションがWSL経由でWindows側のオーディオデバイスにアクセスできるようになります。
  • DISPLAY=$DISPLAY:
    • DISPLAY環境変数は、Xサーバーのディスプレイ位置を指定します。この変数を設定することで、コンテナ内のGUIアプリケーションがホストのXサーバーに接続し、画面出力を行うことが可能になります。
  • WAYLAND_DISPLAY=$WAYLAND_DISPLAY:
    • WAYLAND_DISPLAY環境変数は、Waylandコンポジタのディスプレイ名を指定します。Waylandを使用している場合に、この変数を通じてGUIアプリケーションの画面出力をWaylandセッションにリダイレクトします。
  • XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR:
    • XDG_RUNTIME_DIRは、非永続的なランタイムデータ用のディレクトリを指定する環境変数です。これは、セッション固有の情報やランタイムデータ(ソケットファイルなど)の保存場所を示します。

volumesセクションの解説

  • .: /app:
    • 現在のディレクトリ(Docker Composeファイルが存在するディレクトリ)をコンテナの/appディレクトリにマウントします。これにより、ホスト側でのファイル変更がコンテナに即時反映され、開発の効率が向上します。
  • /tmp/.X11-unix:/tmp/.X11-unix:
    • ホストの/tmp/.X11-unixディレクトリをコンテナの同じパスにマウントします。これにより、コンテナ内のアプリケーションがホストのXサーバーにアクセスし、GUIを表示できるようになります。
  • /mnt/wslg:/mnt/wslg:
    • WSLgを使用している場合に、ホストの/mnt/wslgディレクトリ(WSL2とWindows間で共有されている特別なディレクトリ)をコンテナの同じパスにマウントします。これにより、WSLgを介したGUIやオーディオの出力が可能になります。

音声の録音と再生

コンテナ内で音声を録音し、再生するには、arecordffplayコマンドを使用します。以下のコマンドは、サンプルとして録音と再生の方法を示しています。


# 音声の録音
arecord -f S16_LE -r 44100 a.wav

# 録音した音声の再生
ffplay a.wav

まとめ

この記事では、WSLとDockerを使用して、PulseAudioを介して音声を出力する方法を紹介しました。Dockerfileとdocker-compose.ymlの設定を適切に行うことで、簡単に音声アプリケーションをWSL上で動作させることが可能です。音声関連の開発を行う際に、この方法が役立つでしょう。

参考サイト

Playing sound in Docker container on WSL in Windows 11
Newer versions of Windows (build 21364 or later) enable GUI support in WSL2, including full audio support. This is pretty amazing.Given that WSL2 now supports a...
WSL で Linux GUI アプリを実行する
WSL で Linux GUI アプリの実行がどのようにサポートされるかについて説明します。

コメント

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