3

我有一个 Alexa 技能,我想对一个意图做出初始响应,然后在延迟之后再声明另一个响应。

我尝试在它们之间使用多个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 是否可行?

谢谢!

4

1 回答 1

2

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

部分困惑似乎是 node.js 的异步特性,这使得您似乎可以向 Alexa 发送多个响应,但您不能。考虑 Alexa 的方式与普通 API 调用具有相同的请求/响应类型性质。您的第二个 response.tell 无处可发送其数据,因为原始请求早已结束。

考虑它的方式是 Alexa 正在与用户进行对话,并且没有为您提供一种在没有他们首先交互的情况下打断用户的方法。您的第一个 response.tell 将对话交还给用户,在他们再次与您交谈之前您不能说任何话。


话虽如此,今天的 Alexa 平台上可能有一个简单的解决方案可能对您有用。

您可以使用 SSML 提供单个响应,并在语音输出中放置中断。SSML 中断的文档显示您看起来像<break time="420s"/>并且您已经在响应中使用 SSML。

但是,出于可用性考虑,我不建议暂停 7 分钟。您有其他选择,例如在每分钟之间进行几分钟的停顿和鼓励性的演讲(实际上您可能希望停顿 50 秒左右)。另一种选择是让您使用音频SSML 标签在 7 分钟内播放一段音乐或与锻炼相关的声音。

于 2016-03-06T13:42:00.907 回答