我一直在玩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
它找到了正确的意图,但“Door”插槽值包含额外的单词:
"intent": {
"name": "Lock",
"slots": {
"Door": {
"name": "Door",
"value": "door front"
}
}
}
这是正常的,还是使用AMAZON.LITERAL的副产品?我也尝试过自定义插槽类型,但是多个字设备名称似乎不能很好地使用它,并且在这种情况下它总是使用最后一个字。
答案 0 :(得分:2)
我会将话语定义为以“门”字结尾:
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将如何知道可用设备的名称。
答案 1 :(得分:1)
更新:我对LITERAL的评论已经过时了。谢谢你指出来。 LITERAL将继续存在。但Alexa(和Lex)确实返回的插槽值不在插槽列表中。我经常看到这个。这很好。
对于那些可能会遇到此问题的人,请知道使用AMAZON.LITERAL的技能将从2016年12月开始不再获得批准。您应该使用custom slots代替。有趣的是,文档说即使使用自定义插槽,您也可以接收自定义列表中未定义的单词,例如文字。我没有对此进行测试,但它可以派上用场。
答案 2 :(得分:1)
Alexa在找到的第一场比赛时停止。所以你需要在更具体的话语之后移动更一般的话语。
锁锁门{槽值|门} 锁定锁定{插槽值|门}
这样“锁门前”与slot =“front”相匹配。
如果您有任何没有插槽的话语,请务必将其放置。