kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Actions SDKのレスポンス指定について色々調べてみた

Googleの新しい対話モデル構築ツールである「Actions Builder」使っていますか?

Dialogflowに比べるといくらか複雑性が減って、シンプルなものであればwebhookでバックエンドに流さなくても、Actions Builderだけでかんたんに対話モデルやレスポンスを作ることができます。こんな感じですね。

f:id:kun432:20210110222406p:plain

Actions SDKだとこうなります。

handler:
  staticPrompt:
    candidates:
    - promptResponse:
        firstSimple:
          variants:
          - speech: これはActions Builderのテストです。 
transitionToScene: actions.scene.END_CONVERSATION

これをテストシミュレータで実行してみるとこんな感じでレスポンスが返ってきます。

f:id:kun432:20210110223303p:plain

このようにYAMLでいろいろなパラメータを設定していくやり方になっています。このYAMLについては、以下のようにリファレンスに載っています(一例としてIntentEventのリファレンスへのリンクです)

developers.google.com

詳しくはこのリファレンスを・・・というところですが、見ててもいまいちピンとこないw そこでいろんなパラメータを実際に試してみました。なお、webhookによる動的なものは今回扱いません。Actions Builder上で設定できるスタティックなもの限定です。

目次

デバイスごとに切り替える(candidates/selector)

candidatesは、selectorと組み合わせてデバイスごとにレスポンスを変えます。

candidates:
  - selector:
      surface_capabilities:
        capabilities:
          - RICH_RESPONSE
    first_simple:
      variants:
        - speech: これはActions Builderのテストですよ。
    content:
      card:
        title: テスト用画像
        text: テスト用画像です
        image:
          url: >-
            https://example.com/example.png
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。

candidatesはarrayになっています。上から順に評価されて、selectorで合致したものをレスポンスとして返してそこで終了します。selectorでは、surface_capabilities.capabilitiesでデバイス側の機能を指定します。

上記の例だと、リッチレスポンス対応機種、つまり、スマホのGoogleアシスタントやNest Hubなどの画面付きデバイスの場合はカードを表示するとともに音声レスポンスを返しますが、非対応の場合、つまりGoogle Homeなどのスマートスピーカーの場合は音声レスポンスだけを返します。(「Voiceflow&VUI 虎の巻」の表紙画像を使ってみました)

f:id:kun432:20210111140431p:plain

選択できるcapabilitiesには以下のようなものがあります。

  • SPEECH
    • TTSやSSMLで発話ができるもの
  • RICH_RESPONSE
    • カードやテーブルなど、リッチレスポンスを表示できるもの
  • LONG_FORM_AUDIO
    • 音楽やポッドキャストなどのメディアファイルを再生できるもの
  • INTERACTIVE_CANVAS
    • インタラクティブキャンバス対応
  • WEB_LINK
    • ブラウザを開けるもの
  • HOME_STORAGE
    • ホームストレージ対応

静的なレスポンスいろいろ

candidatesの配列に入れることのできる静的なレスポンスには以下のようなものがあります。(Actions SDKを見ていると、実際にはStaticPromptCandidateという階層が一枚挟まれるようですが、Action Builderでは指定不要みたいです)

  • first_simple
    • 最初に発話されるテキストのみのレスポンス
  • content
    • カード、リスト、テーブルなど、主にメディアを扱うレスポンス
  • last_simple
    • 最後に発話されるテキストのみのレスポンス
  • suggestions
    • ユーザに次の選択や発話等をしやすくするために表示するヒント
  • link
    • アプリやサイトへのリンク
  • canvas
    • インタラクティブキャンバス

全部は紹介しませんが、少し見ていきましょう。

first_simple/last_simple

first_simpleとlast_simpleはともにテキストのみのレスポンスです。firstが最初、lastが最後に実行されます。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。
    last_simple:
      variants:
        - speech: さようなら。

f:id:kun432:20210111143949p:plain

これだけであればどっちか片方だけも事足りますが、次に紹介するcontentはこの最初と最後に間に入るようになっています。最初に紹介したサンプルのようにカードを表示してみます。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。
    content:
      card:
        title: テスト用画像
        text: テスト用画像です
        image:
          url: >-
            https://exampl.com/example.png
    last_simple:
      variants:
        - speech: さようなら。

このようにcontentを挟む感じになります。

f:id:kun432:20210111144420p:plain

content

contentはメディアを扱うレスポンスで、さらにいくつかの種類があります。

  • card
    • カードを表示
  • image
    • 画像を表示
  • table
    • 表を表示
  • media
    • メディアを再生
  • list
    • 選択可能なリスト形式のカードを表示
  • collection
    • 選択可能なリスト形式のカードを表示。listとほぼ同じ?
  • collectionBrowse
    • ウェブページのリスト形式をカードで表示
  • suggestions
    • ユーザに次の選択や発話等をしやすくするために表示するヒント

いくつか紹介します。

image

画像を表示します。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。
    content:
      image:
        url: >-
            https://example.com/example.png
        alt: サンプルの画像です。
        height: 100
        width: 100
    last_simple:
      variants:
        - speech: さようなら。

こんな感じになります。カード表示とそんなに変わらないですが、画像サイズを指定したりできます。

f:id:kun432:20210111150313p:plain

list

選択可能なリスト形式で表示します。リストの項目にはこちらも「Voiceflow&VUI 虎の巻」のメンバーを使わせてもらいました。ユーザに選択を促すことになるので、ここでEND_CONVERSATIONにトランジションすることはできません。

タップするとtitleで指定されている文字列が送信されます。つまり、ここを発話したのと同じことになります。keyはおそらくslot typeだと思ってますがちょっと未確認。そのうち試します。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。知りたい著者を選択してください。
    content:
      list:
        title: 著者一覧
        subtitle: 選択してください。
        items:
          - key: author
            title: kun432
            description: 普段の仕事では一切 VUI に関わっていないインフラエンジニア。関⻄の VUIイベントによく出没してます。
            image:
              url: >-
                https://example.com/kun432.jpg
          - key: author
            title: がおまる
            description: スマートスピーカーが好きすぎて、本まで執筆しちゃいました! 色々連携したがる変なおじさん。「業界荒らし」や「がおってる!」と言われている。
            image:
              url: >-
                https://example.com/gaomar.jpg
          - key: author
            title: 福村浩治
            description: 福岡で VUI コミュニティ「VUI Fukuoka」を主催している介護エンジニア。介護、障害福祉への活用目的で、VUI に注目しています。 
            image:
              url: >-
                https://example.com/fukumura.jpg

f:id:kun432:20210111152013p:plain

media

mediaはオーディオを再生するためのレスポンスのようです。mediaTypeで指定できるものをざっと見る限りはオーディオ専用ですね。 SSMLのオーディオ(240秒)と違って時間の制約はありません。mediaObjectsでimageを指定することでジャケット画像のような表示も可能です。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。オーディオを再生します。
    content:
      media:
        mediaType: AUDIO
        mediaObjects:
        - name: 秋の音
          description: 秋の音をお楽しみください。
          url: https://example.com/audio.mp3
          image:
            large:
              url: https://example.com/jacket.png 

実際に表示すると、再生や一時停止などもコントロールできるようになっています。

f:id:kun432:20210111163022p:plain

suggestions

suggenstionsは、次に選択可能なヒントを表示します。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。ヒントを表示します。
    suggestions:
      - title: "はい"
      - title: "いいえ"

こういう感じですね。タップするとtitleが発話内容として送信されます。

f:id:kun432:20210111165029p:plain

バリエーションをつける(variants)

variantsはレスポンスにバリエーションを付けます。複数記載すると、そのうちの1つがランダムに選択されます。

candidates:
  - first_simple:
      variants:
        - speech: これはActions Builderのテストです。
        - speech: これはActions Builderのテストですよ。
        - speech: これはActions Builderのテストですよーだ。

起動するたびに発話内容が変わっていますね。

f:id:kun432:20210111141222p:plain

まとめ

ということで、Actions SDKで定義されているレスポンスを色々見てみました。いろいろなレスポンスのバリエーションがあってよいですね。

少しだけ注意が必要なのはリファレンスに記載されているものと、Actions BuilderのYAMLエディタで入力する内容は微妙に違う場合があるということですね(firstSimpleとfirst_simpleとか)。Actions Builder上ではレスポンス部分しかいじれないのですが、gactionsコマンドでYAMLファイルを使う場合はレスポンス以外の設定(条件の指定やシーンの遷移など)もすべて指定できるので、この辺の違いによるのかもしれません。ご注意ください。

レスポンスについてざっくり概要を掴むには以下ドキュメントが参考になりますので、合わせてご覧ください。