Alexa技能 - 保持意图对话

时间:2017-03-12 14:10:16

标签: node.js amazon-web-services alexa-skills-kit amazon-echo

出于示范目的,我应该在对话的基础上开发Alexa技能。 所有的alexa响应都是硬编码的。

该技能的模板如下:

第1部分: 用户:Alexa,问MySkill {Question1}。 Alexa:硬编码的答案。

第2部分: 用户:Alexa,问MySkill {Question2.1} Alexa:问题2.1的硬编码答案。 网友:Alexa,问MySkill {Qeustion2.2} Alexa:硬编码的答案。

我能够创建第1部分。但在第2部分中,我遇到了一些问题。 对于问题2.1和2.2,我是否需要单独的意图。或者是否有可能保持技能活力?

2 个答案:

答案 0 :(得分:1)

我将首先假设你在开发过程中使用了alexa-sdk。如果你不知道那是,请查看以下链接:

https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs

您可以通过多种方式将问题分解为您的意图模式中的技能。它们可以是单独的意图,例如“QuestionOneIntent”和“QuestionTwoIntent”,也可以是单个意图“QuestionIntent”,其中这些意图中的槽值对应于各个问题。由于原帖没有提供太多信息,我不能说哪种结构是最好的设置。

alexa-sdk中有两种常见类型的回复。 “:告诉”会让Alexa说出回应并立即回到她的闲置状态(不听你的话)。 “:ask”会说出一个回应,等待8秒钟,并在等待你发出另一个命令的同时跟进一份重新发送的消息。

至于在会话中保持会话活动,您可以使用

简单地发出响应
var speechOutput = "This is the answer to Question"
var speechOutputReprompt = "Do you have any more questions?"
this.emit(":ask", speechOutput, speechOutputReprompt)

这将允许您的会话保持打开状态,用户可以继续提出更多问题。如果对reprompt回答“否”,则必须创建另一个关闭会话的意图,从而使shouldEndSession变量为true。以下是我如何构建代码的示例:

"QuestionIntent": function(){
var responseName = ""
var slots = this.event.request.intent.slots
for (var slot in slots){
    if(slots[slot].value != undefined){
        responseName = slots[slot].name;
        switch(responseName){
            case "QuestionOneIntent":
                var QuestionOneAnswer = "Answer to question one";
                this.emit(":tell", QuestionOneAnswer);
                break;
            case "QuestionTwoIntent":
                var QuestionTwoAnswer = "Answer to question two";
                this.emit(":ask", QuestionTwoAnswer, QuestionTwoAnswerReprompt);
                break;
            default:
                console.log("error");
                break;
        }
    }
}
}

答案 1 :(得分:0)

看起来您正在使用单圈互动(即您不会保持会话开放,请检查shouldEndSession https://www.npmjs.com/package/alexa-app)。无论如何,您需要在会话对象中保存当前状态或将其存储在其他位置(与唯一request.userId绑定)。

使用不同的意图可能是另一种解决方案,但如果你有类似的话语可能会错误地错误映射到彼此,那么它很容易失败。