接受 Alexa Custom Skill 的任何用户输入,但在确认中仅包含该输入的一部分

Accept any user input for Alexa Custom Skill, but include only part of that input in confirmation

我正在尝试为感恩日记构建自定义 Alexa 技能。目标是进行交互,Alexa 设备询问用户他们感谢什么,并重复作为确认。

我在重复用户所说的内容时遇到了问题。我希望对话是这样进行的:

Alexa: What are you grateful for today?
User I'm grateful for dogs
Alexa: You said you're grateful for dogs. Is that correct?

我已将其设置为单一意图,如下所示:

我遇到的问题是,当我在 Utterance Profiler 中测试这个模型时,它是这样的:

Alexa: What are you grateful for today?
User I'm grateful for dogs
Alexa: You said you're grateful for I'm grateful for dogs. Is that correct?

我猜这与 AMAZON.SearchQuery 将接受任何内容作为有效输入这一事实有关,但我不确定如何解决这个问题。

我还尝试为 I'm grateful for 短语创建一个自定义插槽:

但是,如果我随后尝试在我的意图中使用这个插槽,通过让用户为 gratitude_object 插槽发声:

{gratitude_phrase_initiator} {gratitude_object}

...然后出现以下错误:

Sample utterance "{gratitude_statement_initiator} {gratitude_object}" for slot "gratitude_object" in intent "NewEntryIntent" cannot include both a phrase slot and another intent slot. Error code: InvalidSlotSamplePhraseSlot

.

我真的很想保持当前的交互,让用户先说 "I'm grateful for..."。关于如何使用交互模型完成这项工作的任何建议,或者它是不可能的?这是我可以在代码而不是交互模型中处理的东西吗?

看起来您的设置很完美,但您希望 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 循环还在检查替换之前使槽值变为小写。这样,您在编写要删除的初始短语时就不必担心大小写匹配问题。