クマは森で用を足しますか?

アウトプットは重要です。

フォールバックインテントからユーザーの発話内容を取る

下記の Google Home 用アプリを作っているときに、ユーザーの発話内容をそのままアプリ側で受け取る方法を調べていました。また同じことやるときに調べるような気がするので、ここにメモしておきます。

cheerio-the-bear.hatenablog.com

フォールバックインテントで発話内容を全て取る

ユーザーに自由に発話された内容の全てを取得したかったので、通常の(フォールバック用ではない)インテントを使って発話例の全てを @sys.any にしちゃってました。確かにその方法でもユーザーの発話内容の全てを期待通りに取得することができるのですが、@sys.any 指定時に下の警告が表示されるようになっています。

f:id:cheerio-the-bear:20190110233530p:plain
ユーザーの発話例全てを @sys.any にすると表示される警告

特に問題ないならいいかと思って使い続けていたのですが、どうも駄目みたいです。別のコンテキストで同様に全ての発話内容を取りたくなって、同じようなインテントを追加したのですが、優先順位をうまく制御することができませんでした。そうなる理由の見当も付かなかったのですが、低い優先順位にしている方にマッチングしてくれたりしたので、方針を転換。警告に従ってフォールバックインテントを使うことで、不思議な現象から解放されました。

arguments のパラメータを get() で取る

Dialogflow の Web UI 上では見せてもらえていませんが、フォールバックインテントJSON リクエストにはユーザーの発話内容も載せられます。実際の JSON リクエストから引用したものがこちらですが、ユーザーが発話した "hello" が "text" 引数として載せてくれています。

      "inputs": [
        {
...
          "arguments": [
            {
              "rawText": "hello",
              "textValue": "hello",
              "name": "text"
            }
          ],
          "intent": "actions.intent.TEXT"
        }
      ],

これをどのように取るんだろうと思案していたのですが、これで取れました。

    let conv = agent.conv();
    conv.arguments.get('text')