Alexa Skill - 如何在 Lambda 函数中检索槽值

Posted

技术标签:

【中文标题】Alexa Skill - 如何在 Lambda 函数中检索槽值【英文标题】:Alexa Skill - How to Retrieve Slot Value in Lambda Function 【发布时间】:2017-05-31 19:53:37 【问题描述】:

我正在开发一种具有一个 Intent 的 Alexa 技能,其中包括一个具有多个可能值的 Slot。

我的插槽是用"name" : "Channel""type" : "LIST_OF_CHANNELS" 和值定义的

    iqram 网格 菲尔 克莱德

如何检索说出的 槽值 以在我的 Lambda 函数中使用?这是“从话语部分中检索槽的值”,我正在寻找答案。非常感谢。

 // retrieve value of slot from utterance     
 var c = intent.slots.Channel.value; 

 // append value to end of URL that references API
 fetchEnseParse("/channel/" + c, function(body) 

 // continuation of this function is below 

【问题讨论】:

【参考方案1】:

var c = this.event.request.intent.slots.slotname.value

这应该会给你你正在寻找的东西。

【讨论】:

谢谢。那段小代码让我畅通无阻!您能否提供一些文档链接,我可以在其中阅读更多信息?谢谢!【参考方案2】:

如果您的 lambda 接收到,您可以在这里找到它...


  "request": 
    "type": "IntentRequest",
    "intent": 
      "name": "YourIntentName",
      "slots": 
        "slotname": 
          "name": "slotname",
          "value": "HERE!"
        
      
    ,
    "locale": "en-US"
  ,
 

事件被传递给您的 lambda 处理程序。

【讨论】:

【参考方案3】:
var c = this.event.request.intent.slots.Channel.value;

【讨论】:

【参考方案4】:

对我来说,以下工作:

event.currentIntent.slotDetails.<slot-name>.originalValue

其中slot-nameChannel

【讨论】:

【参考方案5】:

假设你对 alexa 说“coin”这个词,并且你将它编程为 bitcoin(主要对象名称)的同义词。

现在你可以得到 2 个结果。

首先:你得到原值“比特币”,即原值/匹配值

或者第二个:你得到口语价值“硬币”

第一个(比特币):

this.event.request.intent.slots.<yourslotname>.resolutions.resolutionsPerAuthority[0].values[0].value.name

秒(硬币):

this.event.request.intent.slots.<yourslotname>.value

小心:yourslotname 不是 Slottype!这是名字

【讨论】:

不确定这里为什么是-1?我现在也有同样的cse。我扩展了其中一个 AMAZON 列表 (AMAZON.Room),并添加了一些“小房间”的同义词(“电脑室”、“游戏室”),因此当 Alexa 为我的 Lambda 提供价值时,它可以提供“电脑室”和我不打算在 Lambda 级别实现同义词匹配,所以我会尝试从“resolutionsPerAuthority”中获取价值 谢谢@MariuszKarpicki 我真的不知道为什么我在这里收到-1,但我很幸运能提供帮助✌ 这里我找到了更详细的描述,以防其他人可能想阅读更多:developer.amazon.com/blogs/alexa/post/…【参考方案6】:

单纯看this.event.request.intent.slots.&lt;yourslot&gt;.value是不安全的

这个值只有“话语”,它可能不是你要找的

我不得不更深入地查看对象并查看解决方案对象并检查状态为code=="ER_SUCCESS_MATCH"的权限对象

这是我的 java 代码,你几乎可以在 Nodejs 中做同样的事情

private String getSlotValue(JSONObject s)


    String utterance="";
    String choice ="NA";

  try 

        if(s.has("option"))
        

        JSONObject optionObject =s.getJSONObject("option");

        utterance =optionObject.getString("value");

        JSONObject resolutionsObject =optionObject.getJSONObject("resolutions");



        JSONArray resolutionsPerAuthority =resolutionsObject.getJSONArray("resolutionsPerAuthority");

        for (int i = 0; i < resolutionsPerAuthority.length(); ++i) 
            JSONObject auth = resolutionsPerAuthority.getJSONObject(i);

            if (auth.getJSONObject("status").getString("code").equals("ER_SUCCESS_MATCH") )

                
                if(auth.has("values"))
                    
                    JSONArray  values = auth.getJSONArray("values");

                    choice=values.getJSONObject(0).getJSONObject("value").getString("id");
                    
                           

        

        

    return choice;

    
  catch (Exception e) 
   choice="Error "+e.getMessage();
   return choice;
   

【讨论】:

以上是关于Alexa Skill - 如何在 Lambda 函数中检索槽值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用从 Alexa Smart Home Skill Directive 收到的 BearerToken 来识别使用 AWS Lambda 和 NodeJS 的用户电子邮件和个人资料?

使用 Alexa Skill 连接到 Postgresql

Alexa Skill - 如何获取要求 Alexa 的完整声明文本

如何在 Alexa Skill 中使用 Java 获取亚马逊用户电子邮件

在“认证”期间如何继续开发我的 Alexa Skill?

如何从 Alexa Skill 中的用户随机输入中提取自定义插槽