GoogleHomeの機能拡張準備~サーバ編~(第4回)

こんにちは。ミーヤキャットです。

前回はGoogleHomeの機能を拡張するための準備として、Pythonの導入やツールの導入をしました。
今回は作成したプログラムを実行させるサーバの準備を解説します。

  1. GoogleHomeの初期設定と使い方(第1回)
  2. Action on Google&DialogFlowで機能拡張(第2回)
  3. 機能拡張準備~クライアント編~(第3回)
  4. 機能拡張準備~サーバ編~(第4回)
  5. 窓口業務アシスタント作成(第5回)
  6. 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に返すのがゴールです。

  1. Pythonのパスを修正します。レンタルサーバによってPythonの配置場所が違うのでマニュアル等で確認しましょう。
  2. WebhookRequestを受け取る処理を追加します。
  3. FTPツールでレンタルサーバに接続し、作成したプログラムをアップロードします。
  4. プログラムファイルの実行権限を与えます。

作成した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すると認証が有効になります。
一回わざとユーザかパスワードを間違えて「テスト用アプリから応答がありません」となれば認証が有効になっていることが確認できます。


いかがでしたか?今回はサーバの準備を行いました。
次回はサーバサイドのアプリを少し本格的にしてみようと思います。

=======================
記事についてはリンクフリーですが、著作権は放棄していません。
また、この記事は個人の見解を示したものであり、書かれている情報を元に生じた損害についての保証は行いません。
書かれている内容が事実と異なる場合や、人権、知的財産権を侵害している場合は、問合せフォームよりご連絡ください。訂正、削除を行います。
=======================

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です