ブログ管理者のP.Hです!
今回は、Raspberry Piで音声合成を行いたいと思います。Open JTalkというモジュールを使い、Raspberry Piがしゃべるようにします。音声の出力先はイヤホン端子を使用しますので、イヤホンかイヤホン端子に接続できるスピーカーが必要になります。
それではRaspberry Piをしゃべらす方法を紹介していきます。
音声が出力されることを確認
下記のコマンドを実行して、音声出力のハードウェアデバイスのcardとdevice番号を調べます。
$ aplay -l
下記のように表示されます。
**** List of PLAYBACK Hardware Devices **** card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA] Subdevices: 8/8 Subdevice #0: subdevice #0 ... Subdevice #7: subdevice #7 card 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI] Subdevices: 1/1 Subdevice #0: subdevice #0
今回はイヤホン端子を使用しますので、card⇒1 device⇒0 が割り振られていることがわかります(card⇒1 device⇒1はHDMIの音声出力です )。
aplayの後に -Dhw:[card番号,デバイス番号] 音声ファイルパス というパラメータを付けて実行します。Raspberry PiにはFront_Center.wavという音声ファイルがサンプルとしてはじめから入っていますので、その音声を下記コマンドで再生します。
$ aplay -Dhw:1,0 /usr/share/sounds/alsa/Front_Center.wav
イヤホンから"フロントセンサー"という音声が聞こえてくると思います。これでハードウェアは問題なく動作していることが確認できました。
※私は特に設定しなくても動作しましたが、音声出力をイヤホン端子にするかHDMIにするか、下記のコマンドで設定しないと動作しない可能性があります。もし音声が出ない場合は、下記コマンドを試して見てください。
$ amixer cget numid=3 1 # イヤホン端子出力の場合 $ amixer cget numid=3 2 # HDMI出力の場合
Open Jtalkモジュールのインストール
下記のコマンドでモジュールのインストールを行います。
$ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
上記のhts-voice-nitech-jp-atr503-m001が音響モデルのファイルになり、男性の声になります。下記の手順で女性の声もインストールします。
- 女性の音声ファイルダウンロードホームページ
https://ja.osdn.net/projects/sfnet_mmdagent/releases/
上記からからMMDAgent_Example-1.8.zipダウンロードして、下記コマンドを実行し、 /usr/share/hts-voiceにファイルをコピーします。
$ sudo unzip MMDAgent_Example-1.8.zip $ sudo cp -r MMDAgent_Example-1.8/Voice/mei /usr/share/hts-voice/
Open Jtalkの使い方
Open Jtalkはテキストファイルに記載している言葉を音声に変換し、wavファイルを生成してくれます。そのwavファイルを再生することで、イヤホンから音声を聞くことができます。ですので、まず音声合成したい(ラズパイにしゃべらせたい)言葉を書いたテキストファイルを作成します。
注意事項
- テキストファイルの文字コードは必ずUTF-8にしてください。
テキストファイル作成後、下記のコマンドフォーマットでコマンドを実行します。
コマンドフォーマット:open_jtalk 辞書ファイルのパス 音響ファイルのパス 保存するwavファイルのパス しゃべらせたいテキストファイルのパス
カレントフォルダにしゃべらせたい言葉を書いたテキストファイル(voice.txt)と音声変換されたwavファイル(test.wav)を保存する場合は以下のようになります。
$ sudo 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 -ow test.wav voice.txt
変換した音声の再生
上記のFront_Center.wavでテストした時と同じです。下記のコマンドになります。
$ aplay -Dhw:1,0 test.wav
しゃべらせたい言葉を書いたテキストファイル(voice.txt)に"こんにちは"と書いてあれば、イヤホンから"こんにちは"と聞こえると思います。
pythonからの実行
単純に上記のコマンドをpythonで実行しているだけです。コメント行のhtsvoceを切り替えると女性と男性の音声を切り替えることができます。このpythonプログラムを実行すると、"こんにちは、テストです"とイヤホンから音声が聞こえてきます。
Pythonのサンプルコードは以下のようになります。
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:1,0'] wr = subprocess.Popen(aplay) def main(): text = 'こんにちは、テストです' jtalk(text) if __name__ == '__main__': main()
Raspberry Piがしゃべるとなんだかうれしいですね。次回は音声繋がりで、Juliusを使った音声認識の方法を紹介したいと思います。