Alexa技能开发:Audioplayer播放完成后如何提示用户响应
Alexa AudioPlayer播放完成后发起交互的可行方案
首先明确限制:Audioplayer.PlaybackFinished属于平台异步事件回调,触发时你的技能默认不持有对话控制权,所以直接在该回调中返回speak、reprompt指令都会被Alexa直接忽略,这是平台的固有规则,无法直接突破。
目前行业内通用的可落地解决方案有以下三种:
方案1:无声音频拼接 + PlaybackNearlyFinished回调抢占控制权
- 操作步骤:
- 给所有需要播放的主音频末尾拼接一段时长为1.5-2秒的无声音频片段
- 监听
Audioplayer.PlaybackNearlyFinished回调,该回调会在当前音频播放结束前的1-3秒由Alexa主动触发 - 在该回调的响应中,添加你需要向用户发起的问询内容,同时设置
shouldEndSession = false保留会话控制权,也可配套添加reprompt指令
- 优势:不需要提前知道音频时长,适配所有音频资源场景,兼容性最好
方案2:音频时长校准 + 定时器触发渐进式响应
- 操作步骤:
- 提前统计所有待播放音频的准确时长
- 在调用
AudioPlayer.Play指令启动播放的同时,启动一个本地定时器,定时时间设置为「音频总时长 - 2.5秒」 - 定时器触发后,先调用渐进式响应接口推送问询语音,再返回
AudioPlayer.Stop指令终止播放,同时携带speak、reprompt内容并保留会话控制权
- 代码示例(Node.js SDK):
// 启动音频播放时的逻辑 const AUDIO_DURATION = 45000; // 示例音频时长45秒 setTimeout(async () => { // 发送渐进式响应提前告知用户 await handlerInput.serviceClientFactory.getProgressiveResponseServiceClient() .sendProgressiveResponse({ header: { requestId: handlerInput.requestEnvelope.request.requestId }, speech: '<speak>音频已播放完毕,请问需要继续收听下一期内容吗?</speak>' }); // 终止当前播放并返回交互指令 return handlerInput.responseBuilder .addAudioPlayerStopDirective() .speak('音频已播放完毕,请问需要继续收听下一期内容吗?') .reprompt('你可以回答“继续”或者“退出”') .withShouldEndSession(false) .getResponse(); }, AUDIO_DURATION - 2500);
注意:该方案仅适合音频资源由你方自主管控、时长固定的场景,若音频时长存在动态波动,容易出现问询语音和主音频重叠的问题。
方案3:引导语音嵌入后续音频流
如果你的技能本身有连续播放的音频队列,可以在当前主音频的下一个音频队列头部,插入你要向用户问询的语音内容,该问询语音播放完成后,再通过PlaybackNearlyFinished回调返回会话控制权,等待用户响应即可。
内容的提问来源于stack exchange,提问作者Tai Wu
相关产品推荐
相关产品推荐

