Orange Pi 5でVOICEVOX COREを動かしました。
こういった小型のボードで動くと、面白そうなおもちゃが作れそうでわくわくしますね。
音声合成もPythonもよくわからない状態でなんとか動かしたので、なんか違うみたいなことをやらかしてるかもしれませんが、動くまでのセットアップをメモしておきます。
環境など
OS
Ubuntu 20.04.5 LTS (Focal Fossa)
OSインストールイメージ(OrangePiが公式に配布しているもの)
Orangepi5_1.1.0_ubuntu_focal_desktop_xfce_linux5.10.110.img
Orange Pi 5のインストールイメージなどは公式サイトにあります。
VOICEVOX CORE(GitHub)
GitHubのサンプルプログラムはPythonとPyO3、Cを使ったバージョンがありました。
試している時期がちょうどリリース0.14.0がでるかどうかの状態で、0.14.0がリリースされたタイミングで更新日時が一番新しかったPyO3のサンプルプログラムを試してみました。
Python サンプルコード (PyO3 によるバインディング経由)
セットアップ
動かすまでの流れです。
- 不足しているpythonライブラリを入れておく
- 実行用の仮想環境を作る
- 配布されているコアライブラリをインストール
- ONIX RUNTIMEのインストール
- Open JTalkの辞書ファイルをダウンロード
- サンプルプログラムの取得
👩💻
1.不足しているpythonライブラリを入れておく
Ubuntuインストール後、クリーンな状態で不足していたものをインストール。
orangepi@orangepi5:~/voicevox$ sudo apt install python3-pip
orangepi@orangepi5:~/voicevox$ sudo apt install python3.8-venv
2.実行用の仮想環境を作る
orangepi@orangepi5:~$ mkdir voicevox
orangepi@orangepi5:~$ cd voicevox/
orangepi@orangepi5:~/voicevox$ python3 -m venv env
orangepi@orangepi5:~/voicevox$ source env/bin/activate
3.配布されているコアライブラリをインストール
voicevox_core_python_apiのwhlを取得して、インストールします。
(env) orangepi@orangepi5:~/voicevox$ wget https://github.com/VOICEVOX/voicevox_core/releases/download/0.14.0/voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl
(env) orangepi@orangepi5:~/voicevox$ pip3 install voicevox_core-0.14.0+cpu-cp38-abi3-linux_aarch64.whl
4.ONIX RUNTIMEのインストール
(env) orangepi@orangepi5:~/voicevox$ wget https://github.com/microsoft/onnxruntime/releases/download/v1.13.1/onnxruntime-linux-aarch64-1.13.1.tgz
(env) orangepi@orangepi5:~/voicevox$ tar zxvf onnxruntime-linux-aarch64-1.13.1.tgz
(env) orangepi@orangepi5:~/voicevox$ ln -s onnxruntime-linux-aarch64-1.13.1/lib/libonnxruntime.so.1.13.1
5.Open JTalkの辞書ファイルをダウンロード
(env) orangepi@orangepi5:~/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
(env) orangepi@orangepi5:~/voicevox$ tar xzvf open_jtalk_dic_utf_8-1.11.tar.gz
6.サンプルプログラムの取得
(env) orangepi@orangepi5:~/voicevox$ wget https://raw.githubusercontent.com/VOICEVOX/voicevox_core/main/example/pyo3/run.py
実行
サンプルプログラムの使い方を確認しておきます。
(env) orangepi@orangepi5:~/voicevox$ python3 ./run.py -h
usage: run.py [-h] [--mode MODE] open_jtalk_dict_dir text out
positional arguments:
open_jtalk_dict_dir Open JTalkの辞書ディレクトリ
text 読み上げさせたい文章
out 出力wavファイルのパス
optional arguments:
-h, --help show this help message and exit
--mode MODE モード ("AUTO", "CPU", "GPU")
出力テスト。
(env) orangepi@orangepi5:~/voicevox$ python3 ./run.py ./open_jtalk_dic_utf_8-1.11 音声合成テスト audio.wav
正常に終了すれば「audio.wav」というファイルが生成されます。
再生
HDMIで接続していれば、aplay audio.wav
でHDMI経由でディスプレイから音声が再生されると思います。手元ではアンプにつないだスピーカーから再生しました。
(env) orangepi@orangepi5:~/voicevox$ aplay -D plughw:3,0 audio.wav
Playing WAVE 'audio.wav' : Signed 16 bit Little Endian, Rate 24000 Hz, Mono
サンプルプログラム(run.py)にあるSPEAKER_ID = 0
の値を変更すると、音声が変更できます。指定するSPEAKER_IDは、実行中にDEBUG表示されているvoicevox_core.METAS([DEBUG] run.py: voicevox_core.METAS=[Meta(name='四国めたん', styles=[Style(name='ノーマル', id=2), Style(name='あまあま', id=0), Style(…
)で確認しました。
おわり
音声が聞けて素直に嬉しくなりました。
昨年のブラックフライデーで購入したAlexaの影響でただおしゃべりするだけのデバイスがほしいなと思っていたので、夢のおしゃべりデバイスに一歩近づけた気がします。
最初は公式サイトのインストーラーでサクッとインストールして、GUIが起動したらバックエンドでAPIサーバーが立ち上がるらしいので、その後はAPIを使っていろいろ作っていこうと思っていたのですが、ARM64だからなのかなんなのかAppImageが起動できなかったので、いろいろあって今回のようにCOREだけを動かすことになりました。(私の用途ではGUIは必須ではないですし)
上記ではPyO3のサンプルプログラムを動かしましたが、はじめはPythonのサンプルプログラムを動かそうとしていました。しかし、バージョンの問題なのか動かせなかった(ライブラリ名が変わった?らしく、それくらいの問題ならばと思ってライブラリ名を合わせてみましたがそれだけでは動かなかった…)ので、いろいろ調べてコアライブラリをビルドしてPyO3のサンプルを動かしている方を参考に動かしました。
voicevox_coreを動かしてみる
voicevox_core_python_api (公式のGitHubにある手順)
ただ、VOICEVOX COREのREADMEにあるように自身でビルドしたバージョンには製品版のような声優さんの音声は含まれていないので機械音っぽい音声になります。
model フォルダにある onnx モデルはダミーのため、ノイズの混じった音声が出力されます
個人的にはこれはこれで良いなと思うのですが、やはり製品版の方が使いたいなと思い、ダウンロードしたVOICEVOX COREのライブラリとVOICEVOX ENGINEと組み合わせて、APIとして動かすなど、ちょっと遠回りをしてしまいました。(よく考えると、このパターンは試さなくても済んだ気が…)
最終的にPyO3のサンプルプログラムは動くことがわかったので、リリースされたバージョンのコアライブラリを使って動かすという今回のエントリーの手順に至ったという感じです。
たくさん迷走してしまいましたが、PythonとRustの勉強にもなったので良かったなと思います。
それと「動いた!!」×3回分の喜びがあったのでまあいいかなと。