VoicevoxをWSL Containersで稼働させる

2026年9月に正式リリースされたWSL version 3.0.1にはWSL Containers(WSLC)と呼ばれるデーモンレスでLinuxコンテナを起動できる機能があります。この機能の特徴の一つにContainer Device Interface(CDI)によるGPUパススルー機能があります。この機能があるとWSL2+Ubuntu+DockerでVoicevoxを動かすために必要だったNVIDIA Container Toolkitが無くてもvoicevox_engineコンテナからWindowsホストのNVIDIA製GPUが利用できます。

ただし、ちょっとだけ引っかかりポイントがありますので注意喚起も含めて記事にしておきます。今回はGeminiのお手柄でした。

WSLのアップデート

いろんなところで紹介されていると思いますが。念のためここでもWSLのアップデート手順を解説しておきます。

PowerShellのプロンプトでアップデートコマンドを実行してください

wsl --update

実行するとアップデートが始まります。結構ダウンロードに時間がかかりますので5分ぐらいしたら終わりますので辛抱強く待ちましょう。プロンプトが返ってきたら、現在起動しているのはWSL version2なのでシステムを停止します。

wsl --shutdown

場合によってはこのコマンドも1分程度の時間がかかりますので辛抱強く待ちましょう。プロンプトが返ってきたら終了し、念のためWindowsも再起動してください。

再起動後にバージョンの確認をします。

PS > wsl --version
WSL バージョン: 3.0.1.0
カーネル バージョン: 6.18.40.1-1
WSLg バージョン: 1.0.79
MSRDC バージョン: 1.2.7214
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26300.9457

先頭にWSLのバージョンが表示されます。私の環境では"3.0.1.0"でした。

VOICEVOX GPUを起動

WSL ContainersのCDI(GPUパススルー)機能を使うために実行時に引数を渡す必要があります。私はこれが抜けていたので音声ファイルの読み込みに失敗し続け、結局Toolkitが必要なのかな?と1日悩み続けました。皆様が同じことに躓かないように正しい起動方法を以下に。

PS > wslc run -d --name voicevox-gpu --gpus all -p 50021:50021 voicevox/voicevox_engine:nvidia-latest
8f93f55c652c45309409aec4d6314c71d5dfc3538741bf3758dddf3bc47b0141

PS > wslc logs voicevox-gpu
+ cat /opt/voicevox_engine/README.md
# VOICEVOX エンジン利用規約

## 許諾内容

1. 商用・非商用問わず利用することができます
2. アプリケーションに組み込んで再配布することができます
3. 作成された音声を利用する際は、各音声ライブラリの規約に従ってください
4. 作成された音声の利用を他者に許諾する際は、当該他者に対し本許諾内容の 3 及び 4 の遵守を義務付けてください

## 禁止事項

- 逆コンパイル・リバースエンジニアリング及びこれらの方法の公開すること
- 製作者または第三者に不利益をもたらす行為
- 公序良俗に反する行為

## 免責事項

本ソフトウェアにより生じた損害・不利益について、製作者は一切の責任を負いません。

## その他

ご利用の際は VOICEVOX を利用したことがわかるクレジット表記が必要です。

---

# 音声ライブラリ利用規約

## 四国めたん


(中略)

## 里石ユカ

里石ユカ(つぼみ)の音声ライブラリを用いて生成した音声は、
「VOICEVOX:里石ユカ(つぼみ)」とクレジットを記載すれば、商用・非商用で利用可能です。

利用規約の詳細は以下をご確認ください。
https://satoishiyuka.wixsite.com/satoishi/kiyaku
+ exec gosu user /opt/voicevox_engine/run --use_gpu --host 0.0.0.0
voicevox_engine/core/core_initializer.py:99: UserWarning: cpu_num_threads is set to 0. Setting it to an appropriate value.
2026-10-03T08:56:20.843155+00:00  INFO voicevox_core::synthesizer: GPUをテストします:
2026-10-03T08:56:21.241326+00:00  INFO voicevox_core::synthesizer:   * CUDA (device_id=0): OK
2026-10-03T08:56:21.241350+00:00  INFO voicevox_core::synthesizer:   * DirectML (device_id=0): 現在ロードされているONNX Runtimeでは利用できません
2026-10-03T08:56:21.241352+00:00  INFO voicevox_core::synthesizer: CUDA (device_id=0)を利用します
reading /home/user/.local/share/voicevox-engine/user.dict_csv-ece74685-6bec-46ea-8db6-5d8e21599761.tmp ... 96
emitting double-array: 100% |###########################################|
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:50021 (Press CTRL+C to quit)

voicevox_engineコンテナを起動するコマンド自体はDockerと変更在りません。dockerの代わりにwslcと打つだけです。ポイントは"--gpus all"を付けないとGPUパススルーされません。logsで確認するといつものクレジットがいっぱい出てきた後に起動コマンドが表示され、その後にGPUチェックと利用GPU決定が出力されています。そしてVOICEVOXがスタートしたことが記録されており稼働IPとPORTが表示されます。

これで接続テストをすると音声が再生されることを確認できます。私はわんコメで接続テストをして稼働確認しました。

引っかかりポイント

実は起動時に"--gpus all"を付けなくても全く同じ出力で立ち上がります。一見うまく動いているように見えるのです。

しかし、わんコメの接続テストを行うと以下のようになりました。

INFO:     169.254.73.254:60487 - "POST /audio_query?text=%E6%8E%A5%E7%B6%9A%E3%83%86%E3%82%B9%E3%83%88&speaker=0 HTTP/1.1" 500 Internal Server Error
Traceback (most recent call last):
  File "starlette/middleware/errors.py", line 165, in __call__
  File "starlette/middleware/exceptions.py", line 62, in __call__
  File "starlette/_exception_handler.py", line 53, in wrapped_app
  File "starlette/_exception_handler.py", line 42, in wrapped_app
  File "starlette/routing.py", line 715, in __call__
  File "starlette/routing.py", line 735, in app
  File "starlette/routing.py", line 288, in handle
  File "starlette/routing.py", line 76, in app
  File "starlette/_exception_handler.py", line 53, in wrapped_app
  File "starlette/_exception_handler.py", line 42, in wrapped_app
  File "starlette/routing.py", line 73, in app
  File "fastapi/routing.py", line 301, in app
  File "fastapi/routing.py", line 214, in run_endpoint_function
  File "starlette/concurrency.py", line 37, in run_in_threadpool
  File "anyio/to_thread.py", line 56, in run_sync
  File "anyio/_backends/_asyncio.py", line 2470, in run_sync_in_worker_thread
  File "anyio/_backends/_asyncio.py", line 967, in run
  File "voicevox_engine/app/routers/tts_pipeline.py", line 108, in audio_query
  File "voicevox_engine/tts_pipeline/tts_engine.py", line 358, in create_accent_phrases
  File "voicevox_engine/tts_pipeline/tts_engine.py", line 343, in update_length_and_pitch
  File "voicevox_engine/tts_pipeline/tts_engine.py", line 259, in update_length
  File "voicevox_engine/core/core_adapter.py", line 125, in safe_yukarin_s_forward
  File "voicevox_engine/core/core_adapter.py", line 109, in initialize_style_id_synthesis
  File "voicevox_engine/core/core_wrapper.py", line 975, in load_model
  File "voicevox_engine/core/core_wrapper.py", line 988, in assert_core_success
voicevox_engine.core.core_wrapper.CoreError: `/opt/voicevox_engine/model/0.vvm`の読み込みに失敗しました: モデルデータを読むことができませんでした
INFO:     169.254.73.254:60488 - "POST /synthesis?speaker=0&enable_interrogative_upspeak=true HTTP/1.1" 422 Unprocessable Entity

一見これってインストールに失敗しているように見えるのですが違いました。読み込みに失敗したのではなく、モデルデータを読み込んだ後にGPUで初期化することができなかったという事です。つまり、データは読み込めたけどGPUが使えないから初期化できず結果として読み込みに失敗したというメッセージになってる模様です。GPUによる初期化に失敗しましたとか、もうちょっと丁寧なエラーにしてもらいたいものです。

動作は軽いのか

ちょっと触っただけですが動作は軽かったです。わんコメで接続テストを連打するとWSL2+Ubuntu+Dockerの環境では60%程度まで上がっていたと思うのですが、WSLCの環境だと40%程度でした。

実際の配信でやってみないと何とも言えませんが、悪くはなっていないと思います。実行も簡単なのでWSL2+Utuntu+DockerでNVIDIA Container Toolkitをインストールしたりと面倒なことは一切せずにvoicevox_engine:nvidia-latestが動くのは感動ものです。

課題

辞書ファイルをどう管理するかが現在の課題です。Dockerのcomposeができないためデータフォルダの設定方法が判明すれば配信環境を正式に切り替えられます。起動するたびにユーザー辞書を読み込ませてもいいのですが、再起動しないと有効にならないみたいなので今のところ打つ手なしです。

なのでもう少し調査して環境を固めないといけません。

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です