ミニ四駆アニメのワンシーンを爆速で体現する~Node-redで音声認識~
筆者のモノづくりの原点と言えば、小中学生時代のミニ四駆でした。 当時のアニメでは「行けーっ」と叫べばミニ四駆が走ったり飛んだりしたものです。これを大人になった今、やってみます。
音声認識をどうする??
ラピットプロトタイピングで(会話ではなく機器を指示するための分類器として)音声認識させたいとき
という方法もありますが、今回は”Red moblie”を使います。これにspeech to textノードが標準搭載されているので入力された音声を分類し、その結果をMQTTで機器に飛ばして制御します。
Red mobileでNode-redを準備する
Red mobileはAndroidで動作するNode-redのアプリです(有償ですが買い切りで使い続けられます)。 インストールして起動すると以下の画面になります。
「Start」を押してしばらく待つと「Start」が「http:://~」というアドレスに変わるので、このアドレスをPCのブラウザからアクセスし、node-red編集画面を開きます。 ノードの中からspeech to textやダッシュボードで音声認識を起動するボタン、マイコンに指示するMQTT OUTなどを接続します。MQTTはbeebotteを使いました。
speech to textノードは以下を流すと起動できます。日本語対応、入力している言葉の候補を5つ生成させる設定を含んでいます。
//音声認識起動ノード msg.payload = { "language": "ja-JP", "matches": 5, "prompt": "please talk", "showPopup": true } return msg;
次にspeech to textノードが出力した文字列を連結し、
「行」が含まれていたら→{"data":"go"}
「止」が含まれていたら→{"data":"stop"}
に指示を分類してMQTTで送るメッセージを生成します。
//テキスト分類ノード var str_voice = msg.payload[0] + msg.payload[1] + msg.payload[2] + msg.payload[3] + msg.payload[4]; var result_go = str_voice.search( '行' ); var result_stop = str_voice.search( '止' ); if (result_go >= 0){ msg.payload = {"data":"go"}; return msg; }else if(result_stop >= 0){ msg.payload = {"data":"stop"}; return msg; }
var result_go = str_voice.search( '行' );
はstr_voiceに「行」が含まれていたら1以上の値、含まれていなかったら-1を返します。
ではやってみよう!
機器側はマイコンをESP32として、モータ制御に「Raspberry Pi用 MAX14870搭載 デュアルモータードライバ」を使いました。ESP32でMQTTメッセージをサブスクライブし、goならモータON、stopならモータOFFとします。ミニ四駆に組み込んで単独で走らせることまでは考えず、まずはつなげてモータ回しまでやってみます。
Node-redをデプロイし、スマホのRed mobileからダッシュボードを立ち上げます。
回った!何年かぶりに聞いたこのモータ音!
やってみた感想
一人でやっていたとは言え、「行けー、マグナム」と叫ぶのが思った以上に恥ずかしかった。大人になってしまったんだと思った。
おしまい。