我已将此问题发布到亚马逊开发者论坛,但没有在那里收到答案。我想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。我的技能语言是德语。
答案 0 :(得分:3)
(免责声明:这篇文章总结了我自己的“解决方法”。它可能是也可能不是“最佳方式”。似乎对我有用,所以我想在此简要分享/记录一下)
我最近因为一个看起来像这样的话语而遇到了类似的问题:
"tell me about {townName}"
如果我说"tell me about London"
,就行了。
如果我说"tell me about"
(故意错过{townName}
),程序“死亡”(并返回一个类似于您的JSON的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
的有效值(未定义/否则)。
在定义意图时,我可以使用此函数“绕过”一个空的插槽值场景:
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 :(得分:1)
我已经看到,当一个意图同时有和没有插槽的话语时都会发生这种情况。例如:
是什么让汽车变得更快 是什么让{CAR_TYPE}快速开始其中CAR_TYPE有不同类型汽车的清单。
myIntent仍然需要为架构中的myIntent定义插槽CAR_TYPE,但第一个intent不使用它。 在这种情况下,最好在CAR_TYPE中包含'car'并消除第一个话语。在其他情况下,句子语法实际上不允许它,所以你需要期待像你看到的空位。
答案 2 :(得分:1)
我认为问题在于使用自定义插槽类型的话语必须与至少一个其他值一起使用。
例如
$connected = new WP_Query( array(
'connected_type' => 'posts_to_pages',
'connected_items' => get_queried_object(),
'nopaging' => true,
'post_type' => 'attorney',
'attorney_category'=> 'partner',
'post_status' => 'publish',
'posts_per_page' => -1,
'caller_get_posts'=> 1,
'orderby' => 'order_clause',
'order' => 'ASC',
'meta_query' => array(
'order_clause' => array(
'key' => 'Last name',
)
)
) );
将起作用,而
EmployeeDetailsIntent get {Person}
不会
答案 3 :(得分:0)
有同样的事情,获取自定义的插槽名称,但Json Input中缺少值。与普通插槽一起使用。使用Alexa开发人员控制台。必须在我的自定义广告位值中添加一个“ ID”值,然后我才开始获取值。我以为以前曾经尝试过,但是也许我没有在每个值上都添加一个ID。尽管其他答案对我无效,但这对我来说是个窍门。