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版なのでバグなのかとも思え、混乱しそうなのでまとめておいた。