エンジニア ろっきーの探究ノート

"不"を"したい"にひっくり返すモノ/コトづくり(H/W, S/W, IoTシステム, アイデア発想)技術を探究します。

ミニ四駆アニメのワンシーンを爆速で体現する~Node-redで音声認識~

筆者のモノづくりの原点と言えば、小中学生時代のミニ四駆でした。 当時のアニメでは「行けーっ」と叫べばミニ四駆が走ったり飛んだりしたものです。これを大人になった今、やってみます。

音声認識をどうする??

ラピットプロトタイピングで(会話ではなく機器を指示するための分類器として)音声認識させたいとき

という方法もありますが、今回は”Red moblie”を使います。これにspeech to textノードが標準搭載されているので入力された音声を分類し、その結果をMQTTで機器に飛ばして制御します。

Red mobileでNode-redを準備する

Red mobileはAndroidで動作するNode-redのアプリです(有償ですが買い切りで使い続けられます)。 インストールして起動すると以下の画面になります。

f:id:rockhack_design:20211022151404p:plain
Red mobile起動画面

「Start」を押してしばらく待つと「Start」が「http:://~」というアドレスに変わるので、このアドレスをPCのブラウザからアクセスし、node-red編集画面を開きます。 ノードの中からspeech to textやダッシュボードで音声認識を起動するボタン、マイコンに指示するMQTT OUTなどを接続します。MQTTはbeebotteを使いました。

f:id:rockhack_design:20211022150953p:plain
speech to text、ダッシュボードのボタン、MQTT OUTなどを接続

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からダッシュボードを立ち上げます。

f:id:rockhack_design:20211022152602p:plain
ダッシュボードを立ち上げて叫んでみる

回った!何年かぶりに聞いたこのモータ音!

f:id:rockhack_design:20211022152805j:plain
実機確認の様子

やってみた感想

一人でやっていたとは言え、「行けー、マグナム」と叫ぶのが思った以上に恥ずかしかった。大人になってしまったんだと思った。

おしまい。