【问题标题】:Getting an Alexa Slot value out of an intent从意图中获取 Alexa Slot 值
【发布时间】:2016-04-25 13:20:08
【问题描述】:

我正在努力构建 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 进行这项技能。

【问题讨论】:

    标签: json node.js alexa alexa-skills-kit alexa-skill


    【解决方案1】:

    由于我在这方面遇到了很多麻烦,因此(现在)更具体的答案是:

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

    【讨论】:

    • this.emit()this.event...等中的this是什么类型?
    • this 关键字。在 JavaScript 中,称为 this 的东西是“拥有” JavaScript 代码的对象。当在函数中使用时,this 的值是“拥有”该函数的对象。当在对象中使用时,this 的值是对象本身。对象构造函数中的 this 关键字没有值。
    • 如何在php中使用this.emit。我正在用 php 编写代码,我需要执行此功能。
    【解决方案2】:

    这是您的结构的意图示例:

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

    因此,这意味着您使用的 Intent 被命名为:Movie Intent(您在交互模型中设置的那个)。您将通过这种方式获得价值:

    var movieSlot = intent.slots.Movie.value;
    

    【讨论】:

      【解决方案3】:

      截至 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

      【讨论】:

        【解决方案4】:

        假设我们在交互模型中有一个名为 create meeting request 的意图。

        "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"
                ]
            }
        ]
        

        你想在 lambda 代码中访问它。您可以使用以下几行。

        '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

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 1970-01-01
          • 2017-06-25
          • 1970-01-01
          • 2018-02-19
          • 2018-08-20
          • 1970-01-01
          • 2023-03-25
          • 2023-04-10
          相关资源
          最近更新 更多