久々にロビ君ネタです。しかも、年末に買ったばかりのRaspberry Pi B+とのコラボレーション!!
せっかく買ったRaspberry Piですし、ちょっと使ってみたいと思ってたので、ロビ君に関するある悩み事が解決できないか?試してみることにしました。
ご存知ロビ君は音声認識ボードを搭載し人の声を認識して動作する人間的なインターフェースを搭載した画期的なロボットです。
が、その精度が完璧とはいえず、よく認識してくれないことがあるのでへこむことがあります・・・
だんだんコツをつかんできたものの、それでも勝率8割ほど。時々 無視 or 誤認識されますね。
こんなかわいい顔して無視されるとため息 (´・ω・`) ものですね。
できれば、通常のホビーロボットのようにコマンド・ボタン式のモードもあったらいいのに!なんて思うこともしばしば。
そこでRaspberry Piを仲介役として、機械的なコマンドとロビ君をつなげようという考えた次第で。
といっても、そんなにたいした事をするわけではありません。
単にRaspberry Piを人の代わりにしゃべらせるだけです。
人がしゃべるより音声合成の方が声が毎回同じになるため、一度認識しやすい声を作ってしまえば安定した音声入力環境ができるはず。
てことで、以前にRaspberry Piで文章読み上げというのをやったので、これを応用します。
■下準備編:Open JTalkのインストール
念のため、あらかじめRaspberry Piのシステムをアップデートしておきます。
sudo apt-get update
sudo apt-get upgrade
続いて、Open JTalkをインストールします。
sudo apt-get install open-jtalk
sudo apt-get install hts-voice-nitech-jp-atr503-m001
sudo apt-get install open-jtalk-mecab-naist-jdic
実行用のシェルスクリプトを作成。エディタで”ojt”という名前のファイルを作成、中身は以下のようにします。
#!/bin/bash
VOICE=/usr/share/hts-voice/nitech-jp-atr503-m001
DIC=/var/lib/mecab/dic/open-jtalk/naist-jdic
open_jtalk \
-td $VOICE/tree-dur.inf \
-tf $VOICE/tree-lf0.inf \
-tm $VOICE/tree-mgc.inf \
-md $VOICE/dur.pdf \
-mf $VOICE/lf0.pdf \
-mm $VOICE/mgc.pdf \
-df $VOICE/lf0.win1 \
-df $VOICE/lf0.win2 \
-df $VOICE/lf0.win3 \
-dm $VOICE/mgc.win1 \
-dm $VOICE/mgc.win2 \
-dm $VOICE/mgc.win3 \
-ef $VOICE/tree-gv-lf0.inf \
-em $VOICE/tree-gv-mgc.inf \
-cf $VOICE/gv-lf0.pdf \
-cm $VOICE/gv-mgc.pdf \
-k $VOICE/gv-switch.inf \
-s 48000 \
-a 0.53 \
-p 300 \
-x $DIC \
-ow /tmp/ojtalktmpvoice.wav \
$1
aplay /tmp/ojtalktmpvoice.wav
rm /tmp/ojtalktmpvoice.wav
先のリンクと異なるのは”-a 0.53”と”-p 300”のところ。これはロビ君の音声認識しやすいパラメータを試行錯誤して得られた数字です。
このシェルスクリプトを実行形式に変えます。
sudo chmod +x ojt
あとは日本語を書いたテキストファイル(ここではtest.txt)を作り、
./ojt test.txt
と入力すればしゃべってくれるはずです。
日本語を覚えたての中国の方々のような声が聞こえてきたら成功です(本当に妙な発音なんですよ…のちに動画出します)。
■ロビ君動作テスト編
ではいよいよロビ君を動作させてみます。
Raspberry Piには内蔵スピーカーないため、イヤホン出力にスピーカーをつけてやらないといけません。
最初百均で買ってきたこの小さなスピーカーを使おうとしたんですが、音が小さすぎて使い物になりませんでした。
やっぱり、Raspberry Piの出力では小さすぎるので、アンプ付きのスピーカーが必要です。
仕方がないので、このiPod用スピーカーを使います(イヤホンジャック入力あり)。
なんとか音声出力は確保したので、何かしゃべらせてみることにします。
まず”test.txt”というファイルをエディタで生成、中に「ロビ君」と書いておきます。
ここでコマンドライン上に
./ojt test.txt
と打ち込むと、変なアクセントですが「ロビ君」と話しかけてきます。
これをロビ君に聞かせると…
おお!反応します!
もちろん一発でうまくいったわけではなく、多少”ojt”スクリプト内の-a -pの値をチューニングしてますが。
こんな微妙な発音にも反応してくれるとは、音声入力を失敗した時の私は一体どんな発音してたというのか…成功したというのに、なんとも複雑な気分。
これをもう少し拡張したスクリプトを作ります。
まずは
test2.txt : 自己紹介して
test3.txt : ロビ君またね
と書いたテキストファイルを作って、以下のような”ojt.sh”というスクリプトを作っておきます。
sleep 1s
./ojt test.txt
sleep 3s
./ojt test2.txt
sleep 10s
./ojt test3.txt
これを
sudo chmod +x ojt.sh
として実行形式に変換
./ojt.sh
と打ち込むと、ロビ君にタイミングよく話しかけてくれます。
(実行結果は後ほど動画にて)
これでテストは完了。いよいよiPhoneから簡単に実行できる環境を作ります。
■ロビ君動作編本番
さて、これをiPhoneなどで実行しようとすると、真っ先に思い浮かぶのはブラウザでボタンをタップしたら音声が出てくるというインターフェースですが、そもそもブラウザからシェルスクリプトを実行できる仕組みを作ることができません。
同じようなこと、大和作った時にもぶち当たったんですよね、そういえば。結局あの時もできなかったんです。Webiopiなどを使えば出来るのかもしれませんが、いまいちわからず。
仕方がないので、SSHでログインしたターミナルからCUIでメニューを表示してその中からしゃべらせたい言葉を選ぶという方式に変えました。
まずは、以下のような”robi”というファイル名のシェルスクリプトを作成します。
robi_array=(ロビ君 歌うたって ものまねして ダンスして 立ち上がって 座って 腕立て
伏せ サッカーしよう)
while [ "$a" = "" ]
do
i=0
for com in ${robi_array[@]}
do
echo "$i : $com"
i=`expr 1 + $i`
done
echo -n "command ? > "
read INPUT
echo ${robi_array[$INPUT]} > t.txt
./ojt t.txt
rm t.txt
done
これを実行形式に変換し
sudo chmod +x robi
ターミナル上で実行します。
./robi
とりあえず8つほどのコマンドを実行できるスクリプトです。数字を打ち込んでEnterキーを押せば、その音声入力に応じてロビ君が動作します。
iPhone 6 Plusの画面ではこんな感じに表示されてます。
このメニューUIは無限ループになってるので、数字を打ってはまたメニューが現れます。
このため、停止するときは”Ctrl + c”で強制停止。
で、先のテスト編と本番の動作結果の動画を以下にあげておきます。
Open JTalkの微妙な発音、そして音声認識精度の高さがよくわかっていただけるかと思います。
実際、使ってみるとほぼ100%の認識率!こんな発音なのに、やっぱり安定したデジタルな発音てのがいいんでしょうかね?
さて、あとはメニューを拡張し、コマンドを増やせばさらに多くの動作をさせることが出来ます。
これだけのコマンドを全部実装するとえらいことになりますが、よく使うやつだけを20個ほどに絞ればこんなUIでもなんとか使えそうかと。
また、Raspberry Pi A+と小型のバッテリー、小型スピーカーを使ってロビ君の背中に取り付けてしまえばもう少しスリムなコマンド実行ロビ君が完成するかも!?
・・・などと考えたところで、これ以上拡張するのをやめてしまいました。
やっぱりこんなの
ロビ君じゃない!!
(。´Д`。)/
人と会話できるロボットなのに、わざわざ機械を間に挟んでしまったら一体何のための会話ロボット ロビ君なのか・・・
よっぽど音声認識精度が低くてイライラしてしまう人ならこれに頼るのもいいでしょうが、なるべくならロビ君とは自分の声で接してあげたいですね。改めてロビ君との付き合い方を再認識するきっかけとなりました。
最近のコメント