●ロボットで音声認識に挑戦最近では音声認識エンジンが気軽に手に入るということで、一つロボットを音声認識で動かすソフトを作ってみました。
PCにロボットとマイクを接続してマイクに向かってしゃべることで、あらかじめ設定した言葉を検出できればロボットがそれに対して割り当てられたモーションを再生します。
本ソフトウェアの開発には、VS-RC003/HV対応ソフトウェア開発ライブラリ「VS-RC003SDK」及びMicrosoft製音声認識ライブラリ
「Microsoft Speech SDK 5.1」を使用しました。
また、開発に当たって下記webサイトを参考にさせていただきました。
http://www1.bbiq.jp/kougaku/speech_reco.html・免責事項
説明に移る前に、念のためにお約束事をお知らせします。
・本プログラムは、ヴイストン株式会社として開発したものではなく、あくまでcombat-e個人が開発したものであり、ヴイストン株式会社ではサポートは一切受け付けておりません。
・本プログラムを使用して発生したデータや物質の損害は、ヴイストン株式会社及びcombat-e個人は一切補償いたしませんのでご了承ください・環境の設定まず、PC用のマイクを用意してください。マイクはPCのマイク端子に取り付ける安いものでもかまいません。
近所のPCショップに行けば手に入るかと思います。

今回使用したマイクはELECOMのMS-STM55というものです。
次に、
こちらのページより、
「SpeechSDK51.exe」「SpeechSDK51LangPack.exe」をそれぞれダウンロードしてPCにインストールしてください。
このあたりは
前述のページにも説明されていますね。
プログラムをインストールしたら、PCのコントロールパネルを開いて「音声認識」という項目をダブルクリックしてください。
ダブルクリックすると下記のようなダイアログを開くので、上部の「言語」の項目より「
Microsoft Japanese Recognizer v5.1」を選択して「OK」をクリックしてください。
・認識の確認と調整それでは、まずは音声認識部分が正しく行われるか確認してみます。
まずはPCにマイクを接続します。接続する場所はお使いのマイクによって異なりますが、ステレオミニジャックと同じ形状なら、PCに下図のような絵の書いた端子があればそこに接続します。

続いてPCのスタートメニューから「すべてのプログラム」→「Microsoft Speech SDK 5.1」→「C++ Samples」→「Simple Dictation」をクリックしてください。
クリックすると下記のダイアログを表示するので、マイクに向かって何かしゃべってみてください。
うまく認識できていれば、しゃべるたびにその内容に沿った文章が表示されます。

なかなかにカオスな認識状況ですが、それなりに何かを聞き取れています。
うまく動作しない場合は下記を確認してください。
・PCにマイクを正しく接続しているか
・マイクに電源がある場合、電源がONになっているか
・マイクにボリュームがある場合、ボリュームが最小になっていないか
・PCの音量設定で、マイクの音量が最小になっていないか
・PCの音声デバイスの設定で、現在接続しているマイクを使用しない設定になっていないか
動作確認してみると、認識の精度があまり良く無い場合があります。
もともと音声認識は個人差が非常に大きいため、インストール直後の状態ではうまく認識されないことも多いようです。
その場合は、マイクトレーニングを行なっていくことで大分改善されるようです。
ただ、あまりに認識精度が悪い場合は、マイクのボリュームが大きすぎる・小さすぎる場合などがあるので、調整してみてください。
・プログラムの設定それでは、実際に音声認識でロボットを動かしてみたいと思います。
ダウンロードしたファイルを解凍すると、下記のファイルが入っています。
・rclib.dll
・VSRC003_SDK.dll
・voicewnd.exe
・voicemot.ini
・ini(RB2000).txt
・ini(Roboviei).txt
・ini(RobovieX).txt
・main.cpp
プログラムを実行する前に、ロボットの初期化と音声に対する反応の設定を行います。
まず、プログラム起動時などにロボットの初期化を行うモーションファイルを準備します。このプログラムでは、実行ファイルのフォルダに存在する「ini.txt」というファイル名のモーションファイルを初期化モーションとして使用します。
解凍ファイルには、ロボットの機種ごとの初期化モーションとして「ini(???).txt」というファイル名でRobovie-i/RB300、RB2000、
Robovie-X/Liteの「直立」のモーションファイルを用意しました。
これらの機種をお使いの場合は、使用機種のファイルを選択して「ini.txt」というファイル名に変更してください。
※「ini(RobovieX).txt」は、Robovie-X/Liteの「完全直立」のモーションファイルです。認識後に歩行させるなど「膝曲げ直立」のモーションを使う場合は、そのモーションをフォルダにコピーして「ini.txt」の名称に変更してください。
また、オリジナルロボットを使用している場合は、お使いのロボットのアイドリングモーションなどを「ini.txt」という名前でコピーしてください。「初期化を行うモーションファイル」とは、操作マップのアイドリングモーションやオートデモの起動モーションに使用しているモーションで問題ありません。
続いて、認識する単語とそれに対する動作の設定を行います。
解凍ファイルに含まれる「voicemot.ini」をダブルクリックしてファイルを開くと、以下のような内容が記述されています。
_voice:[0]-[[こんにちは]]-[[.\あいさつ(Lite).txt]]
_voice:[0]-[[今日は]]-[[.\あいさつ(Lite).txt]]
こちらは、1行で
「認識した単語と認識させる単語・文章が完全一致と部分一致のどちらで発動するか(詳細後述)」、「認識させる単語・文章」、「再生するモーションのパス(実行ファイルの存在するフォルダからの相対パス)」をそれぞれ設定します。
各パラメータは'[]'でくくられた中に記述し、'[[]]'のように二重で記述されている部分は、そのまま二重にくくられた中に記述します。
「認識させる単語・文章」は、PCが聞き取った単語でロボットに反応させたいものをそのまま記述します。認識された結果は漢字変換されることもあるので、前述のサンプルソフトで単語がどのような文字で認識されているか確認してください。
また、認識の精度が悪い場合は、類似した発音の異なる単語で認識されることもあります。また、認識させる単語の一部など、中途半端なところしか認識できないこともあります。
その場合は、それらの正しく無い認識結果や中途半端な認識結果にも同じモーションを設定することで、ある程度認識精度をカバーすることができます。
「再生するモーションのパス」は、そのまま反応した言葉に対して再生させるモーションファイルを指定してください。
「認識した単語と認識させる単語・文章が完全一致と部分一致のどちらで発動するか」とは、PCが認識した単語が、ある単語とまったく同じものが認識された場合にのみモーションを再生するという設定です。
これは、誤認識によるモーションの暴発を軽減させるための設定ですが、認識率が低い状況では場合によってさらに認識率を低下させる場合があります。
認識を「部分一致」にする場合は'[0]'、「完全一致」にする場合は'[1]'にそれぞれ設定します。
ちなみに、認識した言葉に複数モーションを登録した単語が含まれる場合は、voicemot.ini中で上に記述した物ほど優先順位が高くなります。
設定が完了したらファイルを上書き保存してください。
・プログラムの実行設定が完了したらプログラムを実行します。
実行する前に、USBケーブルでロボットをPCに接続し、リセットボタンを押しておいてください。
また、マイクも忘れずつなぎ、前述のサンプルプログラム「Simple Dictation」を実行している場合は先にそちらを終了させておいてください。
続いて「voicewnd.exe」を実行すると、しばらくして画面に以下のウィンドウを開きます(起動時のタイムラグは音声認識エンジンの初期化です)。

プログラムを実行すると、ロボットがini.txtの名前で保存した起動モーションを実行します。
これでロボットの各関節が初期化されたので、続いてロボットのサーボモータをONにします。
サーボモータをONにした瞬間にロボットが転倒しないようにしっかり支えて、ソフトウェアのメニューより「File」→「Gain On」をクリックしてください。
サーボモータをONにしたら、後はPCにつないだマイクに向かって、認識の登録をしている単語をしゃべってください。
認識結果はソフトウェアのウィンドウに逐次表示され、登録された単語が認識された場合「OK. Play <???>」という表示が出てロボットがモーション再生を開始します。

ここでは「キック」という単語に反応してキックモーションを再生させたかったのですが、なかなか聞き取りされなかったため、「聞く」「聞け」「チェック」など発音が似た単語を登録し、結果モーションの発動に成功しました。
モーションが暴発した場合など、モーションの再生を中断させたい場合は、メニューより「File」→「MotPlay Cancel」をクリックしてください。クリックするとその瞬間モーション再生が中断するので、ロボットを基準ポーズに戻すためメニューの「File」→「Play initmotion」をクリックしてください。
プログラム実行中にサーボモータのON・OFFを切り替える場合は、それぞれメニューより「File」→「Gain On」をクリックしてONに、「File」→「Gain Off」をクリックしてOFFにします。
また、CPUボードがリセットしたり、ケーブルの断線などによりロボットとの通信が途切れた場合は、メニューより「File」→「Play initmotion」をクリックしてロボットの関節を初期化してから、再び「File」→「Gain On」をクリックしてサーボモータをONにしてください。
・ソースについて
アーカイブに含まれる「main.cpp」は、本プログラムのソースの一部です。
すべてのソースや開発プロジェクト一式は都合により公開できません。また、詳しい解説も今回は時間が無いので先送りとします。
またの機会に解説記事を設けて行いたいと思います。
ちなみに、ソース中の「VSRC003SDK」で始まる関数がVSRC003SDKの関数です。ソース内に数箇所しか見つからないことからも、必要最低限の命令でロボットにモーションを再生させられることがわかるかと思います。
むしろ音声認識部分のほうが分量が多くややこしいですね(もっとも、そちらもサンプルソースを多く参考にさせていただいています)。
あと、Microsoft Speech SDKも、サンプルをまともにビルドできるようになるまでえらい苦労をしました(ヘッダファイルを書き換えたりした記憶がある)。