Google Home でトリガーを引くためのアレコレ

これは [日本情報クリエイト Engineer's Advent Calendar 2017](http://qiita.com/advent-calendar/2017/njc) の4日目の記事です。

#はじめに：
　わたしが**「スマート.+」**ということばに最初に触れたのは、たぶんファンタジーゾーン(FANTASY ZONE SEGA 1986)というシューティングゲームです。
<img src="http://segaretro.org/images/8/8f/Fantasy_Zone_Title.png" width=400>
> YouTube 「初代ファンタジーゾーン　ワンコインクリア」プレイ動画
https://www.youtube.com/watch?v=45YStRIDVpY

このシューティングゲームにはなぜか**パーツショップ**があって、そこで売られている　**「SMART BOMB」**が、弾幕回避が下手くそなわたしには、とても素敵な存在でした。
<img src="http://ages.sega.jp/vol33/screen_fz2r06.jpg" width=400>

　で、当時のわたし(10歳)は上の画像より**「SMART BOMBとは、ほっそりとすらっとしたスタイルのボムのことなんだ」**と、理解していました (だってFIRE BOMBはふとっちょじゃん)。

　さて、時は流れ、スマートフォン・スマートウォッチ・スマートメーター・スマートセンサーなどいろんなスマートがあふれる時代。
　ようやく今、スマートとは**「賢い・高性能」**という意味で使われる言葉だと理解しました。ちなみに、スマートボムとは誘導爆弾のことだそうです。

　そして今わたしの目の前にあるのは「スマートスピーカー」。このスマートなスピーカーで、なんかやってみましょう。

#スマートスピーカーでスマートホーム：
　Google Home では、おうちの赤外線リモコンを制御したり、おうちのコンピューターのトリガーを引くことができます。
　やりかたは、以下のような方法が考えられます。

* **Google Home** -> **IFTTT** -> おうちの**iRKit** -> おうちの**テレビ**
* **Google Home** -> **IFTTT** -> **ngrok** -> おうちの**HTTPListener** -> おうちの**App**
* **Google Home** -> **IFTTT** -> **beebotte**(MQTTへpublish) -> おうちの**App**(MQTT Subscribe)

#登場する要素のスマートな説明：
<img src="http://buildyoursmarthome.co/wp-content/uploads/2016/12/ifttt-featured-image-1-2.jpg" width=200>
https://ifttt.com/discover
**IFTTT**(if this then that)は、「きっかけ」と「行動」をつないだ「レシピ」を作ることができるWebサービスです。
　「this」に**「Google Home で[部屋のあかりをつけて]と呼びかける」**、「that」に**「Webhookで自宅のiRKitにメッセージを送信する」**としたレシピを作れば、**「ねぇgoogle 部屋のあかりをつけて」**と話して制御できる赤外線リモコンができます。

　
<img src="http://weekly.ascii.jp/elem/000/000/243/243665/20140724_yohiro_IRKit30_1200x.jpg" width=200>
http://getirkit.com/
　**iRKit**は、無線LANに接続できる赤外線リモコンデバイスです。Amazonで¥8,000ぐらいです。
　おうちに設置したiRKitを外部(インターネット)から呼び出す方法が標準で用意されており、iPhoneのアプリと組み合わせれば出先から自宅のエアコンをON/OFFできます。

　
<img src="https://ngrok.com/static/img/webhooks.png" width=300>
https://ngrok.com/
　**ngrok**は、LAN内のPCでリッスンしているポート(外部に開放していない)に、グローバルからアクセスするトンネルを作るツール・Webサービスです。
　おうちで動いているPCでWebサーバーを動作させただけではインターネット側から見ることはできませんが、ngrokで HTTP 80 のトンネルをおうちのPCにつなぐと、ルーター等にはなんの手を加えることなくインターネット側からアクセスできるようになります。

　
<img src="https://pagefaultblog.files.wordpress.com/2017/02/mqtt.png?w=640" width=300>
　**MQTT**(Message Queue Telemetry Transport)は、IoTなどでよく使われる、メッセージ配信プロトコルです。
　送信側は、受信側の都合は気にせず、送りたい内容だけ意識して送信すればよい。受信側は、送信側の都合は気にせず、欲しい情報を好きな時に受信すればよい。そういう、ゆるく(?)て軽量なコミュニケーションができます。

　
<img src="https://beebotte.com/asset/img/PubSubArchAll.png" width=300>
https://beebotte.com/
　**beebotte**は、MQTTのプロトコルが使えるブローカーサービスです。
　beebotteのよいところは、**REST to MQTTブリッジサービス**が用意されている点で、普通の **HTTP POST** でメッセージを送信することができます。

#おうちのコンピューターのトリガーをひいてスマートなことをする：
　Google Home 特徴は、何と言っても**「ずば抜けた音声認識精度」**です。
　テレビがついて音が鳴っていても、5m離れたところからでも、**「ねぇgoogle、外の温度は?」**と呼びかければ**「新宿の気温は15度です」**と答えてくれます。

###たとえばその1。
　あらかじめ、自分の通勤経路で使用する鉄道会社の運行情報をWebで調べて問題があればそれを読み上げるアプリを作っておきます。
　このアプリを、上記の Google Home トリガーで動作するようにしておき、**「ねぇgoogle、今日は出社できるかな」**と話しかけると、**「残念ながら無事出社できそうですよ、今日もお仕事頑張ってくださいね」**とPCから喋る音声ソリューションができます。
※本当は Google Home が喋るのが良いのですが、できるけどすごく面倒なのでPCで喋らせるのが現実的です。どうしてもやりたい場合は、以下が参考になります。
>Google Homeで時報を知らせる
https://qiita.com/udon11/items/fef44cec7b243f93151b

###たとえばその2。
　NHKは、**NHK番組表API**という番組表の情報をJSONで受け取ることができるサービスを公開しています。**「次の直虎のタイトルは何?」**とか、**「今日のNHKの放送終了時刻は何時?」**とか、やや便利そうなものがつくれます。
>NHK番組表API
http://api-portal.nhk.or.jp/

###ほかにも。
　PCゲームをプレイ中に**「ねぇgoogle、録画を開始」**という音声キーワードでプレイ動画を撮れるようにしておくと、両手はゲーム操作を続けたままで、音声入力という新しいチャネルでアクションが実行できます。
※もちろん、あらかじめトリガーを受け取るアプリを作っておく必要があります。

#まとめ
　これまでの音声入力のいちばんの問題は、**「しゃべってんのにうまく認識されねー！」**でした。
　ここが、かなり良い感じに解決されているのが今年のスマートスピーカー。
　やっとくとよいですよ。