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

开发Alexa技能:使用AudioPlayer播放音频后能否恢复会话?

使用AudioPlayer播放音频后继续Alexa技能会话的实现方案

可以实现,但不能在同一个响应中同时使用speak()/ask()和AudioPlayer指令并保持会话活跃——因为Alexa的响应逻辑中,只要响应包含AudioPlayer指令,should_end_session的设置会被忽略,会话会自动进入后台状态,此时用户无法直接发起意图请求。

要实现播放音频后回到会话继续交互,需要分两步处理:

  1. 触发音频播放并监听播放完成事件
    在意图处理器中,发送PlayDirective启动音频播放,无需添加speak()或ask(),也不需要设置set_should_end_session(False)(此时该设置无效)。同时确保技能已注册AudioPlayer.PlaybackFinished事件的处理器。

    修改后的示例代码:

    def play_audio_handler(handler_input):
        # 直接发送AudioPlayer播放指令
        handler_input.response_builder.add_directive(
            PlayDirective(
                play_behavior=PlayBehavior.REPLACE_ALL,
                audio_item=AudioItem(
                    stream=Stream(
                        token="audio_token_001",
                        url="你的音频URL",
                        offset_in_milliseconds=0,
                        expected_previous_token=None),
                    metadata=None))
        )
        return handler_input.response_builder.response
    
  2. 播放完成后恢复会话
    在AudioPlayer.PlaybackFinished事件处理器中,发送带有speak()和ask()的响应,重新激活会话,引导用户继续交互。

    示例代码:

    def playback_finished_handler(handler_input):
        # 音频播放完成,重新激活会话
        spoken_text = "音频播放完毕,你可以继续告诉我你的需求。"
        reprompt_text = "请问你还有什么需要?"
        return handler_input.response_builder.speak(spoken_text).ask(reprompt_text).response
    

另外,如果你需要在播放音频前先告知用户,也可以拆分两次响应:

  • 第一次响应:仅用speak()告知用户“即将播放音频”,并通过ask()保持会话活跃。
  • 第二次响应:在用户确认(或通过会话属性自动触发)后发送PlayDirective播放音频,之后等待PlaybackFinished事件恢复会话。

需要注意的是,在音频播放期间,用户可以通过Alexa内置语音控制(如“暂停”“停止”)中断音频,此时会触发AudioPlayer.PlaybackStopped或AudioPlayer.PlaybackPaused事件,你也可以在这些事件的处理器中恢复会话,让用户继续交互。

内容的提问来源于stack exchange,提问作者odysseus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:14:55