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を有効にします。

f:id:IKEP:20180612150842p:plain

 

次に関数を作成します。

f:id:IKEP:20180612150905p:plain

関数の設定は↓のような感じ。今回はDialogflowからのリクエストを受け取るので、トリガーはHTTPトリガーにする。ここに表示されるURLがトリガーになります。

f:id:IKEP:20180612150927p:plain

 

そして、コードはこんな感じ↓(右から左に流すだけです(^_^;))

index.js

 

package.json

 

あとは、dialogflowのwebhook先を先ほどのcloud FunctionsのURLに書き換えれば完成!

 

 

完成

完成形がこちら↓

 

すでに貸出中の物品ならエラーと言ったり、貸出完了なら返却期限を言ったりと、処理に応じた結果を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は、僕の声しか登録してないので他人の声は合成音声ソフトで代行しています。)