VOICEVOX COREをRaspberryPiにインストールしてCLIで便利に音声合成を行おう

はてなブログに書いていた```RaspberryPi```に```VOICEVOX```をインストールするという内容をQiitaに移植しました。

https://uepon.hatenadiary.com/entry/2024/02/02/002823

```RaspberryPi```の運用ではモニタのないヘッドレス環境での使用の可能性もあるため、この設定では```VOICEVOX```を構成する要素の1つである```VOICEVOX CORE```を導入し、CLIでの運用を行ってみたいと思います。

ネットで検索してもうまくいかないという話はあるのですが、成功例はなかなかみつからないようです。自分も数日悩みましたがようやく解決できました。

【参考】

https://uepon.hatenadiary.com/entry/2024/01/30/005612

# VOICEVOXの構成要素

```VOICEVOX```は3つのモジュール「**エディター**」、「**エンジン**」、「**コア**」で構成されています。```VOICEVOXソフトウェア```はこの3つから構成され、**エディター**は**エンジン**の機能を参照し、**エンジン**は**コア**の機能を参照しています。

【**参考**】

https://github.com/VOICEVOX

- **エディター**

GUI を表示するためのモジュールで、アプリケーションの形態をとります。リポジトリは以下となります。

https://github.com/VOICEVOX/voicevox

- **エンジン**

テキスト音声合成 API を公開するためのモジュールで、Web サーバーの形態をとります。リポジトリは以下となります。

https://github.com/VOICEVOX/voicevox_engine

- **コア**

音声合成に必要な計算を実行するためのモジュールで、動的ライブラリの形態をとります。（コマンドラインでの実行も可能）リポジトリは以下となります。

https://github.com/VOICEVOX/voicevox_core

また、これらのモジュールは単独で使用できるようになっています。例えば、**コア**だけでコマンドラインからの使用、**エンジン**だけでWebAPIでの使用ができ、Web経由でリクエストを送信すれば音声合成された結果を得ることができます。このような形で導入が一部分であっても、サービスの使用ができるようになっています。

今回は**コア**を```RaspberryPi```に導入し、コマンドライン上から実行を行えるようにしてみます。

# インストールの環境について

インストールは```RaspberryPi OS```の最新バージョンである```Debian 12 Bookwarmベース```で行っていきますが、検証として旧バージョンの```Debian 11 bullseye```でも起動を確認しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/419e2986-cbf9-4f78-e66f-cde13aa49ddb.png)

注意点は、最近のDebianベースのOSでは```PEP668```が適応されるため、デフォルトではPythonの仮想環境が必須となっています。以下は、仮想環境化も含めた形でのインストール作業を行っています。

# ```VOICEVOX CORE```のインストール

今回の設定では```VOICEVOX CORE```の**0.14.0**を使用していきます。最新のものは作業中ということもあるのでバージョンを少し古めにするのがよいのかなと思います。GitHubのリポジトリでもこのことが書かれています。

【今回使用するバージョン】

https://github.com/VOICEVOX/voicevox_core/releases/tag/0.14.0

作業の流れは以下の様になります。

1. Pythonの仮想環境の設定
2. ```VOICEVOX CORE```のインストール
3. ```ONNX Runtime```のインストール
4. ```open_jtalk```の辞書のインストール
5. Pythonのからライブラリの呼び出しと音声合成ファイルの作成
6. Python仮想環境の終了（蛇足）

## 1）Pythonの仮想環境の設定

```sh
$ mkdir voicevox
$ cd voicevox/
$ python -m venv voicevox
$ source voicevox/bin/activate
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/c9c08f77-b3fc-ff3a-8e57-30b3e6f47e6a.png)

## 2）```VOICEVOX CORE```のインストール

```voicevox_core```の```whlファイル```を取得しインストールします。アーキテクチャはGPUを使用せず、ARMのCPUで、OSは64bitになるので```cpu-cp38-abi3-linux_aarch64```が名前についたものを使用します。

```sh
(voicevox) $ wget https://github.com/VOICEVOX/voicevox_core/releases/download/0.14.0/voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl
(voicevox) $ pip install voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/47963434-adc7-14b9-c4b7-89e88b12bb3a.png)

## 3）```ONNX Runtime```のインストール

```ONNX```（Open Neural Network Exchange）は、オープンソースで開発されている機械学習や人工知能のモデルを表現する為の代表的なフォーマットで、その実行環境が```ONNX Runtime```となります。

>ONNX Runtimeは様々な環境におけるONNXモデルの推論・学習高速化を目的としたオープンソースプロジェクトである。フレームワーク・OS・ハードウェアを問わず単一のRuntime APIを介してONNXモデルを利用できる。

【**参考**】

https://ja.wikipedia.org/wiki/Open_Neural_Network_Exchange

以下のようにインストールを行います。アーキテクチャタイプはOSがLinux、ARMのCPUで64bitとなるので```linux-aarch64```を使用しています。ダウンロード展開後に```SharedObjectライブラリ```として登録を行います。

```sh
(voicevox) $ wget https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-linux-aarch64-1.13.1.tgz
(voicevox) $ tar zxvf onnxruntime-linux-aarch64-1.13.1.tgz
(voicevox) $ ln -s onnxruntime-linux-aarch64-1.13.1/lib/libonnxruntime.so.1.13.1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/142bc06f-887a-93ff-1ff1-616addb94051.png)


## 4）```open_jtalk```の辞書のインストール

```VOICEVOX CORE```は辞書を必要とするので```Open Jtalk```の辞書ファイルを使用します。

```sh
(voicevox) $ wget https://jaist.dl.sourceforge.net/project/open-jtalk/Dictionary/open_jtalk_dic-1.11/open_jtalk_dic_utf_8-1.11.tar.gz
(voicevox) $ tar xzvf open_jtalk_dic_utf_8-1.11.tar.gz
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/83bf3e75-3074-b028-0a2d-24981a6e7933.png)

## 5）Pythonのからライブラリの呼び出しと音声合成ファイルの作成

あとはCLIから実行するためのPythonスクリプトが必要となるのですが、リポジトリからダウンロードを行い実行を行うと```voicevox_core.blocking```がないというエラーが発生します。このあたりで挫折する方が多そうですが、以下が原因のようです。

https://404background.com/program/voicevox-core/#voicevox_coreblocking%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

> 現在のPythonのバインディングにあるvoicevox_coreには、blocking.pyが含まれています。

Python側のバインディングに問題がありそうです。そこで今回はPythonのプログラムを作成し改めて呼び出すようにしてみます。以下のようにエディタを開いて、ファイルを作成します。

```sh
(voicevox) $ nano voicevox.py
```

```python:voicevox.py
from pathlib import Path
from voicevox_core import VoicevoxCore, METAS
import sys, os

core = VoicevoxCore(open_jtalk_dict_dir=Path("./open_jtalk_dic_utf_8-1.11"))
speaker_id = 1 # 1:ずんだもん,2:四国めたん

text = sys.argv[1]
if not core.is_model_loaded(speaker_id):
    core.load_model(speaker_id)
wave_bytes = core.tts(text, speaker_id)
with open("./" + text + ".wav", "wb") as f:
    f.write(wave_bytes)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/f8cec6ef-2aa1-0de4-7ae9-c530d927d72b.png)


これで```VOICEVOX CORE```の機能を呼び出す事ができるようになりました。途中に```speaker_id```という変数がありますが、ここに入る数値がボイスモデルとなります。
**1：ずんだもん**、**２：四国めたん**という設定のようです。ファイルを保存して実行することで音声合成が行われ```wavファイル```が完成します。

### 四国めたんの音声合成の例（読み上げテキストが異なってしまっています…すみません）

```sh
(voicevox) $ python ./voicevox.py おはようございます
(voicevox) $ aplay おはようございます.wav
```

https://drive.google.com/file/d/1ObedbCNN0NJhW7b2HrO1hM_tm418uud8/view?usp=sharing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/a8de4019-9ee9-798b-09a9-e3f0b2326f54.png)

### ずんだもんの音声合成の例

```sh
(voicevox) $ python ./voicevox.py ずんだもんなのだ
(voicevox) $ aplay ずんだもんなのだ.wav
```

https://drive.google.com/file/d/19-zIgAoqSBeAC4XMCICp8UG-VPqh8Pc8/view?usp=sharing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13188/2c872487-2761-54f5-ff74-6a16463abd64.png)

これで```VOICEVOX```を使用した音声合成ができるようになりました。これくらいの短いフレーズでも30秒ほど処理時間がかかるのでリアルタイムな返答などには使用できないと思います。**リアルタイム性を目指すなら大人しく他の音声合成処理を使用しましょう。**

## 6）Python仮想環境の終了（蛇足）

```sh
(voicevox) $ deactivate
```

# おわりに

```RaspberryPi OS```上で```VOICEVOX CORE（VOICEVOX）```が使用できるようになりました。ネットで検索するとチャレンジをしている方も多そうですが、成功例をあまり見ることができなかったので、参考にしていただければと思います。

**工程のすべて（コピペして使用してください。冒頭の$は除いています）**

```sh:導入時のコマンド一覧
mkdir voicevox
cd voicevox/
python -m venv voicevox
source voicevox/bin/activate

wget https://github.com/VOICEVOX/voicevox_core/releases/download/0.14.0/voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl
pip install voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl

wget https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-linux-aarch64-1.13.1.tgz
$ tar zxvf onnxruntime-linux-aarch64-1.13.1.tgz
$ ln -s onnxruntime-linux-aarch64-1.13.1/lib/libonnxruntime.so.1.13.1

wget https://jaist.dl.sourceforge.net/project/open-jtalk/Dictionary/open_jtalk_dic-1.11/open_jtalk_dic_utf_8-1.11.tar.gz
tar xzvf open_jtalk_dic_utf_8-1.11.tar.gz

nano voicevox.py

python ./voicevox.py ずんだもんなのだ
aplay ずんだもんなのだ.wav

deactivate
```

---

【**参考**】

https://404background.com/program/voicevox-core/

https://qiita.com/taka7n/items/1dc61e507274b93ee868

---