我已经将这个问题发布到亚马逊开发者论坛,但没有得到答案。我想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"
}
}
}
}
这是“按设计工作”还是一个错误?我如何访问意图中的口语呢?由于this.event.request.intent.slots.Person.value
未定义?
我的代码位于AWS lambda中,我使用的是nodejs alexa-sdk版本1.0.7。我的技能语言是德语。
(免责声明:这篇文章总结了我自己的“解决方法”。它可能是也可能不是“最佳方式”。似乎对我有用,所以我想在此简要分享/记录)
我最近遇到类似问题的话语如下:
"tell me about {townName}"
如果我说"tell me about London"
,它的确有效。
如果我说"tell me about"
(故意错过{townName}
),程序“死”(并返回一个看起来类似于你的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//
}
有兴趣看看是否有更好/更“正确”的解决方案,以更优雅地处理空/未定义的插槽。
我已经看到,当一个意图有和没有插槽的话语时都会发生这种情况。例如:
myIntent是什么让汽车快速运行myIntent是什么让{CAR_TYPE}走得更快
其中CAR_TYPE有不同类型汽车的清单。
myIntent仍然需要为模式中的myIntent定义插槽CAR_TYPE,但第一个intent不使用它。在这种情况下,最好在CAR_TYPE中包含'car'并消除第一个话语。在其他情况下,句子语法实际上不允许它,所以你需要期待像你看到的空槽。
我认为问题在于使用自定义插槽类型的话语必须与至少一个其他值一起使用。
例如
EmployeeDetailsIntent get {Person}
会工作,而
EmployeeDetailsIntent {Person}
将不会
有同样的事情,获取自定义插槽名称,但Json输入中缺少值。使用普通插槽。使用Alexa开发者控制台。不得不在我的自定义插槽值中添加“ID”值,然后我开始获取值。我以为我之前尝试过,但也许我没有在每个值上加上ID。虽然其他答案对我不起作用,但这对我来说很有用。