VOICEVOX/voicevox_engine

Dockerイメージで起動したEngineに対して/add_presetにPOSTすると500 Internal Server Errorになってしまう

saitetu opened this issue · 4 comments

不具合の内容

 docker run --rm -it -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

にて起動し、以下のcurlを叩くと500エラーが返ってきてしまいます。

curl -X 'POST' \
 'http://localhost:50021/add_preset' \
 -H 'accept: application/json' \
 -H 'Content-Type: application/json' \
 -d '{
   "id": 2,
   "name": "サンプルプリセット",
   "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
   "style_id": 0,
   "speedScale": 1,
   "pitchScale": 0,
   "intonationScale": 1,
   "volumeScale": 1,
   "prePhonemeLength": 0.1,
   "postPhonemeLength": 0.1,
   "pauseLength": null,
   "pauseLengthScale": 1
}'

内容はデフォルトプリセットからID以外変更していないおりません。
また、swaggerに用意されているサンプルリクエスト含め、パラメータを変えるなど様々試してみましたが、全て500エラーとなりました。

なお、Docker以外では同じリクエストでも問題なく動作するため、バグではないかと思いご報告させていただきました。

現象・ログ

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)
INFO:     172.17.0.1:65490 - "GET /docs HTTP/1.1" 200 OK
INFO:     172.17.0.1:56646 - "POST /add_preset HTTP/1.1" 500 Internal Server Error

再現手順

 docker run --rm -it -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

で起動後に、

curl -X 'POST' \
 'http://localhost:50021/add_preset' \
 -H 'accept: application/json' \
 -H 'Content-Type: application/json' \
 -d '{
   "id": 2,
   "name": "サンプルプリセット",
   "speaker_uuid": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff",
   "style_id": 0,
   "speedScale": 1,
   "pitchScale": 0,
   "intonationScale": 1,
   "volumeScale": 1,
   "prePhonemeLength": 0.1,
   "postPhonemeLength": 0.1,
   "pauseLength": null,
   "pauseLengthScale": 1
}'

などの形で/add_presetに対してPOSTを行う

期待動作

登録IDが返ってくること

なお、Dockerではなく、VOICEVOXを通常通りダウンロードした上で同じようにcurlを叩いた場合は問題なく登録できました。

VOICEVOXのバージョン

core_version: 0.15.4
(Engine: latest)

OSの種類/ディストリ/バージョン

  • Windows
  • macOS Sonoma 14.5 (Docker DesktopにてDocker起動後にcurl)
  • Linux (Github actionにてDocker起動後にcurl)

その他

issue作成ありがとうございます!

おそらくデフォルトのプリセットファイルのパスに書き込み権限がないのだと思われます!
デフォルトのプリセットファイルのパスは現在エンジンパス/preset.yamlです。

アンドキュメントな仕様なのですが、このプリセットファイルのパスを書き込み権限のある場所に変えてあげれば動きました。
とりあえずこうすれば動くと思います!

# ホストのtmpディレクトリに空っぽのプリセットファイルを作る
echo "[]" > /tmp/preset.yaml

# 空っぽのプリセットファイルがdockerコンテナ内で見えるようにしつつ、そのプリセットファイルを指定して起動
docker run \
  --rm \
  -it \
  -p '127.0.0.1:50021:50021' \
  -e VV_PRESET_FILE=/tmp/preset.yaml \
  -v /tmp/preset.yaml:/tmp/preset.yaml \
  voicevox/voicevox_engine:cpu-ubuntu20.04-latest

-eで環境変数VV_PRESET_FILEを指定しています。
-vでホストで作ったプリセットファイルをコンテナ内で見えるようにしています。

ちなみに有効なプリセットファイルにするために空っぽの配列[]を書き込んでいますが、この仕様は将来変わってそもそもファイルを用意しなくてもよくなるかもしれません。

ありがとうございます!
教えていただいた方法で動作しました!

今後の仕様変更で修正されることも承知しました!

Dockerイメージ VOICEVOX/voicevox_engine は、エンジンの実行ユーザがUID:GID=1000:1000となるように構成されているので、
Docker DesktopではないLinux上のDocker Engineで使用する場合(GitHub Actionsなど)は、プリセットファイルの所有者の変更が必要になる場合があるかもしれません。

あらかじめホスト側でプリセットファイルの所有者がUID:GID=1000:1000になっていることを確認して、異なっていれば変更することで書き込めるようになると思います。

$ ls -n /tmp/preset.yaml
-rw-r--r-- 1 1001 1001 3 Aug  3 09:20 /tmp/preset.yaml
             ^UID ^GID

$ sudo chown '1000:1000' /tmp/preset.yaml
              ^UID ^GID

$ ls -n /tmp/preset.yaml
-rw-r--r-- 1 1000 1000 3 Aug  3 09:20 /tmp/preset.yaml
             ^UID ^GID

あっ 確かにファイルへの書き込み権限付与しないとですね!!