Получение значения слота 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.

Означает ли это, что ключом к получению слота является имя, которое я установил в модели взаимодействия? Единственная причина, по которой я не решаюсь так думать, заключается в том, что у нас уже есть объект имени в слоте, который определенно является именем слота - поэтому, если способ доступа к конкретному слоту был через имя, параметр имени был бы быть избыточным (вы уже знаете имя из доступа к слоту.)

Кто-нибудь знает, как я могу получить доступ к отдельным значениям слотов в навыке Alexa?

Кстати, я использую NodeJS для этого навыка.


person Bill L    schedule 19.01.2016    source источник


Ответы (4)


Поскольку у меня было много проблем с этим, более конкретный ответ (сейчас):

'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"
                }
            ]
        }
    ]
}
person Thomas Kekeisen    schedule 15.03.2017
comment
Какой тип this в this.emit() и this.event... и т. Д.? - person akshay2000; 06.02.2018
comment
Это ключевое слово. В JavaScript то, что называется this, является объектом, которому принадлежит код JavaScript. Значение this при использовании в функции - это объект, которому принадлежит функция. Значением this, при использовании в объекте, является сам объект. Ключевое слово this в конструкторе объекта не имеет значения. - person Suneet Patil; 12.07.2018
comment
Как использовать this.emit в php. Я делаю код на php, и мне нужна эта функция для выполнения. - person Rahul Gupta; 08.08.2018

Это пример намерения вашей структуры:

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

Итак, это означает, что используемое вами намерение называется «намерение фильма» (то, которое вы установили в своей модели взаимодействия). И вы получите значение таким образом:

var movieSlot = intent.slots.Movie.value;
person Octavio    schedule 02.02.2016

По состоянию на июль 2019 г .: вы можете получить к нему доступ в обработчике намерений следующим образом

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

person navule    schedule 17.07.2019

Предположим, у нас есть намерение с именем создать запрос на встречу в модели взаимодействия.

"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 - Объект содержит полный запрос JSON от Alexa. Таким образом, вы можете получить доступ к любому слоту, используя имя слота. Например: если мы хотим получить доступ к subject slot, мы можем использовать this.event.request.intent.slots.subject.value

person Suneet Patil    schedule 10.07.2018