You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alexa技能开发:Audioplayer播放完成后如何提示用户响应

Alexa AudioPlayer播放完成后发起交互的可行方案

首先明确限制:Audioplayer.PlaybackFinished属于平台异步事件回调,触发时你的技能默认不持有对话控制权,所以直接在该回调中返回speak、reprompt指令都会被Alexa直接忽略,这是平台的固有规则,无法直接突破。

目前行业内通用的可落地解决方案有以下三种:

方案1:无声音频拼接 + PlaybackNearlyFinished回调抢占控制权

  • 操作步骤:
    1. 给所有需要播放的主音频末尾拼接一段时长为1.5-2秒的无声音频片段
    2. 监听Audioplayer.PlaybackNearlyFinished回调,该回调会在当前音频播放结束前的1-3秒由Alexa主动触发
    3. 在该回调的响应中,添加你需要向用户发起的问询内容,同时设置shouldEndSession = false保留会话控制权,也可配套添加reprompt指令
  • 优势:不需要提前知道音频时长,适配所有音频资源场景,兼容性最好

方案2:音频时长校准 + 定时器触发渐进式响应

  • 操作步骤:
    1. 提前统计所有待播放音频的准确时长
    2. 在调用AudioPlayer.Play指令启动播放的同时,启动一个本地定时器,定时时间设置为「音频总时长 - 2.5秒」
    3. 定时器触发后,先调用渐进式响应接口推送问询语音,再返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:45:02