我一直在玩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月开始,使用亚马逊文学的技能将不再获得批准。您应该使用自定义插槽。有趣的是,文档中说,即使使用自定义槽,您也可以接收自定义列表中未定义的单词,比如文字。我还没有对此进行测试,但它可能会派上用场。