出于示范目的,我应该在对话的基础上开发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,我是否需要单独的意图。或者是否有可能保持技能活力?
答案 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
绑定)。
使用不同的意图可能是另一种解决方案,但如果你有类似的话语可能会错误地错误映射到彼此,那么它很容易失败。