Raspberry Pi 3 & Python 開発ブログ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbian 8.0(NOOBS Ver1.9.2)を使用して開発中。

【スポンサーリンク】

音声合成をする方法(Open JTalk)

【スポンサーリンク】

今回は、Raspberry Pi音声合成を行いたいと思います。Open JTalkというモジュールを使い、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
HDMI出力の場合 ⇒ amixer cget numid=3 2

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.7.zipダウンロードして、下記コマンドを実行し、
/usr/share/hts-voiceにファイルをコピーします。

sudo unzip MMDAgent_Example-1.7.zip
$ sudo cp -r MMDAgent_Example-1.7/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を使った音声認識の方法を紹介したいと思います。