バルスと話すとサーバーをシャットダウンさせる。


バルスで、サーバーを落としたい

先ずは「バルス」とマイクに向かって話したときに、サーバーを終了することができるかどうかです。もちろん最終目標は、ArduinoかRaspberry Piに繋げたマイクに向かって「バルス」というと、リモート接続先のサーバーが、その後一切起動しなくなるやつですが。

想定する動作

  1. サーバー(仮想マシンでOK)に、Node-REDを入れる。execノードを使いたいので、IBM Cloudのスターターキットは使えない。
  2. Webブラウザ上でNode-REDにアクセス
  3. PC内蔵または外部接続のマイクに向かって話す
  4. Watson Speech to Textで音声認識、テキスト変換
  5. 「バルス」と認識した場合のみ、Node-RED実行サーバーに対してシャットダウンを実行

と、手始めにこんな感じで動けば良いので、Node-REDのフローを作りました。下記が作成したサンプルです。

導入したノード

Node-REDをサーバーに導入しただけでは、Watsonに接続するためのノードがありませんので、Node-RED画面の「三」→「パレットの管理」→「ノードを追加」から、下記を追加します。

  • node-red-contrib-browser-utils
  • node-red-node-watson

サンプルコードは、Node-REDでインポートして動かすことができます。「exec」ノードが必須です。

[{"id":"f01a4ba5.5e2148","type":"tab","label":"バルス システム ver1","disabled":false,"info":""},{"id":"1afd992c.3e61e7","type":"microphone","z":"f01a4ba5.5e2148","name":"","x":139,"y":54,"wires":[["da788f89.44d65"]]},{"id":"da788f89.44d65","type":"watson-speech-to-text","z":"f01a4ba5.5e2148","name":"","alternatives":1,"speakerlabels":true,"smartformatting":false,"lang":"ja-JP","langhidden":"ja-JP","langcustom":"NoCustomisationSetting","langcustomhidden":"","band":"BroadbandModel","bandhidden":"BroadbandModel","password":"","apikey":"","payload-response":false,"streaming-mode":false,"streaming-mute":true,"auto-connect":false,"discard-listening":false,"disable-precheck":false,"default-endpoint":true,"service-endpoint":"https://stream.watsonplatform.net/speech-to-text/api","x":160,"y":140,"wires":[["fc4231d2.713e4"]]},{"id":"21b94dbb.b2d302","type":"switch","z":"f01a4ba5.5e2148","name":"","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"バルス","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":330,"y":220,"wires":[["f00139c7.739af8"],["9fe0bcce.8005d"]]},{"id":"9fe0bcce.8005d","type":"debug","z":"f01a4ba5.5e2148","name":"debug : バルス認識エラー","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":570,"y":280,"wires":[]},{"id":"f00139c7.739af8","type":"exec","z":"f01a4ba5.5e2148","command":"echo user | sudo -S shutdown -h now","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":590,"y":220,"wires":[["a9fbc581.e283c8"],[],[]]},{"id":"fc4231d2.713e4","type":"function","z":"f01a4ba5.5e2148","name":"音声認識結果","func":"msg.payload = msg.transcription;\nreturn msg;","outputs":1,"noerr":0,"x":360,"y":140,"wires":[["21b94dbb.b2d302"]]},{"id":"a9fbc581.e283c8","type":"debug","z":"f01a4ba5.5e2148","name":"debug: バルス認識成功","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":710,"y":140,"wires":[]}]

バルスシステム ver.1

フロー図は下記になります。

「speech to text」ノードをダブルクリックし、Watson Speech to TextのAPIキーを入力しています。APIキーは、クレジットなしで無料で使えるIBM Cloud ライトアカウントで使える「Watson Speech to Text」を有効にすることで入手することができます。

「switch」ノードでは、Watson Speech to Textにおける認識結果が、「バルス」かそうでないか振り分けています。

「execノード」、「echo user | sudo -S shutdown -h now」と表示されている箇所についてです。ダブルクリックしますと、「execノード」編集画面が開きます。
echo のあとの「user」は、Node-REDを実行しているユーザーのパスワードです。ここを各自のパスワードに置き換えます。「echo user | sudo -S shutdown -h now」で、今すぐシャットダウンする処理が実行されます。

動作確認

サンプルコードをインポートし、各ノードで必要な値をセットした後、画面右上の「デプロイ」をクリックします。
その後、「microphone」ノードの左端のボタンをクリックし、「バルス」と言いましょう。
再び、「microphone」ノードの左端のボタンをクリックします。Watson Speech to Textにより音声がテキストに変換され、無事「バルス」と認識されていれば、Node-REDを実行しているサーバーがシャットダウンするはずです。