Google HomeからのリクエストかどうかをWebhookで判別する


Google AssistantはAndroid 6.0以降のAndroidから利用される場合とGoogle Homeから利用される場合があります。DialogflowのFulfillmentからのWebhookをHerokuなどで受けてレスポンスを返すようなAPIを作った場合、リクエストがGoogle Homeからなのかスマホからなのかを判別して返すメッセージを変えたいケースがあります。たとえば、応答時にアプリへ誘導したい場合はスマホからの場合は「詳細を確認する場合はアプリを起動してください」と返し、Google Homeの場合は「スマホがあればアプリから詳細を確認できます」というように応答メッセージが微妙に変わる場合や、天気などの情報であればディスプレイのあるスマホには天気のアイコンを返すなどです。

surface.capabilities をチェックする

リクエストのJsonの surface.capabilities プロパティをチェックします。

{ "originalRequest":
  {
    //...省略
    "data":
    { 
      // ...省略
      "surface": { "capabilities": [ 
        { "name": "actions.capability.AUDIO_OUTPUT" } 
        { "name": "actions.capability.SCREEN_OUTPUT" }
      ] },
      // ...省略
    }
  }
}

AUDIO_OUTPUT は音声の返信が可能であることを表し、SCREEN_OUTPUT は画面表示が可能であることを表します。配列型のプロパティのためスマホの場合は両方、スピーカーの場合は AUDIO_OUTPUT だけが設定されたリクエストが送られてきます。

AppRequest  |  Actions on Google  |  Google Developers

アプリ自体の設定

そもそもGoogle Homeだけに対応したいような場合はAction on Googleに設定することができます。

Google Homeでしか使えないピカチュウのアプリはこの設定がされていると思われます。

Google Japan Blog: Google Home で、ピカチュウとお話しよう!

補足

スマホとスピーカーで会話を分岐させるような場合はDialogflowのIntentsでContextを設定することで特定のSurfaceのみをトリガーとするようにIntentを設定することができるらしい。主題と外れてきたので割愛。このようなSurfaceの制御については、上記のケースも含めて公式ドキュメントにまとめられているので詳細はそちらを参照ください。

Surface Capabilities  |  Actions on Google  |  Google Developers