IntentRequest内でCustom Slot Typeの同義語の情報を取得する


Alexa SkillのBuilder BETAを使うと以下のようにスロットに同義語(Synonyms)を設定できる。

{
  "languageModel": {
    "types": [
      {
        "name": "TRAIN",
        "values": [
          {
            "id": "HANKYU",
            "name": {
              "value": "HANKYU",
              "synonyms": [
                "はんきゅう",
                "阪急",
                "阪急電車"
              ]
            }
          }
        ]
      }
    ]
    // 省略
  }
}

これによって、 TRAIN スロットで使われる はんきゅう 阪急 阪急電車 は同じ意味だと認識されるようになるため、 Intentを作って 「TRAIN の運行情報を教えて」 というようなUtterancesを定義する時に、ユーザーが はんきゅう 阪急 阪急電車 のどの言葉を使った場合でも阪急電車の運行情報を応答するというような対話機能が実現できる。詳細は下記の公式にまとめられている。

スロットタイプ値の同義語とIDを定義する(エンティティ解決) | Custom Skills

そしてWebHookをLambdaなどで処理する時もこの同義語の情報をIntentRequestから取得することができると 公式にも解説 されている。

上記の同義語設定によるIntentRequestでは以下のように slots.Train.resolutions 配下に同義語の情報がセットされたリクエストを取得できる。

{
  "type": "IntentRequest",
  "requestId": "amzn1.echo-api.request.***********",
  "timestamp": "2017-12-28T09:16:19Z",
  "locale": "ja-JP",
  "intent": {
    "name": "TrainStatusIntent",
    "confirmationStatus": "NONE",
    "slots": {
      "Train": {
        "name": "Train",
        "value": "阪急",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.********.TRAIN",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "HANKYU",
                    "id": "HANKYU"
                  }
                }
              ]
            }
          ]
        },
        "confirmationStatus": "NONE"
      }
    }
  }
}

ここで注意点として、開発者コンソールのサービスシュミレーターでは resolutions がセットされず、同義語の情報は取得できない。

よく読むと公式にも以下のように注意書きがある。

開発者ポータルの「テスト(Test)」ページにあるサービスシミュレーターでは、エンティティ解決はサポートされていません。シミュレーターから送信されるJSONリクエストには、新しいresolutions情報は含まれていません。

ドキュメントをちゃんと読めばわかることではあるが、Amazon Developer ForumsでSynonymsのIDが取得できないと言っている人がいたりしてややこしい。

Alexa not sending slot ID in requests | Amazon Developer Forums

BETA版なのでバグなのかとも思え、混乱しそうなのでまとめておいた。

参考