web-dev-qa-db-ja.com

意図からAlexaスロット値を取得する

私は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を使用しています。

6
Bill L

私はこれに多くの問題を抱えていたので、より具体的な答えは(今)次のとおりです:

'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"
                }
            ]
        }
    ]
}
18
Thomas Kekeisen

これは、構造のインテントの例です。

"intent": {
    "name": "MovieIntent",
    "slots": {
     "string": {
        "name": "Movie",
        "value": "Titanic"
     }
  }
}

つまり、これは、使用しているインテントの名前がMovie Intent(インタラクションモデルで設定したもの)であることを意味します。そして、あなたはこの方法で価値を得るでしょう:

var movieSlot = intent.slots.Movie.value;
11
Octavio

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ではないことも非常に重要です。

2
navule

インタラクションモデルで会議出席依頼を作成するという名前のインテントがあると仮定します。

"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を使用できます。

0
Suneet Patil