Alexa意图架构问题



我一直在玩Alexa技能,并希望做一些基本的家庭自动化。我已经定义了以下基本意图模式来启动:

{
  "intents": [
    {
      "intent": "Lock",
      "slots": [
        {
          "name" : "Door",
          "type" : "AMAZON.LITERAL"
        }
      ]
    },
    {
      "intent": "Unlock",
      "slots": [
        {
          "name" : "Door",
          "type" : "AMAZON.LITERAL"
        }
      ]
    }
  ]
}

然后是示例话语:

Lock lock {slot value|Door}
Lock lock door {slot value|Door}
Lock lock the door {slot value|Door}
Unlock unlock {slot value|Door}
Unlock unlock door {slot value|Door}
Unlock unlock the door {slot value|Door}

这个想法是门的名字必须是自由形式的,因为它们不会提前被知道。然而,当我尝试一个短语时,比如:

lock door front

它找到了正确的意图,但"门"插槽值包含额外的单词:

"intent": {
  "name": "Lock",
  "slots": {
    "Door": {
      "name": "Door",
      "value": "door front"
    }
  }
}

这是正常的,还是使用亚马逊文学的副产品?我也尝试过自定义插槽类型,但多个单词的设备名称似乎不太适合它,而且在这种情况下它总是使用最后一个单词。

我会将话语定义为以"门"字结尾:

Lock lock {slot value|Door} door

所以,用户将不得不说:

Alexa, ask Lock lock kitchen door

所以你很可能只收到一个单词作为门的类型。然后解析字符串。您可能不想测试完全相等,而是想测试包含性。我必须承认,我从来没有使用过LITERAL类型,因为亚马逊教程不建议使用它,所以我会定义一个自定义类型,并列出门类型的可能值。

打开/关闭灯/恒温器是另一回事。为此,您必须使用Alexa SmartHome API。然后"打开/关闭"、"设置值"等成为Alexa的保留关键字。在SmartHome API中不会有这样的意图(在你的问题中),没有话语,也没有自定义槽类型。您所需要的只是实现对Discovery请求和Control请求的处理。我认为用户在设备供应商的官方应用程序/帐户中设置设备名称,当Alexa发现设备时(由于Discovery请求),该技能只需从供应商服务器获取设备描述并提供给Alexa。这就是Alexa知道可用设备名称的方式。

Alexa在找到第一个匹配时停止。因此,你需要把更笼统的话语放在更具体的话语之后。

锁上门{槽值|门}锁定{槽值|门}

通过这种方式,"锁定车门前部"与slot="前部"匹配。

如果你有任何没有空位的话语,一定要把它们放在最后。

更新:我对文学消失的评论已经过时了。谢谢你指出。文学将继续存在。但是Alexa(和Lex)确实返回了不在插槽列表中的插槽值。我经常看到这种情况。很好。

对于那些可能会遇到这个问题的人,请知道,从2016年12月开始,使用亚马逊文学的技能将不再获得批准。您应该使用自定义插槽。有趣的是,文档中说,即使使用自定义槽,您也可以接收自定义列表中未定义的单词,比如文字。我还没有对此进行测试,但它可能会派上用场。

最新更新