物欲の秋ですね。
Google Homeを買ったので遊んでみました。
Google Homeとは
Googleが発売したスマートスピーカーです。
スマートスピーカーとは、話しかけることで、インターネットを通じてさまざまな機器と連携したり、ニュースや天気予報なんかを教えてくれる機器の総称です。
競合としては、AmazonのEchoやLINEのClovaなんかが挙げられます。
ちなみに今のところシェアはEchoが1位です。
Google Homeで出来ること
こちらのビデオをどうぞ。
Google HomeにはGoogleアシスタントと呼ばれるAIが搭載されていて、様々な問いかけに答えてくれます。
個人的にはリラックスする音楽かけて〜でいい感じに流してくれるのが気に入りました。
今後、連携サービスが増えていくみたいですね。
http://japanese.engadget.com/2017/10/04/ai-google-home/
それと、スマホのGoogleアシスタントやSiriは結構声を張らないと認識してくれない印象なのですが、こいつは割とボソボソ喋っても認識してくれます。
日常に溶け込むと言う点でこれはありがたかったです。
api.aiとActions on Googleで遊んでみたよ
api.ai : https://api.ai/
Actions on Google : https://developers.google.com/actions/
api.aiを使えば、Google Homeアプリが手軽に作れると聞いて、触ってみました。
Google Home(Google アシスタント)との接続にはActions on Googleを使用します。
この連携のはじめの一歩には、こちらの記事を参考にさせて頂きました。
Actions on Googleでapi.aiを使ってGoogle Homeに何か言わせてみる – Qiita
api.aiは自然言語処理をいい感じにやってくれてAPI化してくれるサービスです。
Googleが買収したので、Googleアシスタントとの連携も簡単。
プロジェクトを作るとGCP/Firebaseにも同名でプロジェクトが作られます。
今回作るのは、
「今日は何ゴミの日?」
今日は燃えるゴミの日です。
みたいな会話が出来るbotです。
まずapi.aiについて調べました。
大きくEntitiesとIntentsと呼ばれる2つの概念と、外部サービスとのIntegrationが存在します。
Entities
AI用のデータベースみたいなものです。
@genki-nai
は、体力、精神、仕事、子育て
みたいなヒモ付ができます。
ここで定義した単語を次のIntentsでのトリガーに使用することができます。
Intents
トリガーとレスポンスを定義します。
トリガーの例 : @genki-naiがつらい
レスポンスの例 : げんき
あらかじめ定義したいくつかの単語をフックして特定の返答をする例です。
予め、「今日」→「日付」とか、「浜田山」→「緯度経度」
みたいなEntitiyが定義されていて、言語解析に使用できます。
try
Entitiesで定義した人生という単語と、子育てや仕事などを紐付けて返答が返ってきました。
JSONで見ると、このように解析されています。
{
"id": "e84bec73-b2da-4485-868c-129d81b311a5",
"timestamp": "2017-10-09T04:05:25.277Z",
"lang": "ja",
"result": {
"source": "agent",
"resolvedQuery": "子育てがつらい",
"action": "",
"actionIncomplete": false,
"parameters": {
"genki-nai": "人生"
},
"contexts": [],
"metadata": {
"intentId": "fa350d49-7a1c-4191-844b-1d4f9ceff956",
"webhookUsed": "false",
"webhookForSlotFillingUsed": "false",
"intentName": "元気出して"
},
"fulfillment": {
"speech": "人生 がつらいだって? 元気出して!",
"messages": [
{
"type": 0,
"id": "3dc30f75-1ba6-4ed2-b061-aea17e777844",
"speech": "人生 がつらいだって? 元気出して!"
}
]
},
"score": 1
},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "4d5fe34c-59d7-49f8-808a-8e6a77418fae"
}
発せられた特定のワードをフックして動作するbotのようなものが作れそうです。
Integrations
入力と出力に外部サービスが使えます。
今回のGoogle Assistantの他にSlackやFacebook Messengerなどとも連携できます。
ゴミの日bot
本題に戻って、ゴミの日botです。
今日は 何ゴミの日?
僕の住んでいる住所に限定するのであれば、今日と言う単語から曜日を拾ってしまえば単純なマッピングから何ゴミの日か返せばよさそうです。
そう思って調べたところ、「今日は」から日時は取れるけど曜日が取れませんでした。
よくよく見てみると、条件分岐も1つのIntentでの定義はできないようです。
(複数のIntentを組み合わせればできる気もします。)
api.aiはシンプルに言語解析のハブのようなイメージなのだなーと改めて理解しました。
そこで、外部サービスとの連携を試します。
Fulfillmentを使って外部サービスと連携する
ようはWebhookです。
Intentsで解析した結果をJsonで外部サービスに渡すことができます。
今のところ、現在地の天気を取得するような高度なことをしたければこれを使う想定のようです。
今回はこんな構成にしてみました。
Actions on Google -> api.ai -> Firebase functions
今の日時の自分の地域のゴミ予定を返すだけのAPIを作りました。
https://github.com/ymegane/suginami-garbage-date/blob/master/functions/index.js
これで、Google Assistantから要求を受けたら、api.aiでリクエストを受けて、
Webhookで今日と明日のごみ収集予定を返すことができました。
Actions on Google側の設定も多少必要ですが、今回は端折ります。
動作イメージ(Actions on Google上のシミュレーターで確認)
Google Home上での確認
振り返ってみると、これくらいならapi.aiは不要な感じがしますが、Slackなんかとも連携するのであれば便利そうです。
まとめ
api.aiとActions on Googleを使うと、ユーザーの文脈をいい感じに取得できます。
- デバイスの位置情報から適切な地域のゴミ予定を返す
- ログインさせて場所を設定させる
- 火曜日は?みたいな自然な問いかけに対応する
などなど、色々可能性はありそうです。
Actions on Googleは今回はDRAFT機能を使ってテストアプリとして動作させました。
正式なアプリとして配布するには申請が必要です。
情報が少なすぎて、まだ良くわかっていません。
申請時に、他のアプリとトリガーワードが被ってたりするとまずそうな雰囲気を感じました。
(つよいトリガーワードをとったベンダーが勝つみたいなのありそうです。)
取り急ぎ、奥さんにやや喜ばれたので成功ということにしておきます。