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
あっ 確かにファイルへの書き込み権限付与しないとですね!!