javascript - 从单个 Intent 输出多个响应

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

我有一个 Alexa 技能,我希望对一个 intent 有一个初始响应,然后在延迟之后,声明另一个响应。

我尝试使用多个 response.tell(...) 调用,它们之间有一个 setTimeout(),但这只响应第一个 .tell() 结束。 (.tell() 设置为结束 session ,但即使我将其设置为 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 是否可行?

谢谢!

最佳答案

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

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

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


总而言之,今天的 Alexa 平台上提供了一个可能适合您的简单解决方案。

您可以使用 SSML 提供单一响应,并在语音输出中打断。 documentation for an SSML break表明你看起来像<break time="420s"/>并且您已经在响应中使用了 SSML。

但是,为了可用性,我不建议暂停 7 分钟。你有其他选择,比如在每分钟之间暂停几分钟并发表鼓励性演讲(实际上你可能想暂停 50 秒左右)。另一种选择是使用 audio 播放 7 分钟的音乐或与锻炼相关的声音。 SSML 标签。

关于javascript - 从单个 Intent 输出多个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35817169/

相关文章:

javascript - 如何在 Node/Angular 应用程序中存储或检索嵌入代码?

javascript - 如何使用groupby方法在sequelize postgres中获取特定id的表特定数据

javascript - Three.js OrbitControls 跟随鼠标指针

node.js - 通过 WebSocket 在远程自治 Node.js 应用程序之间进行全双工消息传递?

lambda - AWS Lambda 可以运行多个特定的 cron 作业吗?

javascript - 是否可以在前一个执行完成之前执行网络消息回调函数?

node.js - 在 Node.js gRPC 客户端中获取 `Error: 8 RESOURCE_EXHAUSTED: Received message larger than max (15217288 vs. 4194304)`

javascript - 在 DigitalOcean 服务器上执行 nodeJS 应用程序

python - 从 S3 读取 KMS 加密文件

node.js - 在 AWS lambda node.js 中获取 secret