« iPad Proの実機画像流出か!? | トップページ | CFカードをSCSI/SASIドライブとして使えるアダプターの外付け版も登場 »

2015年1月 5日 (月)

Raspberry Piでロビ君を制御させてみた

Img_7778

久々にロビ君ネタです。しかも、年末に買ったばかりのRaspberry Pi B+とのコラボレーション!!

せっかく買ったRaspberry Piですし、ちょっと使ってみたいと思ってたので、ロビ君に関するある悩み事が解決できないか?試してみることにしました。

ご存知ロビ君は音声認識ボードを搭載し人の声を認識して動作する人間的なインターフェースを搭載した画期的なロボットです。

が、その精度が完璧とはいえず、よく認識してくれないことがあるのでへこむことがあります・・・

だんだんコツをつかんできたものの、それでも勝率8割ほど。時々 無視 or 誤認識されますね。

Img_7779

こんなかわいい顔して無視されるとため息 (´・ω・`)  ものですね。

できれば、通常のホビーロボットのようにコマンド・ボタン式のモードもあったらいいのに!なんて思うこともしばしば。

そこで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には内蔵スピーカーないため、イヤホン出力にスピーカーをつけてやらないといけません。

Img_7742

最初百均で買ってきたこの小さなスピーカーを使おうとしたんですが、音が小さすぎて使い物になりませんでした。

やっぱり、Raspberry Piの出力では小さすぎるので、アンプ付きのスピーカーが必要です。

Img_7745

仕方がないので、このiPod用スピーカーを使います(イヤホンジャック入力あり)。

なんとか音声出力は確保したので、何かしゃべらせてみることにします。

まず”test.txt”というファイルをエディタで生成、中に「ロビ君」と書いておきます。

ここでコマンドライン上に

./ojt test.txt

と打ち込むと、変なアクセントですが「ロビ君」と話しかけてきます。

これをロビ君に聞かせると…

Img_7746

おお!反応します!

もちろん一発でうまくいったわけではなく、多少”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の画面ではこんな感じに表示されてます。

20150103_18_21_12

このメニューUIは無限ループになってるので、数字を打ってはまたメニューが現れます。

このため、停止するときは”Ctrl + c”で強制停止。

で、先のテスト編と本番の動作結果の動画を以下にあげておきます。

Open JTalkの微妙な発音、そして音声認識精度の高さがよくわかっていただけるかと思います。

実際、使ってみるとほぼ100%の認識率!こんな発音なのに、やっぱり安定したデジタルな発音てのがいいんでしょうかね?

さて、あとはメニューを拡張し、コマンドを増やせばさらに多くの動作をさせることが出来ます。

Img_7741

これだけのコマンドを全部実装するとえらいことになりますが、よく使うやつだけを20個ほどに絞ればこんなUIでもなんとか使えそうかと。

また、Raspberry Pi A+と小型のバッテリー、小型スピーカーを使ってロビ君の背中に取り付けてしまえばもう少しスリムなコマンド実行ロビ君が完成するかも!?

・・・などと考えたところで、これ以上拡張するのをやめてしまいました

やっぱりこんなの

ロビ君じゃない!!

(。´Д`。)/

人と会話できるロボットなのに、わざわざ機械を間に挟んでしまったら一体何のための会話ロボット ロビ君なのか・・・

よっぽど音声認識精度が低くてイライラしてしまう人ならこれに頼るのもいいでしょうが、なるべくならロビ君とは自分の声で接してあげたいですね。改めてロビ君との付き合い方を再認識するきっかけとなりました。

Raspberry Pi Model B  (Plus)

« iPad Proの実機画像流出か!? | トップページ | CFカードをSCSI/SASIドライブとして使えるアダプターの外付け版も登場 »

ロボット系」カテゴリの記事

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

はじめまして!
 私もロビーのオーナーで、無線接続・リモートコントロール・無線操縦ができればと常々考えております。Raspbarry Pi A+ によるコマンド実行ロビ君 完成 おめでとうございます。
 FRiSKのケース程のスイッチサイエンス版Eagletと小型バッテリー・スピーカーを使ってロビ君の背中に取り付けてしまえば(ランドセルを背負った感じ)?
 技術が無いので思案しております。

こんにちは、Masanori Sakaiさん。

ありがとうございます。ただこれで遠隔操作をやろうとするとかなり大変ですね・・・できればロビ君の基板の音声認識ボードとの間の配線をハックしてA+を使えばより小型化できそうです。

逆にロビ君の音声認識を使い、Raspberry Piにキーワードを受け渡せるようにすることで、ロビ君に「検索して」って呼びかけてGoogle検索させる仕組みを作ると面白いんですが。これこそ本来のロビ君の使い方に沿ったものになりそうかと。でもこんな高度なハックは私には無理です・・・

はじめまして

私もraspberry piと連携させてみたいと思っていたのですが、USB接続で遠隔制御されている方がみえたので、FlashAirを使って無線LAN対応にしてみました。
これで、あとはRM4ファイルを改造していけばいろ色々できそうですが、音声認識や合成までは多分いじれなくてraspberry piの力を借りる事になりそうな気がしています。
OpenJTalkについて参考にさせて頂きたい思います。

こんにちは、ペンギンキャットさん。

これはすごい!!まさに遠隔操作ですね。ぜひこちらでも紹介させてください。

FlashAirにこんな使い道があるとは思いませんでした。私もチャレンジしてみたいです。

ロビ君に取り付けるなら、Raspberry Pi A+の方がいいですね。ただそれでも結構な大きさになるため、ロビ君バランスを崩しそうです。

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Raspberry Piでロビ君を制御させてみた:

« iPad Proの実機画像流出か!? | トップページ | CFカードをSCSI/SASIドライブとして使えるアダプターの外付け版も登場 »

無料ブログはココログ

スポンサード リンク

ブログ村