chakokuのブログ(rev4)

テック・コミック・ごくまれにチャリ

Pi Zeroに喋らせてNode-REDの部品にする

Pi Zeroでお手軽に喋らせる方法として、DoCoMoとかのWebAPIを使う方法(他力に頼る)と、Pi上のLinux音声合成エンジンを乗せる方法が考えらえる。WebAPI経由の場合、利用制限があるものの、多分高品質な合成が可能と思われる。ただ、API呼び出すのに作法がいるだろう。一方、自力で音声合成する場合、自由度は高いけど、あまり自然な発話は難しい(CPUが非力だと変換に時間がかかる)。ひとまず開発の手間がかからない、自力でやってみることにした。

日本語の合成として、open-jtalkとか、Aques Talkがあるようだ。
Aques TalkはPI用に調整されたパッケージがあるようなので、手っ取りばやくそれを入れてみる。
下記、AquesTalkPIのDLページよりパッケージをDL,展開
/usr/localで展開したので、数字を読み上げる例としては以下

echo "12345" | /usr/local/aquestalkpi/AquesTalkPi -b -f - | aplay -D plughw:1,0


指定した引数で喋るようにスクリプト化(以下は一例)
file:/usr/local/bin/talker.sh

!/bin/sh

ARG=$1
LOG=/var/log/talker.log

echo $ARG >> $LOG
echo $ARG | /usr/local/aquestalkpi/AquesTalkPi -b -f - | aplay -D plughw:1,0

NodeREDには外部コマンドを呼び出すための専用ノード(EXECノード)があるので、ここに上記スクリプトを指定

commandのフォームに、/usr/bin/sudo /usr/local/bin/talker.sh と記載。/usr/bin/sudoが必須らしい。なぜかは分からず。

injectをクリックすると、タイムスタンプ(時刻の数字列)が読み上げられ、SoundBlasterから音が出ます(正確にはヘッドフォンだけど)。

ご参考に動作フローを補足します
injectをクリックするとタイムスタンプの情報(多分epoch time)がフロー図に従って流れて、デバッグ窓に表示されるとともに、execのノードに渡り、commandが実行され、引数$1としてtalker.shに渡り、AquesTalkPiにSTDIN経由で流れ込むと。起動されたAquesTalkPiは音声合成して音声データ(WAV形式)を作成してSTDOUTに流してパイプで接続されたaplayに渡され、aplayが指定されたデバイスから音を出す。

今は試作+勉強中なのでシンプルですが、入力ノードをTwitterとかにすると、Tweetされると音声で投稿メッセージが流れるといった事も可能なはず。

twitterの記事取得Nodeがあるので、それを使ってtweetされたら本文を喋るようにしてみた。ハッシュタグとして#オリンピックを指定した。実際に動かしてみると、、抑揚がすこし変なので、本文も併せて読まないと何を言っているのかいまいちわからない。それに投稿が連続するので、聞いてるのが忙しい。オリンピックtweet読み上げプログラムはこれ以上作りこむ気はないけど、もう少しまともに使えるようにするには、液晶パネルにtweet本文表示しつつ、読み上げないと、このままでは辛いね。読み上げ対象文字列から、ハッシュタグとかキーワードは抜くことも必要かと。

■参考URL
Linux & Android Dialy」様
http://wp.developapp.net/?p=3215

AquesTalkPIのDLページ
http://www.a-quest.com/products/aquestalkpi.html

open-jtalkもパッケージで入るらしいが。。

sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001 libhtsengine1

http://open-jtalk.sourceforge.net/