私はAlexaスキルの構築に取り組んでおり、インテントオブジェクトからスロット値を取得する際の障害に遭遇しました。インテントオブジェクトJSONは次のようになります。
"intent": {
"name": "string",
"slots": {
"string": {
"name": "string",
"value": "string"
}
}
}
私の質問は、スロットを識別するための最初の「文字列」値は何でしょうか?ドキュメントにはこれがあります:
A map of key-value pairs that further describes what the user meant based on a predefined intent schema. The map can be empty.
The key is a string that describes the name of the slot. Type: string.
The value is an object of type slot. Type: object. See Slot Object.
これは、スロットを取得するための鍵が、インタラクションモデルで設定した名前であることを意味しますか?私がそれを考えるのをためらう唯一の理由は、スロットにすでに名前オブジェクトがあり、それは間違いなくスロットの名前であるためです-したがって、特定のスロットにアクセスする方法が名前を介していた場合、nameパラメータは冗長である(スロットにアクセスすることで名前をすでに知っている)。
Alexaスキルで個々のスロット値にアクセスする方法を知っている人はいますか?
ちなみに私はこのスキルにNodeJSを使用しています。
私はこれに多くの問題を抱えていたので、より具体的な答えは(今)次のとおりです:
'PersonIntent': function () {
var text = 'Hello ' + this.event.request.intent.slots.FirstPerson.value;
this.emit(':tell', text);
},
このインテントスキーマを使用すると:
{
"intents": [
{
"intent": "PersonIntent",
"slots": [
{
"name": "FirstPerson",
"type": "Amazon.DE_FIRST_NAME"
}
]
}
]
}
これは、構造のインテントの例です。
"intent": {
"name": "MovieIntent",
"slots": {
"string": {
"name": "Movie",
"value": "Titanic"
}
}
}
つまり、これは、使用しているインテントの名前がMovie Intent(インタラクションモデルで設定したもの)であることを意味します。そして、あなたはこの方法で価値を得るでしょう:
var movieSlot = intent.slots.Movie.value;
2019年7月現在:次のようにインテントハンドラーでアクセスできます
if (handlerInput.requestEnvelope.request.intent.slots.SLOTNAME === undefined) {
text = 'Hello! SLOTNAME not identified';
} else {
text = 'Hello!, SLOTNAME identified: ' + handlerInput.requestEnvelope.request.intent.slots.SLOTNAME.value;
}
SLOTNAME
をスロット名に置き換えます。 undefined
がオブジェクトと同じであり、undefined
ではないことも非常に重要です。
インタラクションモデルで会議出席依頼を作成するという名前のインテントがあると仮定します。
"intents": [
{
"name": "CreateMeetingRequest",
"slots": [
{
"name": "meetingdate",
"type": "Amazon.DATE",
"samples": [
"{meetingdate} at {meetingTime} for {duration}",
"{meetingdate} at {meetingTime}",
"{meetingdate} and {meetingTime}",
"{meetingdate}"
]
},
{
"name": "meetingTime",
"type": "Amazon.TIME",
"samples": [
"{meetingTime} for {duration}",
"{meetingTime}"
]
},
{
"name": "duration",
"type": "Amazon.DURATION",
"samples": [
"{duration}"
]
},
{
"name": "subject",
"type": "Amazon.SearchQuery",
"samples": [
"{subject}"
]
},
{
"name": "toName",
"type": "Amazon.US_FIRST_NAME",
"samples": [
"{toName}"
]
}
],
"samples": [
"meeting invite",
"set up meeting",
"setup meeting",
"{meetingdate} at {meetingTime}",
"create meeting with {toName}",
"schedule a meeting with {toName} on {meetingdate} at {meetingTime} for {duration}",
"Setup meeting with {toName}",
"create meeting",
"Setup meeting on {meetingdate} at {meetingTime}",
"Setup new meeting",
"create meeting request"
]
}
]
そして、ラムダコードでアクセスしたいと思います。以下の行を使用できます。
'CreateMeetingRequest': function () {
const toName = (this.event.request.intent.slots.toName.value ? this.event.request.intent.slots.toName.value.toLowerCase() : null);
const subject = (this.event.request.intent.slots.subject.value ? this.event.request.intent.slots.subject.value.toLowerCase() : null);
const meetingdate = (this.event.request.intent.slots.meetingdate.value ? this.event.request.intent.slots.meetingdate.value : null);
const meetingTime = (this.event.request.intent.slots.meetingTime.value ? this.event.request.intent.slots.meetingTime.value : null);
const duration = (this.event.request.intent.slots.duration.value ? this.event.request.intent.slots.duration.value : null);
console.log("toName:",toName,", meetingdate:",meetingdate,", meetingTime:", meetingTime);
//your business logic
},
this
は、Alexaからの完全なJSONリクエストが含まれているオブジェクトです。したがって、slotnameを使用して任意のスロットにアクセスできます。例:subject slot
にアクセスする場合は、this.event.request.intent.slots.subject.value
を使用できます。