ここ最近VOICEVOX
を使用して音声合成を楽しんでいましたが、その中でよくOpenJTalk
を使用すればもっと軽くリアルタイムにできるのに…ということも言っていました。以前は自分もOpenJTalk
を使っていたのですが、インストールの手順が煩雑だったのでいまいち手が出ないというのが正直なところでした。
参考
それも2016年のこと、現在ではどうなっているか改めて調べてみたところ、Python
から簡単にOpenJTalk
が使用できるラッパーであるpyopenjtalk
がある事がわかりました。あまりにも簡単に導入ができるので、今後は導入はこれ1つで良いと思います。
使用環境
今回使用しているのはRaspberryPi OS(bookwormベース)となります。
$ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 12 (bookworm) Release: 12 Codename: bookworm $ uname -a Linux raspberrypi 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64 GNU/Linux $ cat /etc/debian_version 12.2
Python
のバージョンは以下のようになっています(デフォルト状態です)。
$ python -V Python 3.11.2 $ pip -V pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)
pyopenjtalkの導入
pyoepnjtalk
の導入に必要なものはcmake
とscipy
となります。その他にもありますが、この2つをインストールすることで、依存関係からインストールされます。
(注意)pipのインストールはpip668によって仮想環境にしてからでない不要な方はNGがでるため回避方法を設定してから行ってください。
Pythonの仮想環境を使用"しない"場合
$ sudo apt update $ sudo apt install cmake $ pip install scipy $ pip install pyopenjtalk
Pythonの仮想環境を使用する場合(終了時はdeactivate
を実行してください)
$ sudo apt update $ sudo apt install cmake $ python -m venv pyopenjtalk (pyopenjtalk) $ source ./pyopenjtalk/bin/activate (pyopenjtalk) $ cd ./pyopenjtalk (pyopenjtalk) $ pip install scipy (pyopenjtalk) $ pip install pyopenjtalk
これで準備は完了です。 あとは以下のようなPythonのコードを記述していくことで利用ができます。
【pyopenjtalk_sample.py】
import pyopenjtalk from scipy.io import wavfile import numpy as np x, sr = pyopenjtalk.tts("メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。 メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。") wavfile.write("talk.wav", sr, x.astype(np.int16))
これだけです。以前はかなり大変だった導入作業は何だったのかと思うほど簡単にOpenJTalk
を使用することができます。
このプログラムを実行することでテキストから音声合成されたtalk.wav
ファイルが出力されます。初回の実行時は音声モデルがダウンロードされる処理が行われるようですが、2回目以降は行われないようです。wavファイルの再生はaplayコマンド
を使用します。
(pyopenjtalk) $ python pyopenjtalk_sample.py (pyopenjtalk) $ aplay talk.wav
OpenJTalkの音声合成
【比較】VOICEVOXの音声合成(ずんだもん)
おわりに
以前とは違いかなり容易に音声合成ができました。すごい進化です。
先ほどの文面(走れメロスの冒頭)での音声合成には2秒ほどかかっていたので、リアルタイムの応答にはぎりぎり大丈夫かなと思います。ただ、VOICEVOX
の音声合成を知ってしまうと、やはり機械的な抑揚に聞こえてしまうので、ネットワーク接続可能であればVOICEVOX
を使用し、ネットワークが無い状況ではOpenJTalk
を使うのが良いかなと思います。