煩雑なインストール不要!Pythonから簡単にOpenJTalk

ここ最近VOICEVOXを使用して音声合成を楽しんでいましたが、その中でよくOpenJTalkを使用すればもっと軽くリアルタイムにできるのに…ということも言っていました。以前は自分もOpenJTalkを使っていたのですが、インストールの手順が煩雑だったのでいまいち手が出ないというのが正直なところでした。

参考

uepon.hatenadiary.com

それも2016年のこと、現在ではどうなっているか改めて調べてみたところ、Pythonから簡単にOpenJTalkが使用できるラッパーであるpyopenjtalkがある事がわかりました。あまりにも簡単に導入ができるので、今後は導入はこれ1つで良いと思います。

github.com

使用環境

今回使用しているのは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の導入に必要なものはcmakescipyとなります。その他にもありますが、この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を使うのが良いかなと思います。

/* -----codeの行番号----- */