0

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

技能模板如下:

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

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

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

4

2 回答 2

1

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

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

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

alexa-sdk 中有两种一般类型的响应。":tell" 会让 Alexa 做出回应并立即回到她的空闲状态(不听你的)。":ask" 会说一个响应,等待 8 秒,然后在等待你给出另一个命令的同时,继续提示消息。

至于在对话中保持会话活跃,您可以简单地使用

var speechOutput = "This is the answer to Question"
var speechOutputReprompt = "Do you have any more questions?"
this.emit(":ask", speechOutput, speechOutputReprompt)

这将使您的会话保持打开状态,并且用户可以继续提出更多问题。如果您对重新提示回答“否”,您将不得不做出另一个意图来关闭会话,从而使 shouldEndSession 变量为真。这是我如何构建代码的示例:

"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;
        }
    }
}
}
于 2018-02-06T16:07:14.180 回答
0

看起来您正在使用单轮交互(即您没有保持会话打开,请查看shouldEndSession https://www.npmjs.com/package/alexa-app)。无论如何,您需要将当前状态保存在会话对象中或将其存储在其他地方(绑定到 unique request.userId)。

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

于 2017-03-13T14:38:11.010 回答