我正在尝试为感激日记建立自定义的Alexa技能。目标是进行一次交互,在这种交互中,Alexa设备会询问用户他们要感谢的内容,然后重复进行确认。
在重复用户所说的内容时,我遇到了一个问题。我希望对话像这样进行:
Alexa:您今天要感谢什么?
用户我感谢狗
Alexa:您说过,您对狗表示感谢。正确吗?
我将其设置为单个意图,如下所示:
gratitude_object
作为必需的插槽,类型为AMAZON.SearchQuery I'm grateful for {gratitude_object}
(以及一些变化)You're feeling grateful for {gratitude_object}. Is that correct?
我遇到的问题是,当我在Utterance Profiler中测试该模型时,它是这样的:
Alexa:您今天要感谢什么?
用户我感谢狗
Alexa:您说过,我很感谢狗,对此您表示感谢。正确吗?
我猜测这与AMAZON.SearchQuery会接受任何内容作为有效输入这一事实有关,但我不确定如何解决这个问题。
我还尝试为I'm grateful for
短语创建一个自定义广告位:
gratitude_phrase_initiator
但是,如果我随后尝试通过使用户说出gratitude_object
插槽来意图使用此插槽,则:
{gratitude_phrase_initiator} {gratitude_object}
...然后出现以下错误:
意图“ NewEntryIntent”中的插槽“ gratitude_object”的示例话语“ {gratitude_statement_initiator} {gratitude_object}”不能同时包含短语插槽和另一个意图插槽。错误代码:InvalidSlotSamplePhraseSlot
。
我真的很想保持当前的互动状态,用户首先要说“我感谢...”。关于如何使用交互模型使这项工作可行的任何建议,还是只是不可能?这是我可以在代码中处理的东西,而不是交互模型吗?
答案 0 :(得分:0)
看起来您设置得很完美,但是您希望SearchQuery
在排除初始话语短语方面做得更好。因此,您将不得不在代码中对其进行更多解析。您应该使用Lambda函数来字符串替换插槽值以删除所有初始短语。
Node.js中的示例:
var gratitude_object = this.event.request.intent.slots.gratitude_object.value;
var initial_phrases = [
"i'm grateful for",
"i am grateful for",
];
initial_phrases.forEach(function(value){
gratitude_object = gratitude_object.toLowerCase().replace(value,"");
});
请注意,初始短语数组以小写形式编写,并且forEach循环在检查替换之前也将插槽值设置为小写。这样,您在编写要删除的初始短语时就不必担心大小写匹配。