从意图中获取 Alexa Slot 值

Posted

技术标签:

【中文标题】从意图中获取 Alexa Slot 值【英文标题】:Getting an Alexa Slot value out of an intent 【发布时间】: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 进行这项技能。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于从意图中获取 Alexa Slot 值的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在alexa意图中传递alexa序列号吗?

如何为 Alexa 技能意图响应获取和使用确认“是”或“否”

Alexa Custom Slot 拾取额外的单词

Alexa 自定义插槽类型:没有意图的价值

Alexa无法识别意图

取消意图未调用 Alexa