Alexa技能播放音频时用户响应触发意图却终止会话的解决咨询
问题分析
当使用SSML的<audio>标签播放音频时,Alexa默认行为是音频播放期间不监听用户输入,若用户强行打断,会话会因默认的shouldEndSession设置为true直接终止。要实现音频播放时可响应并保持会话,需从会话状态配置和音频播放机制两方面调整。
解决方案
1. 强制维持会话活跃
在返回的响应中,必须显式设置会话不终止,同时通过ask()方法添加重提示(即使无需重复引导,也需保留该逻辑以维持会话监听状态)。
示例代码(Python):
from ask_sdk_core.handler_input import HandlerInput from ask_sdk_model import Response def your_intent_handler(handler_input: HandlerInput) -> Response: mp3_url = "你的音频资源URL" speak_output = f"<speak>有问题吗?<audio src='{mp3_url}'/></speak>" # 配置重提示,确保会话持续监听用户输入 reprompt_output = "<speak>请说出你的回答</speak>" return handler_input.response_builder.speak(speak_output) \ .ask(reprompt_output) # ask()会自动将shouldEndSession设为False .response
2. 使用AudioPlayer接口(推荐)
如果需要更灵活的音频交互(支持中途打断、暂停等操作),建议使用Alexa AudioPlayer Interface替代SSML<audio>标签。该接口专门针对长时间音频播放设计,原生支持播放期间的用户响应,且能稳定维持会话。
核心实现步骤:
- 发送
AudioPlayer.Play指令启动音频,同时通过ask()保持会话 - 为目标意图(用户回答的意图)配置意图拦截规则,确保音频播放时能触发该意图
- 处理音频生命周期事件(如播放完成、失败等)
示例代码片段:
from ask_sdk_model.interfaces.audioplayer import ( PlayDirective, PlayBehavior, AudioItem, Stream) def start_audio_handler(handler_input: HandlerInput) -> Response: mp3_url = "你的音频资源URL" # 构建AudioPlayer播放指令 play_directive = PlayDirective( play_behavior=PlayBehavior.REPLACE_ALL, audio_item=AudioItem( stream=Stream( token="audio_001", url=mp3_url, offset_in_milliseconds=0 ) ) ) return handler_input.response_builder.speak("有问题吗?") \ .add_directive(play_directive) \ .ask("请说出你的回答") \ .response
3. 调整技能交互模型配置
- 在Alexa开发者控制台的交互模型中,为目标意图补充足够覆盖用户表述的样本语句
- 开启技能的"允许中断音频播放"选项(在技能配置的音频播放相关设置中启用)
关键注意事项
- SSML
<audio>标签仅适合无需用户中途响应的短音频场景,不适合交互式播放需求 - 必须使用
ask()方法替代单独的speak()返回响应,ask()是维持会话监听的核心逻辑 - 需在真实设备或Alexa模拟器中测试,验证音频播放期间用户语音能否被正确识别并触发目标意图
内容的提问来源于stack exchange,提问作者Shubham Salokhe
相关产品推荐
相关产品推荐

