piper-plusのDockerイメージでTTSのWebUIを提供する

初めに

今回は、piper-plusのDockerイメージを使って、ブラウザ上で操作できるGradio WebUIのTTS環境を構築します。

piper-plusはDockerイメージ群を提供しており、CLI推論・FastAPIサーバー・Gradio WebUIの3つの利用モードに対応しています。PIPER_MODEL 環境変数を指定するだけで、起動時にモデルが自動ダウンロードされるため、Dockerさえあれば他の環境構築は不要です。

github.com

開発環境

  • OS: Linux推奨(Docker Desktop経由でWindows/macOSも可)
  • Docker: 24.x以上
  • Docker Compose: v2
  • (オプション)NVIDIA GPU + nvidia-container-toolkit

GPU推論を使う場合は、ホストマシンにNVIDIA GPU用のドライバとnvidia-container-toolkitがインストールされている必要があります。CPU推論のみであれば不要です。

Dockerイメージの構成

piper-plusは用途別に4つのDockerイメージを提供しています。

イメージ 用途 説明
webui Gradio WebUI ブラウザ上でTTSを操作できるUI。CPUのみ
python-inference Python推論 CLI/FastAPIサーバー。CPU/GPU切替対応
python-train モデル学習 PyTorch Lightningベースの学習パイプライン
cpp-inference C++推論 軽量なC++バイナリによる推論

この記事では主にwebuiイメージの使い方を紹介します。

Gradio WebUIの起動

リポジトリのクローンとビルド

まず、piper-plusのリポジトリをクローンし、webuiイメージをビルドします。

git clone https://github.com/ayutaz/piper-plus.git
cd piper-plus
docker build -t piper-webui -f docker/webui/Dockerfile .

コンテナの起動(モデル自動ダウンロード)

PIPER_MODEL 環境変数にモデル名を指定すると、起動時にモデルが自動でダウンロードされます。ダウンロードされたモデルはボリュームマウントした models/ ディレクトリに保存され、2回目以降はキャッシュから読み込まれます。

mkdir -p models
docker run -it -p 7860:7860 -e PIPER_MODEL=css10 -v ./models:/models piper-webui

初回起動時のログ:

Checking model: css10
Downloading model: css10...
Model ready: /models/css10-ja-6lang-fp16.onnx
* Running on local URL:  http://0.0.0.0:7860

既にモデルがダウンロード済みの場合はダウンロードがスキップされ、即座にWebUIが起動します。

ブラウザでアクセス

コンテナが起動したら、ブラウザで以下のURLにアクセスします。

http://localhost:7860

Gradio WebUIが表示されます。画面には以下の要素があります。

  • テキスト入力欄: 合成したいテキストを入力
  • 言語選択: ja / en / zh / ko / es / fr / pt / sv から選択
  • モデル選択: マウントされたモデルから選択
  • パラメータ調整: 発話速度(length_scale)、ランダム性(noise_scale)、音素長ばらつき(noise_w)
  • 合成ボタン: クリックで音声合成を実行
  • 音声プレイヤー: 合成結果を再生・ダウンロード

手動でモデルを配置する場合

PIPER_MODEL を指定せずに、事前にダウンロードしたモデルをマウントすることもできます。

docker run -it -p 7860:7860 -v ./models:/models:ro piper-webui

models/ ディレクトリにはONNXモデルファイルとconfig.jsonを配置します。

models/
├── css10-ja-6lang-fp16.onnx
└── config.json

docker-composeによる起動

リポジトリにはdocker-compose.ymlが付属しています。

cd docker/webui

PIPER_MODEL 環境変数でダウンロードするモデルを指定して起動します。

PIPER_MODEL=css10 docker compose up

docker-compose.ymlの内容:

version: '3.8'

services:
  piper-webui:
    build:
      context: ../..
      dockerfile: docker/webui/Dockerfile
    container_name: piper-webui
    ports:
      - "7860:7860"
    volumes:
      - ${MODELS_DIR:-./models}:/models
      - ${OUTPUT_DIR:-./output}:/output
    environment:
      - PIPER_MODEL=${PIPER_MODEL:-}
      - PIPER_MODEL_DIR=/models
      - GRADIO_SERVER_NAME=0.0.0.0
      - GRADIO_SERVER_PORT=7860
      - PYTHONUNBUFFERED=1
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:7860/')"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

ヘルスチェックも設定されているため、コンテナの状態を docker ps で確認できます。

複数モデルの利用

複数のモデルを配置する場合は、models/ ディレクトリに並べて配置します。WebUI上でモデルを切り替えて使用できます。

models/
├── css10-ja-6lang-fp16.onnx
├── config.json
└── tsukuyomi/                    # オプション
    ├── tsukuyomi-chan-6lang-fp16.onnx
    └── config.json

つくよみちゃんモデルなど追加のモデルをダウンロードする場合:

docker run --rm -e PIPER_MODEL=tsukuyomi -v ./models:/models piper-webui echo "done"

所感

PIPER_MODEL 環境変数を指定するだけでモデルの自動ダウンロードからWebUIの起動まで完結します。Dockerさえあれば、PythonやONNX Runtimeのセットアップは不要です。ボリュームマウントによりモデルがホスト側にキャッシュされるため、2回目以降は即座に起動します。