[Alexa]スロットの値に設定したidを取得したい

alexa

アレクサ開発において、スロットの値に設定した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;



カテゴリー