Raspberry Piを話させてみる

Raspberry Piを話させてみる

ふとTwitterを見ていたら以下のようなものがTLに…

らくだ on Twitter: "舛添要一氏、ここらで突然語尾を「〜ますぞえ」にして話し始めたら俄然支持します"

これは作ってみる価値ありと思いました。(なぜ?)

そこで今回そのファーストステップとしてRaspberryPiで話をさせてみるTextToSpeech(TTS:音声合成)をさせるチャレンジをしてみます。

TTS(音声合成)とは

音声合成(おんせいごうせい、Speech synthesis)とは、人間の音声を人工的に作り出すことである。これを行うシステムをスピーチ・シンセサイザー(Speech synthesizer)、これにより生成した音声を合成音声(ごうせいおんせい)と呼ぶ。 人工的に人の声を合成するシステムであり、テキスト(文章)を音声に変換できることから、しばしばテキスト読み上げ(text-to-speech、略してTTS)システムとも呼ばれる。また、発音記号を音声に変換するシステムもある。

【参考】 音声合成 - Wikipedia

テキストから音声モデルを使って音声を合成するって奴です。

野望へ

今回はテキストを受けて語尾を変更するとかいうのが目標となります。

  • テキスト入力をTTSしてスピーカーで鳴らす
  • テキストの語尾を検出しキーワードと変換する

この2つができればよいことになります。 今回はこのうちの前者を行います。

事前準備

音声の出力をスピーカーから行うので過去のエントリーを参考にUSBスピーカーを使用できるようにしておきます。

uepon.hatenadiary.com

Open JTalk

RaspberryPiで有名なOpen JTalkを使用します。

Open JTalk - HMM-based Text-to-Speech System

ネットを探すといろいろな情報があるのでそれを参考に環境の設定をするのですが、個人的にはこちらを参考にするのがいいのかなと思います。

橋本商会 » Raspberry Piに喋らせる

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のバージョンが上がりファイルの構成が変わってしまったのかも?

今度はエラーメッセージをググってみると、パラメータが異なっているような情報がありました。

qiita.com

ここに乗っているスクリプトを参考にすることで話せるようになりそうです。

#!/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コマンドで作成しているのが変わった点でしょうか。

最後に

また一歩、野望に近づいた!!

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