首页 文章

Alexa Custom Slot Type:意图无 Value

提问于
浏览
4

我已经将这个问题发布到亚马逊开发者论坛,但没有得到答案 . 我想Stackoverflow应该是从一开始的第一选择:

根据我的理解,如果我使用自定义槽类型,即使其可能值的列表不包含口语单词,仍然会将口语单词传递给该功能 . 文档说'自定义插槽类型不等同于枚举 . 如果口语理解系统认可,列表外的值仍可能被返回 .

现在我有一个自定义插槽类型 LIST_OF_PERSONS ,其值为 Matthias|Max ,并且是一个话语

EmployeeDetailsIntent {Person}

如果我使用不在 LIST_OF_PERSONS 中的值调用此意图,则仍会调用Intent,但JSON不包含Slot的"value"键:

"request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.a943e233-0713-4ea5-beba-d9287edb6083",
    "locale": "de-DE",
    "timestamp": "2017-03-09T14:38:29Z",
    "intent": {
      "name": "EmployeeDetailsIntent",
      "slots": {
        "Person": {
          "name": "Person"
        }
      }
    }
  }

这是"works as designed"还是一个错误?我如何访问意图中的口语呢?由于 this.event.request.intent.slots.Person.value 未定义?

我的代码位于AWS lambda中,我使用的是nodejs alexa-sdk版本1.0.7 . 我的技能语言是德语 .

3 回答

  • 1

    (免责声明:这篇文章总结了我自己的“解决方法” . 它可能是也可能不是“最佳方式” . 似乎对我有用,所以我想在此简要分享/记录)

    我最近遇到类似问题的话语如下:

    "tell me about {townName}"

    如果我说 "tell me about London" ,它的确有效 .

    如果我说 "tell me about" (故意错过了 {townName} ),程序"dies"(并返回一个类似于你的JSON,带有未定义的 this.event.request.intent.slots.townName.value

    虽然我不能100%确定这是否是一个“功能”(即我们需要编写更智能的代码来解决这个问题)或“问题”(即Alexa团队需要解决或修复) . 最近,当涉及到我的认证过程时,这种情况引起了一个真正的问题 .

    为了解决这个问题,我已经实现了一种解决方法(或修复,无论你怎么称呼它),以避免Alexa因为这种边缘情况而“死亡” .

    从Alexa skill-sample-nodejs-trivia index.js 文件中,为了简单起见,我为了简单的例子编辑了一下它:

    function isAnswerSlotValid(intent) {
        var answerSlotFilled = intent && intent.slots &&
            intent.slots.townName && intent.slots.townName.value;
        return answerSlotFilled
    }
    

    (即此函数返回 True 表示插槽 townName 的有效值,而 False 表示未定义/否则) .

    在定义intent时,我可以使用此函数“绕过”一个空槽值场景:

    var startHandlers = Alexa.CreateStateHandler(states.START,{
    
      // bla bla bla//
    
      "AnswerIntent": function() {  
    
        // handel missing slot value
        var answerSlotValid = isAnswerSlotValid(this.event.request.intent);
    
        if (answerSlotValid && moreConditions) {
          // do something fun
        }
        else {
          // handle empty slot scenario
        }
      }
    
      // bla bla bla//
    
    }
    

    有兴趣看看是否有更好/更“正确”的解决方案,以更优雅地处理空/未定义的插槽 .

  • 1

    我已经看到,当一个意图有和没有插槽的话语时都会发生这种情况 . 例如:

    myIntent是什么让汽车快速运行myIntent是什么让走得更快

    其中CAR_TYPE有不同类型汽车的清单 .

    myIntent仍然需要为模式中的myIntent定义插槽CAR_TYPE,但第一个intent不使用它 . 在这种情况下,最好在CAR_TYPE中包含'car'并消除第一个话语 . 在其他情况下,句子语法实际上不允许它,所以你需要期待像你看到的空槽 .

  • 2

    我认为问题在于使用自定义插槽类型的话语必须与至少一个其他值一起使用 .

    例如

    EmployeeDetailsIntent get {Person}
    

    会工作,而

    EmployeeDetailsIntent {Person}
    

    将不会

相关问题