ロボゼロをコンピュータ制御してみる その5
2012年10月1日


 前回はAndroid携帯でロボゼロ赤外線リモコンのアプリケーションを作成してロボゼロをスマートフォンで操作しました。
 このままでは本物の赤外線リモコンを使ったのと変わらずあまり意味がありません。
 折角スマートフォンを使っているのでその機能を使わない手はありません。
 スマートフォンの機能のひとつに音声認識がありますがAndroid携帯ではAPIが公開されており簡単にアプリケーションが作成できるようになっています。
 今まで何回か音声認識を使ってロボゼロを操作してきました。

  上半身だけのロボゼロで遊んでみる
  ロボゼロの両手を動かしてみる
  ロボゼロ旗上げゲーム(シリアルケーブル版)

 今回も旗上げゲームをロボゼロにやらせてみました。
 Android携帯で音声認識でロボゼロに対する命令を解析してその動作を赤外線で送信してロボゼロを動かします。
 ロボゼロの動作はロボゼロプログラムとして登録しておきます。



 例えば「右上げて」と命令すると音声認識の認識結果は「右上げて」という文字列で返されます。
 Androidのアプリケーションで左手を表す語彙をいくつか定義しておきます。"左","黒"など
 同様に腕を上げる動作を表す語彙をいくつか定義しておきます。"上","挙","揚"など
 認識結果にこれらが含まれているとその組み合わせでリモコンボタンの番号を求めます。(例えば左手を挙げる動作はリモコンボタン11)
 このボタンの信号を赤外線リモコンAPIを使ってAndroid携帯から送信します。
 ロボゼロではモコンボタン11が押されたら左手を上げるようにした専用プログラムを走らせておきます。

 下はAndroidアプリの語彙解析部分の抜粋です。

 String StartWord[] = {"起動", "きどう", "" };
 String ReadyWord[] = {"用意", "開始","ようい","かいし","" };
 String EndWord[] = {"終", "終了", "おわり", "" };
 String RightWord[] = {"右", "白", "みぎ", "" };
 String LeftWord[] = {"左", "黒", "ひだり", "" };
 String ShakeWord[] = {"握", "持", "にぎ", "もつ", "" };
 String UpWord[] = {"上", "挙", "揚", "あげ", "" };
 String DownWord[] = {"下", "降", "さげ", "" };
 String BothWord[] = {"両", "旗", "りょう", "はた", "" };
 String NotWord[] = {"ない", "" };
 private void AnalizeSpeech(String szCommand)
 {
  int flag = 0;
  int button_no = -1;
 
  if (CheckWord(StartWord, szCommand)) {
   button_no = 1;  //起動
  }
  else if (CheckWord(ReadyWord, szCommand)) {
   button_no = 9;  //用意
  }
  else if (CheckWord(EndWord, szCommand)) {
   button_no = 5;  //終了
  }
  else if (!CheckWord(NotWord, szCommand)) {  //否定なし
   if (CheckWord(BothWord, szCommand)) {
    flag = 3;  //両手
   }
   else {
   if (CheckWord(RightWord, szCommand))
    flag = 1;  //右手
   if (CheckWord(LeftWord, szCommand))
    flag += 2;  //左手(右手が定義されていたら両手)
   }
   if (flag != 0) {
    if (CheckWord(UpWord, szCommand))
     button_no = flag + 9;  //上げる
    else if (CheckWord(DownWord, szCommand))
     button_no = flag + 12;  //下げる
    else if (CheckWord(ShakeWord, szCommand))
     button_no = flag + 18;  //握る
   }
  }
  if (button_no != -1) {
>   Irrc.Send(button_no);   //赤外線送信
  }
 }




 アプリケーションの画面です。  最初のふたつはAndroidの音声認識が表示します。  アプリケーションではヒットした語彙とボタン番号を表示します。

 「終了」という命令を認識すると確認ダイアログが表示され「はい」を答えるとプログラムが終了します。
 なお本アプリケーションはSHARPのAPIを使っているためどのAndroid携帯でも使えるという訳ではありません。(音声認識はAndroidの標準APIです)
 SHARPのサイトに対応機種が掲載されています。

 ロボゼロのプログラムを参考に掲載しておきます。(大した事はやっていませんが)
 なおこのプログラムは付属の赤外線リモコンでも動かす事ができます。
 リモコンボタンの対応は次のとおりです。
  ●プログラム終了(旗を置く)-開始(両手の握りを開く)  
  1右手上げる2左手上げる3両手上げる
  4右手下げる5左手下げる6両手下げる
  A右手握るB左手握るC両手握る



 プログラムの実行動画です。

     

 Androidの音声認識は認識率はWindows版に比べて認識率はかなり高いです。
 また複数の認識結果を返してくれるので第一候補でなくてもヒットする該当する確率は高くなります。
 今回作成したプログラムは下記のURLにアップしておきますので興味のある方はダウンロードして使ってみてください。
 ただしアプリケーションの実行にあたってはAndroid携帯が対応機種である必要があります。

  http://www.mcc.mbsrv.net/robox/RXIRFlag.apk

 下のQRコードをAndroid端末のコードリーダーで読み込ませてもダウンロードする事ができます。

  

 なお今回のプログラムのご使用にあたっては、多少なりともロボゼロ本体への影響を伴いますのであくまでも自己責任という事でお願いします。
 またロボゼロ赤外線リモコンの場合、信号が届く範囲が短いのでスマホをロボゼロに近付ける必要があります。

目次に戻る