なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

RaspberryPiでmycoeiroink動かしてみた

はじめに

この記事は公開されているcoeiroinkを利用してRaspberryPiで使用しましょうというものです。 とりあえずは動くものの残念ながらリアルタイム性では実用的ではないのは最初に言っておきます。

使用したソースはcommitが去年のものなので最新ではないでしょう。 ほんとにとりあえず動くのを確かめたかっただけなのでそこのところ勘案していただければと思います。 また、pythonでの開発とか全然わかんないのでもっとスマートな方法あるぜという場合もあるかとは思います。

動作環境

  • ハードはRaspberryPi4|5 8GB
  • OSはRasbianOSのbookworm
  • mycoeiroinkで使用するモデルは自作のを使用。

事前準備

openjtalk用の辞書ファイルの準備。

cd ~
wget http://downloads.sourceforge.net/open-jtalk/open_jtalk_dic_utf_8-1.11.tar.gz
tar xvzf open_jtalk_dic_utf_8-1.11.tar.gz
mkdir speaker_info

scpなどでmycoeiroink用のデータをコピーしておく

環境準備

Pyenvのインストール

cd ~
git clone https://github.com/pyenv/pyenv.git ~/.pyenv

環境変数を設定

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc

設定の反映とバージョンの確認インストールできるものの確認

source .bashrc
pyenv --version
pyenv install -list

pythonは3.8.19の環境が使用するmycoeには望ましいので、3.8.19にする

pythonのインストールに必要なライブラリのインストール

sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

Pythonをインストール

pyenv install 3.8.19

coeiroink等のインストール作業

coeiroink_core関連

cd ~
git clone https://github.com/shirowanisan/coeiroink_core 

voicevox engine関連

cd ~
git clone https://github.com/shirowanisan/voicevox_engine
cd voicevox_engine
git checkout c-1.7.3+v-0.14.5
pyenv local 3.8.19
python3 -m venv mycoe
source ./mycoe/bin/activate
(mycoe) takeshich@pi5:~/voicevox_engine $ python -V
Python 3.8.19

requirements.txtの編集。pyopenjtalk がビルドでコケるのでvoicevoxでの最新版のリビジョンに変更しておく。

vi requirements.txt

#pyopenjtalk @ git+https://github.com/VOICEVOX/pyopenjtalk@f4ade29ef9a4f43d8605103cb5bacc29e0b2ccae
pyopenjtalk @ git+https://github.com/VOICEVOX/pyopenjtalk@b35fc89fe42948a28e33aed886ea145a51113f88
vi pyproject.toml

pyopenjtalk = {git = "https://github.com/VOICEVOX/pyopenjtalk", rev = "f4ade29ef9a4f43d8605103cb5bacc29e0b2ccae"}
pyopenjtalk = {git = "https://github.com/VOICEVOX/pyopenjtalk", rev = "b35fc89fe42948a28e33aed886ea145a51113f88"}
pip install git+https://github.com/shirowanisan/espnet@espnet-0.10.3 --no-deps
pip install -r requirements.txt --no-deps
pip install .
pip install --upgrade pip setuptools wheel
pip install -r requirements.txt
pip install git+https://github.com/shirowanisan/coeiroink_core --no-deps

修正しておかないと実行時にエラーが出るので修正しておく。 コメントアウトとバージョンの変更。ここらへんもっとうまくできると思うのだけどとりあえず動かすのが目的なのでやっつけ的解決方法です。

vi ../coeiroink_core/requirements.txt

#espnet-0.10.3
#pyopenjtalk

llvmlite==0.39.0
numba==0.56.4
numpy==1.23.5
scipy==1.9.3

モデルおよび辞書のコピーとmycoeiroinkの起動

pip install -r ../coeiroink_core/requirements.txt --no-deps
pip install .

cp -r ../speaker_info ./
cp -r ../open_jtalk_dic_utf_8-1.11 mycoe/lib/python3.8/site-packages/pyopenjtalk/open_jtalk_dic_utf_8-1.11
python run.py

確認作業

echo -n "こんにちは、たけしちです。音声合成の世界ですよ。" > text.txt
curl -s \
    -X POST \
    "localhost:50031/audio_query?speaker=313943412"\
    --get --data-urlencode text@text.txt \
    > query.json
time curl -s \
    -H "Content-Type: application/json" \
    -X POST \
    -d @query.json \
    "localhost:50031/synthesis?speaker=313943412" \
    > audio.wav

313943412はモデルのstyleIdです。

cpu_num_threadsは未指定の場合のtimeの結果は

pi4で

real    1m0.750s
user    0m0.017s
sys     0m0.034s

pi5で

real    0m14.372s
user    0m0.005s
sys     0m0.009s

cpu_num_threads=4場合のtimeの結果は

Pi4で

real    0m40.983s
user    0m0.039s
sys     0m0.034s

Pi5で

real    0m10.596s
user    0m0.010s
sys     0m0.005s

Pi5はPi4よりは4倍程度早いようです。

まとめ

とりあえず動かしてみたいという興味でやってみました。

速度的にはPi4はまったく使い物にならないように思えます。 天気予報の本文で短そうなのを非リアルタイムな例えばバッチとかで動かしておいてファイルにしたのを時間になったら再生するというのには使えそうです。

Pi5もPi4よりは4倍程度早いもののやはり遅いです。やはり非リアルタイムなものでの使用となるでしょう。 そもそもリアルタイム性を求められるものはPCでGPUの乗ったもので作業すればいいわけで、非リアルタイムなものをRaspberryPiにやらせればいいのだなとは思います。

それとVoiceVoxがあるのになぜcoeiroinkかというと自作のモデルがあるからで家族にネタとして使いたいというのもありました。 実際、聞かせたところ、家族からの感想はキモチワルイだったけど。

誰得な感じだけど、誰かの参考になれば幸いです。