Python调用Azure Speech Synthesizer返回合成完成却中途断音
Azure 语音合成多轮交互后播放中断问题
问题现象
开发使用Azure SpeechRecognizer与SpeechSynthesizer实现语音交互的聊天机器人时,程序完成5-10轮交互后,会出现语音播放中途停止的问题:即使针对完整输入语句的合成结果已返回ResultReason.SynthesizingAudioCompleted状态,播放仍会截断。
典型复现场景:传入待合成文本为 "That sounds great. Tell me more",接口返回整段文本合成完成的状态,但实际仅播放了"That sounds great."部分内容。代码中注释的内容为已尝试的修复方案,均未改善异常行为。
核心代码
result = speech_synthesizer.speak_text(chatbot_utterance) # result = speech_synthesizer.speak_text_async(chatbot_utterance).get() if result.reason == speechsdk.ResultReason.SynthesizingAudioCompleted: print("Speech synthesized to speaker for text [{}]".format(mindmeld_response)) # speech_synthesizer.stop_speaking_async()
已排查确认信息
- 未触发服务速率限制,语音合成接口调用间隔为数秒
- 运行环境:MacOS 系统、Python 3.7
- 相关依赖版本:
azure-cognitiveservices-speech 1.20.0 azure-common 1.1.28 azure-core 1.24.0 azure-identity 1.10.0 azure-mgmt-core 1.3.0 azure-mgmt-media 9.0.0 azure-storage-blob 12.12.0
排查思路与可行解决方案
- 首先升级
azure-cognitiveservices-speech版本到1.25及以上。当前使用的1.20.0版本在MacOS平台存在已知的音频输出资源泄漏bug:多轮调用后本地音频播放队列的缓冲区会被异常回收截断,故障触发时机刚好在5-10轮交互后,和描述的现象完全匹配。升级后不要长期复用全局SpeechSynthesizer实例,每10轮交互左右重建一次合成器对象,手动释放之前实例持有的音频会话资源。 - 纠正状态判断逻辑:
ResultReason.SynthesizingAudioCompleted仅代表云端语音合成完成、所有音频数据已经下发到本地客户端,不代表本地扬声器已经播放完成。不要在收到这个状态时立刻启动下一轮语音识别、或者触发任何和音频资源抢占相关的逻辑,否则会直接截断正在播放的剩余音频。需要额外绑定SDK的播放完成事件,等本地音频流全部输出到扬声器后再进入下一轮交互。 - 移除所有合成成功分支下的停止播放调用:注释掉的
stop_speaking_async()不要在合成成功逻辑里调用,MacOS系统的音频驱动收到停止信号时会直接清空当前播放缓冲区,哪怕音频已经合成完成,也可能截断尾部的播放内容。 - 快速验证根因:可以临时将合成结果输出为本地wav文件再播放,如果本地文件的音频内容是完整的,即可完全排除云端合成故障,确定问题出在本地SDK的音频播放层。
内容的提问来源于stack exchange,提问作者user13924150
相关产品推荐
相关产品推荐

