从单个Intent输出多个响应

时间:2016-03-05 17:15:19

标签: javascript node.js aws-lambda alexa alexa-skills-kit

我有一个Alexa Skill,我希望对一个意图做出初步回应,然后在延迟之后再说明另一个回应。

我尝试在他们之间使用response.tell(...)多个setTimeout()来电,但这仅响应第一个.tell()并结束。 (.tell()设置为结束会话,但即使我将其设置为false,我的代码仍然永远不会到达setTimeout()

我已经包含了一些关于我想做的伪代码:

intentHandlers.DynamicDurationIntent = function(intent, session, response) {
  var calculatedDuration = doCalculation();
  var speechDuration = convertToSpeech(calculatedDuration);
  var speechOutput = "Your duration will last <say-as interpret-as="time">' +
         speechDuration + 
         '</say-as>";
  response.tell(speechOutput); //I get this far
  setTimeout(function () {
     var speechOutputEnd = "Great job! You're done.";
     response.tell(speechOutputEnd);
  }, calculatedDuration);
}

此模型的一个示例用于7分钟锻炼Alexa技能。

使用AWS Lambda是否可行?

谢谢!

1 个答案:

答案 0 :(得分:2)

这不是与AWS Lambda相关的问题,这是与Alexa相关的问题。

部分混淆似乎是node.js的异步性质,使得看起来你可以向Alexa发送多个响应,你不能。思考Alexa的方式与普通API调用的请求/响应类型相同。你的第二个响应。无法发送数据,因为原始请求早已结束。

考虑它的方式是Alexa正在与用户进行对话,并且没有为您提供在没有他们首次交互的情况下中断用户的方法。你的第一个回复。将对话交回用户手中,在他们再次与你交谈之前你不能说什么。

所有这一切,有一个直截了当的解决方案,可能会在今天的Alexa平台上为您提供。

您可以使用SSML提供单个响应,并在语音输出中添加中断。 documentation for an SSML break表示您看起来像<break time="420s"/>,并且您已在回复中使用SSML。

但是,为了实用性,我不建议暂停7分钟。你有其他的选择,例如每分钟进行一次暂停,并且每分钟之间都有令人鼓舞的演讲(实际上你可能想要暂停50秒)。另一种选择是使用audio SSML标签在7分钟内播放音乐或锻炼相关声音的时间。