[Alexa]スロットの値に設定したidを取得したい
アレクサ開発において、スロットの値に設定したid(オプション)の値を取得した時のメモ。
スロット値にidを設定する
デフォルトではブランクですが、スロットの各値にidを設定することができます。
Aの時は、これ。Bの時はこれと条件分岐で使用できるかなと思いidの値を取得してみます。
ちなみに、音声で呼び出された時は以下のようなJSONが出力されます。
"calc": {
"name": "calc",
"value": "足す",
"resolutions": {
"resolutionsPerAuthority": [
{
"authority": "省略",
"status": {
"code": "ER_SUCCESS_MATCH"
},
"values": [
{
"value": {
"name": "足す",
"id": "tasu"
}
}
]
}
]
},
valeuのidの箇所がまさに取得したい部分です。
で、取得したい時は以下のコード。変数calcに入れてます。
var calc = handlerInput.requestEnvelope.request.intent.slots.calc.resolutions.resolutionsPerAuthority[0].values[0].value.id;
ものすごい冗長ですけど、とりあえず上記コードで取得できます。
valueを取得したい
ここからはおまけ。ユーザーが音声で入力したいものを取得したい時。
「カフェラテちょうだい」
のカフェラテなどの部分です。
これはチュートリアルにも乗っている内容ですね。
var menu = handlerInput.requestEnvelope.request.intent.slots.menu.value;
ステータスコードがマッチしたか、していないかを取得したい
あらかじめ、こちらが指定する物に対してユーザーの言葉がマッチしたかしていないかを判定。
例えば、カフェラテ・コーヒーしかないコーヒーショップでユーザーが抹茶をオーダーしたケースです。
「カフェラテ(コーヒー)ください」→「かしこまりました、カフェラテ(コーヒー)ですね」
「抹茶ください」→「すいません、メニューにありません」
こんな感じの実装をしたい時です。
スロットにあらかじめ用意した単語以外をユーザーが発した時、JSONでノットマッチが返されます。
"calc": {
"name": "calc",
"value": "足す",
"resolutions": {
"resolutionsPerAuthority": [
{
"authority": "省略",
"status": {
"code": "ER_SUCCESS_MATCH"
},
"values": [
{
"value": {
"name": "足す",
"id": "tasu"
}
}
]
}
]
},
先ほどのコードで言うと、status→codeの箇所です。この場合、”ER_SUCCESS_MATCH”とマッチしたよと返されています。マッチしていない場合は、NOT_MATCHになります。
このステータスコードを取得します。
var status = handlerInput.requestEnvelope.request.intent.slots.calc.resolutions.resolutionsPerAuthority[0].status.code;