動作確認(Bluemix)
最後にBluemixで確認しましょう。まず、docker-push.shコマンドでdockerイメージをBluemixにアップロードします。
./docker-push.sh The push refers to a repository [registry.ng.bluemix.net/utton/watsonproxy] b43b2817bbfe: Pushed a8fca08822d8: Pushed de174b528b56: Pushed
なお、no basic auth credentialsというエラーが表示される際は、cf ic loginコマンドを実行してください。pushには数分かかります。終わったら、docker-bluemix-run.shで実行します。
./docker-bluemix-run.sh 7bb9a5d9-78fb-40be-b68b-b5b1c49d3579
cf ic psコマンドで、STATUSの部分がRunningになるのを待ちます。
$ cf ic ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7bb9a5d9-78f registry.ng.bluemix.net/utton/watsonproxy:latest "" About a minute ago Running a minute ago 80/tcp romantic_noyce
次にIPアドレスをバインドします。デフォルトではパブリックなIPアドレスが割り当てられていないので、外からアクセスできません。まずはcf ic ip listで確保しているアドレスを確認します。
$ cf ic ip list Number of allocated public IP addresses: 1 Listing the IP addresses in this space... IP Address Container ID 169.44.121.77 7bb9a5d9-78fb-40be-b68b-b5b1c49d3579
このように、Container IDの部分が記載されたアドレスはすでに使用済みです。もしもContainer IDの部分が空になっているIPアドレスがあれば、空きなのでそのまま使用できます。また、デフォルトでIPアドレスは2つまで使用できます。IPアドレスの個数が2つに逹っしていなければ、cf ic ip requestを実行してください。
$ cf ic ip request OK The IP address "169.44.121.78" was obtained.
再度、cf ic ip listで確認すると、Container IDが空のIPアドレスが増えていることが分かります。
$ cf ic ip list Number of allocated public IP addresses: 2 Listing the IP addresses in this space... IP Address Container ID 169.44.121.78 169.44.121.77 7bb9a5d9-78fb-40be-b68b-b5b1c49d3579
cf ic ip bindコマンンドでIPアドレスをバインドします。
$ cf ic ip bind 169.44.121.78 7bb9a5d9-78f OK The IP address was bound successfully.
cf ic ip bindコマンドにはIPアドレスと、コンテナのIDを指定します。コンテナのIDは、cf ic psで確認できます。コマンドの実行が終わったら、再度cf ic psで確認します。
$ cf ic ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 655ad675-cff registry.ng.bluemix.net/utton/watsonproxy:latest "" 36 seconds ago Networking 30 seconds ago 169.44.121.78:80->80/tcp sleepy_mestorf
このようにSTATUSがNetworkingになっているときは、IPアドレスの割り当て中です。Runningになるまで待ってください。それでは、mbedのプログラムの以下の部分を、上記で割り当てたIPアドレスに変更してコンパイルし、mbedに書き込んでからリセットしてこれまでと同じように実行してみてください。
int responseCode = httpClient.post("http://169.44.121.78/", request, &response);
きちんと認識されれば、LED4が点灯するはずです。うまくいかない時は、ログを確認してみてください。ログは、cf ic logsで確認できます。引数にコンテナのIDを指定してください。
$ cf ic logs 655ad675-cff
;[info] play.api.Play - Application started (Prod)
N[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:80
Start index
"wav: /tmp/5224690688905516918.wav
~response: '{"results":[{"alternatives":[{"confidence":0.373,"transcript":"明るく し "}],"final":true}],"result_index":0}'
transcript: '"明るく し "'
command: '明るくし'
注意点
今回は、リソースの制限を回避するため、mbedから直接WSTにリクエストを行うのではなく、Bluemix上に用意したプロクシを経由するようにしました。このため以下の注意点があります。
- プロクシまでの通信は暗号化されていません。最大1.5秒のデバイスの操作コマンドですが、外に漏洩して困るような内容を入力しないように注意してください
- プロクシのIPアドレスさえ分かれば、誰にでもプロクシが使用できてしまいます。実験が終わったらプロクシを終了しておくのが良いでしょう
まとめ
最終回はWatson Speech to Textを用いた音声認識を試してみました。
Watson Speech to Textは音声ファイルを、https、WebSocketで受け取り認識結果をJSONで返します。mbedにおける音声の取り込みや、SSLの処理にはメモリが必要となります。mbedのアナログ入力は、そのままでは音声入力には使えません。外付け回路が必要となります。
デバイス自体が非力でも、ネットワークの力によってさまざまな応用が可能となる点がIoTの醍醐味の一つです。デバイスでできること、サーバ・サイドでできることはいろいろありますが、この2つをうまく組み合わせたアイデアの中に、きっと今まで見たことのないようなアプリケーションが眠っているはずです。ぜひアイデアを形にしてみてください。
補足
ソフトバンクが、ARM社を買収しました(発表資料)。孫社長のコメントからもIoTに対する熱い期待が感じられます。今後もこの分野は目の離せない存在となりそうです。
