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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:06:28