Raspberry Piを話させてみる
ふとTwitterを見ていたら以下のようなものがTLに…
らくだ on Twitter: "舛添要一氏、ここらで突然語尾を「〜ますぞえ」にして話し始めたら俄然支持します"
これは作ってみる価値ありと思いました。(なぜ?)
そこで今回そのファーストステップとしてRaspberryPiで話をさせてみるTextToSpeech(TTS:音声合成)をさせるチャレンジをしてみます。
TTS(音声合成)とは
音声合成(おんせいごうせい、Speech synthesis)とは、人間の音声を人工的に作り出すことである。これを行うシステムをスピーチ・シンセサイザー(Speech synthesizer)、これにより生成した音声を合成音声(ごうせいおんせい)と呼ぶ。 人工的に人の声を合成するシステムであり、テキスト(文章)を音声に変換できることから、しばしばテキスト読み上げ(text-to-speech、略してTTS)システムとも呼ばれる。また、発音記号を音声に変換するシステムもある。
【参考】 音声合成 - Wikipedia
テキストから音声モデルを使って音声を合成するって奴です。
野望へ
今回はテキストを受けて語尾を変更するとかいうのが目標となります。
- テキスト入力をTTSしてスピーカーで鳴らす
- テキストの語尾を検出しキーワードと変換する
この2つができればよいことになります。 今回はこのうちの前者を行います。
事前準備
音声の出力をスピーカーから行うので過去のエントリーを参考にUSBスピーカーを使用できるようにしておきます。
Open JTalk
RaspberryPiで有名なOpen JTalkを使用します。
Open JTalk - HMM-based Text-to-Speech System
ネットを探すといろいろな情報があるのでそれを参考に環境の設定をするのですが、個人的にはこちらを参考にするのがいいのかなと思います。
Open JTalkのインストール
~ $ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001
特に問題もなくインストールができるのですが、バージョンアップに伴うメッセージが多いなあ(ライブラリは不要という感じのもの)という印象でしたが、問題ないかなと思って次にすすめます。
参考のサイトではOpen JTalkのデフォルトの声が怖いということでMMD Agentの声に入れ替えると言ったことをやっていたのでそれに習うことにしました。
~ $ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.3/MMDAgent_Example-1.3.zip
~ $ unzip MMDAgent_Example-1.3.zip
~ $ sudo cp -R MMDAgent_Example-1.3/Voice/* /usr/share/hts-voice/
最後に以下にあるjsay
というシェルスクリプトを作成します。(ここまでコピペのみw)
Mac/Linuxでsay(喋らせる)系コマンド · GitHub
シェルスクリプトをコピーしたら
#!/bin/sh TMP=/tmp/jsay.wav #cd /usr/share/hts-voice/nitech-jp-atr503-m001 cd /usr/share/hts-voice/mei_happy echo "$1" | open_jtalk \ -td tree-dur.inf \ -tf tree-lf0.inf \ -tm tree-mgc.inf \ -md dur.pdf \ -mf lf0.pdf \ -mm mgc.pdf \ -dm mgc.win1 \ -dm mgc.win2 \ -dm mgc.win3 \ -df lf0.win1 \ -df lf0.win2 \ -df lf0.win3 \ -dl lpf.win1 \ -ef tree-gv-lf0.inf \ -em tree-gv-mgc.inf \ -cf gv-lf0.pdf \ -cm gv-mgc.pdf \ -k gv-switch.inf \ -s 16000 \ -a 0.05 \ -u 0.0 \ -jm 1.0 \ -jf 1.0 \ -jl 1.0 \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP rm -f $TMP
シェルスクリプトの内容としては引数の日本語テキストをopen_jtalk
コマンドに渡し、/tmp/jsay.wav
に出力した後、そのwavファイルをaplay
で再生するというものです。
スクリプトファイルを保存後は
~ $ chmod 755 jsay
としてスクリプトに実行権限を与えてください。そして、いよいよ緊張の実行となります。 以下のように実行すると…
~ $ jsay はい Warning: HTS_fopen: Cannot open mgc.pdf. Error: Dictionary or HTS voice cannot be loaded.
…実行に失敗しました。あれ?
調査してみる
エラーがでているので、オプションで与えているファイルがないようなメッセージなので、パスが間違っているのかなと思ったのですが、検索しても見当たらない。もしかしたらapt-getで取得したOpen JTalkのバージョンが上がりファイルの構成が変わってしまったのかも?
今度はエラーメッセージをググってみると、パラメータが異なっているような情報がありました。
ここに乗っているスクリプトを参考にすることで話せるようになりそうです。
#!/bin/sh TMP=/tmp/jsay.wav echo "$1" | open_jtalk \ -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP rm -f $TMP
圧倒的にコマンドに渡すオプションが少ない!
そのうえ、MDAgent_Example-1.3はこのバージョンのモデルでは使いにくいので最新のMDAgent_Example-1.6を使用することにします。
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
$ unzip MMDAgent_Example-1.6.zip
$ sudo cp -R MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/.
以上でバージョンupができました。 中身をみると、声色(?)ごとにディレクトリになっていたファイルが1つのファイルとなっているのがわかります。
/usr/share/hts-voice/mei $ ls
COPYRIGHT.txt mei_angry.htsvoice mei_happy.htsvoice mei_sad.htsvoice
README.txt mei_bashful.htsvoice mei_normal.htsvoice
上のファイルで-m
で与えていたファイルパスを変えることで声も変更することができるようになりました。
#!/bin/sh TMP=/tmp/jsay.wav echo "$1" | open_jtalk \ -m /usr/share/hts-voice/mei/mei_normal.htsvoice \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP rm -f $TMP
その他の詳細パラメータを合わせてクリプトを作るとこんな感じ?
#!/bin/bash # HTSVOICE=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice HTSVOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice voice=`tempfile` option="-m $HTSVOICE \ -s 16000 \ -p 100 \ -a 0.03 \ -u 0.0 \ -jm 1.0 \ -jf 1.0 \ -x /var/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $voice" if [ -z "$1" ] ; then open_jtalk $option else if [ -f "$1" ] ; then open_jtalk $option $1 else echo "$1" | open_jtalk $option fi fi aplay -q $voice rm $voice
一時使用のwavファイルをtempfileコマンドで作成しているのが変わった点でしょうか。
最後に
また一歩、野望に近づいた!!