7,646
社区成员
发帖
与我相关
我的任务
分享高通端侧语音生成式 AI 批量合成长音频,多任务并发输出出现音频时序错乱、声音重叠,如何搭建线程安全的音频输出调度框架?
问题根因
多线程任务无同步锁,全部直接调用声卡播放接口,共享全局音频缓冲区;不同任务生成的音频帧交叉写入缓冲区,播放时不同语音片段混合重叠,同时无任务执行顺序管控,输出时序完全错乱。
线程安全调度完整落地框架
单生产者多消费者串行任务队列
采用 FIFO 阻塞队列统一管理语音合成任务,同一时间仅执行一条音频生成与播放,Python 完整示例:
import queue
import threading
import sounddevice as sd
# 全局任务队列,限制最大并发任务数
audio_task_queue = queue.Queue(maxsize=20)# 全局互斥锁,独占声卡输出通道
audio_play_lock = threading.Lock()# 后台调度工作线程,永久循环处理队列任务def audio_worker_thread():while True:
task_text, task_id = audio_task_queue.get()# 1. 独占NPU生成音频数据
audio_np = tts_qnn_model.generate(task_text)# 2. 加锁独占声卡,禁止其他任务同时播放with audio_play_lock:
sd.play(audio_np, samplerate=16000)
sd.wait() # 等待当前音频完整播放完毕再释放锁
audio_task_queue.task_done()# 外部接口:提交语音合成任务def submit_tts_task(text, task_id):
audio_task_queue.put((text, task_id))# 启动调度线程
threading.Thread(target=audio_worker_thread, daemon=True).start()
独立任务私有缓存
每条合成任务分配独立内存缓冲区存储音频数据,不共用全局数组,避免多线程读写覆盖音频采样点。
任务优先级分级调度
紧急播报任务(告警、提示音)设置高优先级,插入队列头部;普通播报任务进入队尾,兼顾时序与业务优先级。
音频分段缓存预生成
长音频拆分为 2 秒分段生成,全部缓存完成后统一播放,避免生成中途穿插其他任务音频。
参考资料
高通端侧音频 SDK 开发文档《Concurrent TTS Task Scheduling & Audio Device Exclusive Access》
语音 AI 部署技术文章《边缘 TTS 多线程并发音频重叠、时序错乱根治方案》