Ubuntu で VOICEVOX ENGINE の開発したいとき

[VOICEVOX 0.2.0 をUbuntu 21.04環境へインストールする](https://qiita.com/isnot_naoto/items/70341884b5dc7a3d7fb5) の続き

## これまでの背景

前回の記事では、UbuntuでVOICEVOXを使うことができるようになりました。
同時に、フロントエンド側（VOICEVOXソフトウェア）の開発をするための環境整備ができました。
いっぽうで、APIサーバー側（VOICEVOXエンジン）については、必ずしもそうではありませんでした。

この数週間の試行錯誤から、現状について理解したことをまとめます。

- 結局エンジンは、製品版が必須（まだオープンソースになっていない部分がある）
- 公式READMEに書かれた手法を使って、製品版と開発中コードを組み合わせて実行できる
    - これはWindowsのみサポート（バイナリは、Windows用にビルド済み）
- 既に知られているように、製品版はWineを使って実行可能
    - LinuxやmacOSでの動作例報告あり
- VOICEVOX（主にエンジン）をDockerコンテナ化する事例が、複数公開されている

ということで、docker-composeを使って、製品版と開発中コードの組み合わせを一括起動・終了できるようにしてみました。

▷GitHubリポジトリ [UnisonUnum](https://github.com/isnot/UnisonUnum)

ドキュメント等、設定や使い方の説明を書けていないので、どなたでもすぐに使えるところまで作り込んでいないのですが、
Dockerやgitなどに慣れた方であれば、これを参考にして、開発環境の整備の手がかりになるのかなと思います。

## 方針

- 製品版のパッケージや展開後のサイズが非常に大きいので、コンテナ内にコピーせずに、volumeでマウントします
- サーバーのソースコードを開発しながら使う想定なので、これもvolumeでマウントします
- 製品版の前段に位置するサーバーでは、エンジンと同じFastAPI、Uvicornを使って実装します
    - 今のところ単純にリクエストを後段へリダイレクトするだけの実装になっています
    - 目的とする機能によっては、一度受けたリクエストを別途エージェントで中継するほうが良い
- 機能をmiddlewareとして実装することで、移植（エンジンに組み込む）できる（可能性がある）
- 今後は、VOICEVOXに独自の付加機能（連携するソフトウェア）を開発していきたい

## 構成図

![fig](https://github.com/isnot/UnisonUnum/raw/main/docs/UnisonUnum_fig.png)

## 実行時の記録（一例）

```bash
(/PATH_TO/UnisonUnum/docker)$ docker-compose up
Creating network "docker_default" with the default driver
Creating docker_voicevox_engine_wine_1 ... done
Creating docker_voicevox_engine_dev_1  ... done
Attaching to docker_voicevox_engine_dev_1, docker_voicevox_engine_wine_1
voicevox_engine_dev_1   | INFO:     Started server process [9]
voicevox_engine_dev_1   | INFO:     Waiting for application startup.
voicevox_engine_dev_1   | INFO:     Application startup complete.
voicevox_engine_dev_1   | INFO:     Uvicorn running on http://0.0.0.0:50021 (Press CTRL+C to quit)
voicevox_engine_wine_1  | 0090:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
voicevox_engine_wine_1  | 0090:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
voicevox_engine_wine_1  | 0090:err:systray:initialize_systray Could not create tray window
voicevox_engine_wine_1  | 0024:fixme:seh:EnumProcessModulesEx (FFFFFFFFFFFFFFFF, 0000000000000000, 0, 0000000000988E80, 2) semi-stub
voicevox_engine_wine_1  | 0024:fixme:seh:EnumProcessModulesEx (FFFFFFFFFFFFFFFF, 000000006042E270, 1672, 0000000000988E80, 2) semi-stub
voicevox_engine_wine_1  | INFO:     Started server process [32]
voicevox_engine_wine_1  | INFO:     Waiting for application startup.
voicevox_engine_wine_1  | INFO:     Application startup complete.
voicevox_engine_wine_1  | INFO:     Uvicorn running on http://0.0.0.0:50031 (Press CTRL+C to quit)
voicevox_engine_wine_1  | INFO:     172.19.0.1:41238 - "GET /docs HTTP/1.1" 200 OK
voicevox_engine_wine_1  | INFO:     172.19.0.1:41238 - "GET /openapi.json HTTP/1.1" 200 OK
voicevox_engine_dev_1   | Namespace(host='0.0.0.0', port=50021, use_gpu=False, voicevox_dir=PosixPath('/opt/voicevox'), voicelib_dir=None, backend_endpoint='http://127.0.0.1:50031')
voicevox_engine_dev_1   | INFO:     172.19.0.1:53220 - "POST /audio_query?text=%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%A7&speaker=0 HTTP/1.1" 307 Temporary Redirect
voicevox_engine_wine_1  | INFO:     172.19.0.1:41252 - "POST /audio_query?text=%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%A7&speaker=0 HTTP/1.1" 200 OK
```