GoogleHomeの機能拡張準備~サーバ編~(第4回)
こんにちは。ミーヤキャットです。
前回はGoogleHomeの機能を拡張するための準備として、Pythonの導入やツールの導入をしました。
今回は作成したプログラムを実行させるサーバの準備を解説します。
- GoogleHomeの初期設定と使い方(第1回)
- Action on Google&DialogFlowで機能拡張(第2回)
- 機能拡張準備~クライアント編~(第3回)
- 機能拡張準備~サーバ編~(第4回)
- 窓口業務アシスタント作成(第5回)
- GoogleHome×ラズベリーパイ~カメラとの連動~(第6回)
まず、構築しようとしている全体をおさらいしましょう。
Dialogflowのユーザ登録
まずはGoogleアシスタントの拡張機能を使う準備が必要です。
Dialogflowにユーザ登録を行います。
Dialogflowのユーザ登録へ
「SING UP FOR FREE」を選択すると同期するアカウントが選択できるので、GoogleHomeで使用しているアカウントでユーザ登録します。
完了すると、下のようなTOP画面が表示されます。

Agentの追加
手始めに「Create Agent」を選んでAgentを追加しましょう。

Agentはアプリケーション全体を指すプロジェクトのようなものです。
AgentNameを入力し、使用する言語「Japanese」やタイムゾーン「GMT+9:00」を選択します。
また、やり取りする「API VIRSION」も「DialogFlow V2 API」を使います。
Intentsのカスタマイズ
Intentsは「○○と言われたら○○と応答する」というアプリケーション処理の単位です。
では少しカスタマイズしてみましょう。
Intentsを選んで、さらにDefaultWelcomeIntentsを選択してください。

DefaultWelcomeIntentsはアプリケーションが起動されたときに起動されるIntentsです。
様々なカスタマイズ箇所がありますが、Responsesつまりスピーカーからの応答を変更してみます。
「こんにちは!テスト用アプリだよ」「今日の調子はどうですか?」の2パターンを応答するようにカスタマイズしてみました。
こうすることで、イベント「テスト用アプリ起動時」に「こんにちは!テスト用アプリだよ」もしくは、「今日の調子はどうですか?」と応答するようになります。
動作確認
カスタマイズしたIntentsの動作を確認するにはIntegrationsからGoogleアシスタントを選び、TESTを押下しましょう。

Actions on Googleが起動するので、シミュレータで「テスト用アプリにつないで」を入力してみましょう。
「テスト用アプリにつないで」「テスト用アプリと話したい」はテスト用のアプリケーションを起動するキーワードです。
逆に止めたい場合は「止めて」と言えば止まります。
アプリケーションが起動され「こんにちは!テスト用アプリだよ」か「今日の調子はどうですか?」のどちらかが返ってくればカスタマイズ成功です。
このようにDialogFlow上でIntentsをカスタマイズしてもアプリケーションを作ることは可能ですが、今回は独自アプリを実行したいので独自サーバを用意します。
Webhookで呼び出す先のサーバ準備
Pythonで作成したプログラムを実行するためにPythonの実行環境の整ったレンタルサーバを借りましょう。
レンタルサーバの貸出サービスとしてはさくらインターネットやLolipopがありますが、私は取りあえずLolipopのスタンダードプランにしました。
ライトプランだとSSHが使えないのでサーバにログインしてPIPでパッケージを拡張したり、デバッグ起動をすることができませんでした。
SSHが使えるプランを選択したほうがいいでしょう。
スタンダードプランで初期費用が約1,600円、1か月の利用料が600円でした。他のサービスでもおおむねこの価格帯でのプランが多いですね。
Webhookで呼び出してみる
前回作成したHelloWorldを表示するプログラムを加工してGoogleHomeにHelloWorldといわせてみましょう。
プログラムの修正・配置
サーバの処理としてはJSONレスポンスをDialogFlowに返すのがゴールです。
- Pythonのパスを修正します。レンタルサーバによってPythonの配置場所が違うのでマニュアル等で確認しましょう。
- WebhookRequestを受け取る処理を追加します。
- FTPツールでレンタルサーバに接続し、作成したプログラムをアップロードします。
- プログラムファイルの実行権限を与えます。
作成したPythonソース
#!/usr/local/bin/python2.7
# -*- coding: utf-8 -*-
import json
import sys
reqJson = json.load(sys.stdin)
print('Content-type: application/json\n\n')
resJson ={
"fulfillmentText": "Hello World",
"fulfillmentMessages": [
{
"text": {
"text": [
"Hello World"
]
}
}
]
}
json.dump(resJson,sys.stdout)
呼び出しの設定
できたらDialogFlowでWebhookを有効にしてアップロードしたサーバアプリが呼ばれるようにしましょう。

WebhookURLに作成したサーバのプログラムを指定します。
ドメイン認証もEnableAll(すべて許可)に設定します。
ベーシック認証はひとまず来るもの拒まずで動かしてみましょう。ベーシック認証を設定する手順は後程説明します。
最後はDefaultFallbackIntentsでWebhookを呼び出すように設定します。

FallbackIntentsは発言が聞き取れないときに呼び出されるIntentです。
現時点では他のIntentが無いので、何を言ってもFallbackIntentsが呼び出されます。
いざ実行
エミュレータか、使っているGoogleHome、Google Assistantに「テスト用アプリと話したい」と入力してください。
うまくいけばWellcomeIntentで挨拶があり、その後、何か発言すれば「Hello World」と応答があるはずです。
もうひと手間セキュリティ設定
ここまでの設定ではWebhookのURLを誰でも呼び出すことができてしまうので、心配な方はアクセス制限をかけましょう。別にいいやって人は不要な設定です。
DialogFlowのWebhook呼び出しではBasic認証設定を行うことができます。
レンタルサーバ側
レンタルサーバの管理画面からツールを使ってアクセス制限するのが一番簡単です。
Lolipopだとユーザページのメニュー⇒セキュリティ⇒アクセス制限でアクセス制限を行うディレクトリやユーザ、パスワードの設定を行うことができます。
呼び出し側(Dialogflow)
WebhookのURLを設定する場所でBASIC AUTHの設定ができます。

ユーザ、パスワードを入力してSAVEすると認証が有効になります。
一回わざとユーザかパスワードを間違えて「テスト用アプリから応答がありません」となれば認証が有効になっていることが確認できます。
いかがでしたか?今回はサーバの準備を行いました。
次回はサーバサイドのアプリを少し本格的にしてみようと思います。
=======================
記事についてはリンクフリーですが、著作権は放棄していません。
また、この記事は個人の見解を示したものであり、書かれている情報を元に生じた損害についての保証は行いません。
書かれている内容が事実と異なる場合や、人権、知的財産権を侵害している場合は、問合せフォームよりご連絡ください。訂正、削除を行います。
=======================
