我有一个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是否可行?
谢谢!
答案 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分钟内播放音乐或锻炼相关声音的时间。