GoogleHomeアプリ改良編 ~Cloud Functionsを組み込む~
以前の記事でGoogleHomeを使った機材貸出返却システムを作成したことを書きました。(まだ、見てない方はこちらからどうぞ)
今回はこれの改良を行ったときのことについて書きます。
改良点
今までのシステムはGoogleHomeに「〜貸出!」という感じに話しかけると、Action on Google=>Dialogflow=>GoogleAppsScript(GAS)=>IFTTT(Webhooks)=>LINE通知という流れの処理でした。GASにデータを書き込んで、その処理結果をLINEに送って通知する形です。しかし、本来はGASからの結果をGoogleHomeに喋らせたかったのですが、GASからのJSONでのリターンはリダイレクトされるのでDialogflowでは受け取れないためにLINE通知という方法を仕方なく行っていました。(詳しくはこちら)
そこで今回はDialogflowとGASの間にサーバーをかまして、この問題を解決しました。私はGoogle Cloud Functionsを使いました。ネットでググるとAWSを使っているのが多いみたいなんで参考になれば幸いです( ̄∇ ̄)
Google Cloud Functionsとは
Google Cloud FunctionsはGoogleが提供するGoogle Cloud Platformの1つであり、JavaScriptで書かれた関数を実行するサービスです。関数はイベントによって発火されます。そのイベントの中にHTTPトリガーがあるため、HTTPリクエストがあった時に指定の処理を行うことができます。
今回はこの「指定の処理」が「DialogflowからのデータをGASに送り、GASからの処理結果をDialogflowにリターンする」というものです。
Google Cloud Functions導入
では、Google Cloud Functionsを触っていきます。
プロジェクトを作成したら、↓が表示されるのでAPIを有効にします。
次に関数を作成します。
関数の設定は↓のような感じ。今回はDialogflowからのリクエストを受け取るので、トリガーはHTTPトリガーにする。ここに表示されるURLがトリガーになります。
そして、コードはこんな感じ↓(右から左に流すだけです(^_^;))
index.js
package.json
あとは、dialogflowのwebhook先を先ほどのcloud FunctionsのURLに書き換えれば完成!
完成
完成形がこちら↓
前作ったサークル用の機材管理GoogleHomeアプリを改良しました。
— IKEP (@CreativeIKEP) 2018年5月27日
DialogflowとGoogle Apps Scriptの間にサーバー(Google Cloud Functions)をかますことで処理に応じた回答をGoogleHomeに喋らすことに成功したー!
サーバー関連、一切やったことなかったから苦労したε-(´∀`; )#googlehome pic.twitter.com/ubO4DA7kBr
すでに貸出中の物品ならエラーと言ったり、貸出完了なら返却期限を言ったりと、処理に応じた結果をGoogleHomeから喋らせれました!! (^o^)/
苦労したこと
DialogflowとGASの間にCloud FunctionsをかますことでGASからのJSONリターンのリダイレクトを防ぐようにしましたが、プログラムを書いてる時に気づいたことが.....
それは「Cloud FunctionsからGASヘのデータ送信をPOSTにすると、リダイレクトされる」ということです。これに気づくのにだいぶ時間を使いました。そのため、Cloud FunctionsからGASへはGET送信にして、GAS側もPOST受け付けからGET受け付けに変更しました。
これで理想のシステムが完成しました!
あとは喋っている人の認識かな.....
追記(2018/6/14)
誰が喋っているかの認識もできました!
Dialogflowから送られるJSONデータ内のuserIdで識別しています。GoogleHomeのVoiceMatchに登録されてる声はuserIdが変わらないので、これで喋ってる人を識別できます。
GoogleHomeアプリで話してる人の判別ができた〜!!
— IKEP (@CreativeIKEP) 2018年6月14日
自分の声だとシステムに書き込みできるが、違う人の声(今回は自作の合成音声ソフトの声)だとはじかれる
これで学籍番号を声で言ってたのを省けるようになった^_^#GoogleHome pic.twitter.com/kevuMJFPBN
(僕のGoogleHomeは、僕の声しか登録してないので他人の声は合成音声ソフトで代行しています。)