开发Alexa技能:使用AudioPlayer播放音频后能否恢复会话?
使用AudioPlayer播放音频后继续Alexa技能会话的实现方案
可以实现,但不能在同一个响应中同时使用speak()/ask()和AudioPlayer指令并保持会话活跃——因为Alexa的响应逻辑中,只要响应包含AudioPlayer指令,should_end_session的设置会被忽略,会话会自动进入后台状态,此时用户无法直接发起意图请求。
要实现播放音频后回到会话继续交互,需要分两步处理:
触发音频播放并监听播放完成事件
在意图处理器中,发送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播放完成后恢复会话
在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
相关产品推荐
相关产品推荐

