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

# バルスで、サーバーを落としたい
先ずは「バルス」とマイクに向かって話したときに、サーバーを終了することができるかどうかです。もちろん最終目標は、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

フロー図は下記になります。
![バルスと認識したらシャットダウン.png](https://qiita-image-store.s3.amazonaws.com/0/41414/c9b30a77-cdde-9aef-12de-c91bf144f038.png)

「speech to text」ノードをダブルクリックし、Watson Speech to TextのAPIキーを入力しています。APIキーは、クレジットなしで無料で使える[IBM Cloud ライトアカウント](https://www.ibm.com/cloud-computing/jp/ja/lite-account/)で使える「Watson Speech to Text」を有効にすることで入手することができます。
![watson_stt.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/11efdbfc-0312-e500-6700-b66aeef7ffd5.png)

「switch」ノードでは、Watson Speech to Textにおける認識結果が、「バルス」かそうでないか振り分けています。
![switchノード.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/fca31dff-c365-2891-f735-98d1e77875c4.png)

「execノード」、「echo user | sudo -S shutdown -h now」と表示されている箇所についてです。ダブルクリックしますと、「execノード」編集画面が開きます。
echo のあとの「user」は、Node-REDを実行しているユーザーのパスワードです。ここを各自のパスワードに置き換えます。「echo user | sudo -S shutdown -h now」で、今すぐシャットダウンする処理が実行されます。
![execノード.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/003be49a-15d3-8182-7d8c-e2d0575eeeee.png)

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