ESP-WROOM-02 で AquesTalk pico LSI を喋らせてみた (2)
先日、ESP-WROOM-02 で AquesTalk pico LSI を喋らせてみた (1) が、予めプログラムに喋る言葉を組み込んでおいて、単にそれを喋るだけの状態だったので、外部から喋る言葉を送り込んで喋らせるようにしてみる。WROOM-02 で Webサーバを立てて、外からは HTTP で情報を送り込むのが、とりあえず楽そうなので、ESP8266とATP3011を使った音声合成出力 を参考にする。最初、自分でプログラムを書いたときに Synthe に、直接、送られてきた文字列を渡したらエラーになったので、調べてみたら上記のプログラムを見つけて、下のようにしないとダメだと分かった。Synthe の引数は const char* になので、String を渡してもダメなのね。int len = message.length();char buff[len];message.toCharArray(buff,len); atp.Synthe(buff); // 引数に指定のテキストを発声次に、パソコンから次のような Python のプログラムで喋らせてみた。import requestsr = requests.get("http://wroom-02-address/speak?say=onakaga/hettayo.")問題になるのが、喋らせる内容がアルファベットの音声記号だということ。最初は、音声記号列生成 Webサービス を使って、音声記号に変換したものを渡そうかと思ったのだが、AquesTalk pico LSI に一度に渡せる文字列長に制限があるので、そのあたり考慮しないとダメだと分かった。制限を超える文字列を渡すと、何も喋ってくれないので、予め文字列を短く区切って渡す必要がある。ちなみに、文字列長を超える文字列を渡した時も、r.status_code は 200 で返ってくるので、とりあえず喋らせて失敗したら短くするとかいうのはダメ。渡す前に毎回チェックする必要がある。ローマ字記号列(半角英数小文字)の長さは最大 127byte なので、その長さ以下で収まりのよい感じに区切ってあげるひつようがある。アクセントの位置とかも、音声記号列生成 Webサービス だと好みに合わないときがあるので、自分で作ってみることにした。例えば、尖閣に安保」日米確認へ、国防長官の来日時に の記事の初来日するマティス米国防長官が、沖縄県の尖閣諸島について「対日防衛義務を定めた日米安全保障条約第5条の適用対象になる」とする見解を、稲田防衛相との間で確認する見通しになった。を音声記号列生成 Webサービス で変換すると、hatsura'ini_chisuru,ma'_thisu/beikokubo-cho'-kannga okinawa'kennno/sennka_kusho'to-nitsuite ta'i/nichibo-eigi'muo/sada'meta,ni'chi/beiannzennhosho-jo'-ya_ku,da'i/<NUMK VAL=5 COUNTER=jo'- MODE=AaH>no/tekiyo-ta'isho-ni/na'ru to/suru/kennkaio inada,bo-ei'sho-tono/aidade,kakuninnsuru/mito-shini/na'tta.となる。このままだと長過ぎるので、文字列を分割して、hatsura'ini_chisuru,ma'_thisu/beikokubo-cho'-kannga okinawa'kennno/sennka_kusho'to-nitsuite ta'i/nichibo-eigi'muo/sada'metani'chi/beiannzennhosho-jo'-ya_ku,da'i/<NUMK VAL=5 COUNTER=jo'- MODE=AaH>no/tekiyo-ta'isho-ni/na'ru to/suru/kennkaio inada,bo-ei'sho-tono/aidade,kakuninnsuru/mito-shini/na'tta.となるが、次のようにした方が、自分には自然に聞こえる。まあ、自然にというのは、主観的なものだから人によって違うだろうけど、自分に違和感のないイントネーションで喋ってくれるところを目標にする。hatsura'ini_chisuru,ma'_thisu/beikokubo-cho'-kannga okinawa'kennno/sennka_kusho'to-nitsuite tai'/nichibo-eigi'muo/sada'metani'chibei/annzennhosho-jo'-ya_ku,da'i/<NUMK VAL=5 COUNTER=jo'- MODE=AaH>no/tekiyo-ta'isho-ni/na'ruto/suru/kennkaiwo inada,bo-ei'sho-tono/aidade,kakuninnsuru/mito-shinina'tta.2つを比較するために喋らせてみた。ちょっとアクセントの位置を調整するだけで、自分にとってはだいぶ聞きやすくなった。import requestmessage1 = ["hatsura'ini_chisuru,ma'_thisu/beikokubo-cho'-kannga okinawa'kennno/sennka_kusho'to-nitsuite ta'i/nichibo-eigi'muo/sada'meta","ni'chi/beiannzennhosho-jo'-ya_ku,da'i/<NUMK VAL=5 COUNTER=jo'- MODE=AaH<no/tekiyo-ta'isho-ni/na'ru to/suru/","kennkaiwo inada,bo-ei'sho-tono/aidade,kakuninnsuru/mito-shinina'tta."]message2 = ["hatsura'ini_chisuru,ma'_thisu/beikokubo-cho'-kannga okinawa'kennno/sennka_kusho'to-nitsuite tai'/nichibo-eigi'muo/sada'meta","ni'chibei/annzennhosho-jo'-ya_ku,da'i/<NUMK VAL=5 COUNTER=jo'- MODE=AaH>no/tekiyo-ta'isho-ni/na'ruto/suru/","kennkaiwo inada,bo-ei'sho-tono/aidade,kakuninnsuru/mito-shinina'tta."]for i in range(3): requests.get("http://ESP-WROOM2-address/speak?say=%s" % message1[i])for i in range(3): requests.get("http://ESP-WROOM2-address/speak?say=%s" % message2[i])感じかな混じり文から、読みを生成するのは、MeCab: Yet Another Part-of-Speech and Morphological Analyzer を使って、多少ヒューリスティックな変換ルールを追加するかな。日本語形態素解析システム JUMAN++ も使ってみるか。JUMAN++は言語モデルを利用した高性能な形態素解析システムです.言語モデルとして Recurrent Neural Network Language Model(RNNLM) を用いることにより,単語の並びの意味的な自然さを考慮した解析を行います.それにより JUMAN,MeCab に比べ大きく性能が向上しています.文法・辞書・出力フォーマット等は JUMAN から引き継いだものを利用しています.本システムは CREST「知識に基づく構造的言語処理の確立と知識インフラの構築」の支援により開発されました.らしい。最近、この手のことをやっていなかったので、また、ちょっと言語処理系もチャレンジしてみるか。