用途:面向 macOS Apple Silicon,提供无抖动实时音频播放的架构模式与反模式,来自构建 Kokoro TTS 管线的实践经验,触发场景包括音频抖动、TTS 断续和 sounddevice 相关问题。
主要能力与模式:推荐优先使用基于写入的 sd.OutputStream(stream.write 阻塞在 PortAudio C 层,音频线程不跑 Python,GIL 无关),按请求打开流、用完关闭以跟随设备变化;用约 170ms 块写入便于响应中断,stream.abort() 可立即停止并解除阻塞。支持流水线合成:一边播放第 N 块一边合成第 N+1 块,避免块间静音。建议端到端使用 float32 PCM(CoreAudio 原生格式),避免 WAV 编解码与临时文件。块边界加 2ms 淡入淡出防止爆音。可用 launchd QoS 提升音频进程优先级(Nice -10、ProcessType Adaptive)。多客户端可集中到一个音频服务,共享单一 speak 队列。设备热切换分两层:打开流前调用 sd._terminate() 与 sd._initialize() 刷新设备列表以发现蓝牙/HDMI;播放块之间仅查缓存设备列表,切勿在流活动时刷新(会导致 PaErrorCode -9988)。
反模式:回调式 sd.OutputStream 配合 Python 队列(回调内 Python 代码需 GIL,与 MLX/numpy 等竞争导致欠载);每块启用 afplay 子进程(进程创建与设备重获取开销);音频进程使用 Background QoS;用 macOS say 作为 TTS 兜底;启动时打开静态流长期复用。
限制:内容面向 macOS/PortAudio/sounddevice 环境,其他平台未说明;诊断命令与日志路径为示例,具体参数需按实际环境确认。