前回はWindows環境でPythonを使った音声合成を行いましたが、今回はRaspberry Piで音声合成をしてみました。ただ前回使用したSAPI(Speech Application Programming Interface)はRaspberry Piでは使用できないので、Open JTalkというソフトウェアを用いて、音声合成をしてみました。
今回使用したOpen JTalkは名古屋工業大学で開発された日本語向けの文章読み上げソフトです。Raspberry PiだけでなくLinuxやMac、Windowsでも使用できるようです。
https://ja.wikipedia.org/wiki/Open_JTalk
【準備】
以下のコマンドでインストールします。
|
1 |
sudo apt-get install open-jtalk |
さらに関連するモジュール(パッケージ)もインストールしておきます。
|
1 2 |
sudo apt-get install open-jtalk-mecab-naist-jdic sudo apt-get install hts-voice-nitech-jp-atr503-m001 |
また女性の声を使いたい場合は、以下のサイトから「MMDAgent_Example-1.8.zip」をダウンロードします。
https://ja.osdn.net/projects/sfnet_mmdagent/releases/
ダウンロードしたファイルを以下のコマンドで解凍したあと、移動させます。
|
1 2 |
sudo unzip MMDAgent_Example-1.8.zip sudo cp -r MMDAgent_Example-1.8/Voice/mei /usr/share/hts-voice/ |
【音声を合成してみる】
準備ができたら音声合成をしてみましょう。
Pythonスクリプトはこちら。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import subprocess def jtalk(t): open_jtalk=['open_jtalk'] mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic'] htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice'] # 女性の声にする場合は以下を使用 #htsvoice=['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice'] speed=['-r','1.0'] outwav=['-ow','test.wav'] cmd=open_jtalk+mech+htsvoice+speed+outwav c = subprocess.Popen(cmd,stdin=subprocess.PIPE) c.stdin.write(t.encode('utf-8')) c.stdin.close() c.wait() aplay = ['aplay','-q','test.wav','-Dhw:0,0'] wr = subprocess.Popen(aplay) def main(): text = 'こんにちは、これはテストです' jtalk(text) if __name__ == '__main__': main() |
Open JTalkは独立したソフトウェアなので、Pythonからサブプロセスとして呼び出しています。
このプログラムを実行すると、20行目にある変数textの中身をしゃべります。
女性の声にする場合は8行目のコメントアウトを解除してください。
またRaspberry pi音声出力ですが、3.5mmのステレオミニジャックを使用する場合は16行目のパラメータを「-Dhw:1,0」としてください。「-Dhw:0,0」はHDMI接続の場合の音声出力です。
【ファイルを作成せずに音声合成してみる】
このようにOpen JTalkを使うと簡単に音声合成ができますが、上のサンプルプログラムではいったん音声ファイル(wavファイル)を作成したあとに音を再生しています。
音声ファイルを毎回作成せずに音声合成したい場合は、以下のようにパイプ処理を利用すればできます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import os import subprocess def jtalk(t): # 男性の声 cmd = f"echo {t} | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -r 1.5 -ow /dev/stdout | aplay --quiet" # 女性の声 #cmd = f"echo {t} | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/mei/mei_normal.htsvoice -r 1.5 -ow /dev/stdout | aplay --quiet" os.popen(cmd) def main(): text = 'こんにちは、これはテストです' jtalk(text) if __name__ == '__main__': main() |
【Open JTalkのパラメータ】
Open JTalkにはいくつものパラメータがあります。今回のサンプルでも速度のパラメータ「r」を変化させています。詳しいことはちゃんと理解できていないのですが、他にも以下のようなパラメータがあるようです。
| パラメータ | 初期値 | 範囲 | 説明 |
|---|---|---|---|
| -s | auto | 1 ~ | サンプリング周波数 |
| -p | auto | 1 ~ | フレーム周期 |
| -a | auto | 0.0 ~ 1.0 | オールパス値 |
| -b | 0.0 | 0.0 ~ 1.0 | ポストフィルタ値 |
| -r | 1.0 | 0.0 ~ | 話す速さ |
| -fm | 1.0 | 0.0 ~ | 追加ハーフトーン |
| -u | 0.5 | 0.0 ~ 1.0 | 有声/無声境界値 |
| -jm | 0.0 | 0.0 ~ 1.0 | スペクトラム系列内変動の重み |
| -jf | 0.0 | 0.0 ~ 1.0 | F0系列内変動の重み |
| -z | 0 | 0 ~ | 音声バッファサイズ |
パラメータを変えた時、どのような声になるかは、以下のサイトが参考になると思います。
http://moblog.absgexp.net/openjtalk/