Mac上にVOICEVOX Engineを立てて自宅ネットワークに音声合成サーバを用意する

自宅のローカルネットワーク上にて汎用サーバーやビルドマシンとして使っているMac miniに、VOICEVOX Engineの音声合成サーバーを立ててみたので、その時の手順をまとめました。

## 経緯
最近、ChatGPT周りのAPIを触っていたら、文章の読み上げをしたくなってきました。もともとVOICEVOXが良さそうなことを聞いていたので利用してみることにしました。


まず、VOICEVOXを利用する上で、自分のニーズは以下でした。
- 細かいクエリ調整は一旦置いておいて、趣味で作る各種アプリとかで簡易的な読み上げを行いたい
- 最近ずんだもんをYouTubeでよく見る。かわいい。ずんだもんにしゃべらせたい

また、いくつか試している中でパフォーマンス的な問題もでました
- いつもの作業用PCはMacBook ProなのでVOICEVOXをGPU版で起動できず、音声合成にかかる時間が結構厳しい
- DockerでEngineを立ち上げると、結構オーバーヘッドがありパフォーマンスが厳しい（PCのスペックもある）

最初は、docker composeですぐにできるかな？と思ったのですが、処理速度の点で問題があり、以下のビルド済みVOICEVOX Engine単体で起動する方針に切り替えました。

https://github.com/VOICEVOX/voicevox_engine/releases/tag/0.14.2

ということで、最終的な要件として以下を目指しています。
- 自宅のMac miniにローカルネットワークで常時利用できる音声合成サーバを立てる
- 音声合成にはVOICEVOXを利用するが、VOICEVOX EngineだけでEditorのGUIは不要
- できるだけパフォーマンスがでる構成にする
- 自動起動設定など基本的にはメンテしなくてもいいようにする


## 手順

以下、環境構築手順です。

### VOICEVOX EngineのDLと展開
ビルド済みアーカイブをダウンロードします（WebブラウザからDLでも問題ありません）。

```sh
$ wget https://github.com/VOICEVOX/voicevox_engine/releases/download/0.14.2/voicevox_engine-macos-x64-0.14.2.7z.001
```

ビルドは7zipでアーカイブされているため、7zipコマンドがinstallされていない場合は以下でinstallします。
```sh
$ brew install p7zip
```

アーカイブを展開します。
```sh
$ 7z x voicevox_engine-macos-x64-0.14.2.7z.001

#　展開終わったら削除
$ rm voicevox_engine-macos-x64-0.14.2.7z.001
```

### 起動〜起動チェック

展開されたmacos-x64フォルダ内のrunファイルを実行すれば、サーバーが起動するのですが、展開した直後では実行パーミッションがついていませんでした。

```sh
$ cd macos-x64 # 展開されたディレクトリ
$ ls -l run
-rw-r--r--  1 mikito  staff  7119520  2  4 11:54 run
````

実行パーミッションを付与します.

```sh
chmod 755 run
```

これで実行できるようになったため、ヘルプを表示してみます。

```sh
$ ./run --help
usage: run [-h] [--host HOST] [--port PORT] [--use_gpu] [--voicevox_dir VOICEVOX_DIR] [--voicelib_dir VOICELIB_DIR]
           [--runtime_dir RUNTIME_DIR] [--enable_mock] [--enable_cancellable_synthesis] [--init_processes INIT_PROCESSES]
           [--load_all_models] [--cpu_num_threads CPU_NUM_THREADS] [--output_log_utf8]
           [--cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}] [--allow_origin [ALLOW_ORIGIN [ALLOW_ORIGIN ...]]]
           [--setting_file SETTING_FILE]

VOICEVOX のエンジンです。

optional arguments:
  -h, --help            show this help message and exit
  --host HOST           接続を受け付けるホストアドレスです。
  --port PORT           接続を受け付けるポート番号です。
  --use_gpu             指定するとGPUを使って音声合成するようになります。
  --voicevox_dir VOICEVOX_DIR
                        VOICEVOXのディレクトリパスです。
  --voicelib_dir VOICELIB_DIR
                        VOICEVOX COREのディレクトリパスです。
  --runtime_dir RUNTIME_DIR
                        VOICEVOX COREで使用するライブラリのディレクトリパスです。
  --enable_mock         指定するとVOICEVOX COREを使わずモックで音声合成を行います。
  --enable_cancellable_synthesis
                        指定すると音声合成を途中でキャンセルできるようになります。
  --init_processes INIT_PROCESSES
  --load_all_models     指定すると起動時に全ての音声合成モデルを読み込みます。
  --cpu_num_threads CPU_NUM_THREADS
                        音声合成を行うスレッド数です。指定しないと、代わりに環境変数VV_CPU_NUM_THREADSの値が使われます。VV_CPU_NUM_THREADSが空文字列でなく数値でもない場合はエラー終了します。
  --output_log_utf8     指定するとログ出力をUTF-8でおこないます。指定しないと、代わりに環境変数 VV_OUTPUT_LOG_UTF8 の値が使われます。VV_OUTPUT_LOG_UTF8
                        の値が1の場合はUTF-8で、0または空文字、値がない場合は環境によって自動的に決定されます。
  --cors_policy_mode {CorsPolicyMode.all,CorsPolicyMode.localapps}
                        CORSの許可モード。allまたはlocalappsが指定できます。allはすべてを許可します。localappsはオリジン間リソース共有ポリシーを、app://.とlocalhost関連に限定します。その他のオリジンはal
                        low_originオプションで追加できます。デフォルトはlocalapps。
  --allow_origin [ALLOW_ORIGIN [ALLOW_ORIGIN ...]]
                        許可するオリジンを指定します。スペースで区切ることで複数指定できます。
  --setting_file SETTING_FILE
                        設定ファイルを指定できます。
```

実際に起動してみます。
```sh
$ ./run
```

しばらくすると、VOICEVOX Engineのサーバーが立ち上がるため、以下にアクセスしてみます。APIのリファレンスが表示されればOKです。
http://localhost:50021/docs

ちなみにですが、VOICEVOX Engineが立ち上がっているマシン外からアクセスする場合は、以下のようにhostオプションに立ち上げているPCのIPアドレスを渡す必要があります（リバプロなどしない場合）。うちではこのPC(Mac mini)には固定IPを振ってます。
```sh
$ ./run --host 192.168.xxx.xxx
```

### 自動起動の設定
起動チェックができたら、一度サーバーを終了して、LaunchAgentsでの自動起動設定をしておきます。

以下のディレクトリに、以下の名称のplistファイルを作ります。
```
~/Library/LaunchAgents/jp.hiroshiba.voicevox-engine.plist
```

内容は以下のようにし、[PATH_TO_VOCEVOX_ENGINE]と[HOST_IP_ADDRESS]は適宜置き換えてください。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>jp.hiroshiba.voicevox-engine.plist</string>
  <key>ProgramArguments</key>
  <array>
    <string>[PATH_TO_VOCEVOX_ENGINE]macos-x64/run</string>
    <string>--host</string>
    <string>[HOST_IP_ADDRESS]</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
```

以下で起動設定します。
```sh
$ launchctl load ~/Library/LaunchAgents/jp.hiroshiba.voicevox-engine.plist
```

以下のようにプロセスが立ち上がっていればOKです。
```sh
$ launchctl list | grep jp.hiroshiba.voicevox-engine.plist
27243	0	jp.hiroshiba.voicevox.plist
```

なお、サーバーを停止したい場合、自動起動を止めたい場合は以下です。
```sh
# 停止したい場合
$ launchctl stop jp.hiroshiba.voicevox-engine.plist

#　自動起動を止める場合
$ launchctl unload ~/Library/LaunchAgents/jp.hiroshiba.voicevox-engine.plist
```

あとがき
----
これで、自宅ネットワーク内で利用できる音声合成サーバーを立てることができました。各種アプリケーションから連携して、簡易的な読み上げ等であれば色々活用できそうです。VOICEVOX素晴らしいソフトウェアです、開発者の皆様ありがとうございます。そして、ずんだもんかわいいです。

今回は自宅の都合でMac mini上にVOICEVOX Engineのサーバーを構築だったので少しニッチかもしれません。WindowsやGPUを活用できる環境であれば、Dockerで立ち上げるのが一番早いかもです。

最近ジェネレーティブなAIモデルが色々出ていて、学習だけでなくて推論にも計算リソースが必要になってきているので、なんやかんやで自宅内にGPUサーバー欲しくなりますね...