非常简单的问题,奈何我之前都没有接触过音频,排查了很久。
问题现象:
现象 A:单独启动 TTS(语音合成)播放时,语速、音质完全正常。
现象 B:一旦启动 ASR(语音识别),TTS 的播放语速立刻变慢(同时伴随音调变低)。
现象 C:使用全局播放器(如 mp3 播放测试),启动 ASR 后,mp3 播放同样变慢。
排查过程与心理路径
| 序号 | 猜测排查方向 | 验证结果与分析 |
| 1 | 系统负载过高导致的卡顿/变慢 | 排除。监控系统 CPU/内存,实际负载并不高。 |
| 2 | ROS 节点回调阻塞或配置不合理 | 排除。在 ROS 节点中增加时间戳日志,未发现回调延迟或阻塞。 |
| 3 | 音频通道(Channels)冲突 | 排除。尝试修改通道配置(单声道/双声道),未能解决问题。 |
| 4 | 硬件限制(声卡不支持全双工/同时录播) | 排除。测试声卡官方 Demo,确认硬件支持同时播放和录音。 |
| 5 | 跨业务交叉测试(引入 mp3) | 确认全局性。播放 mp3 同样变慢,说明不是 TTS 本身的问题,而是系统级音频服务(PulseAudio/声卡驱动)的全局冲突。 |
最后,整个故障由两个独立的问题叠加组合而成:
1.ASR 与 PulseAudio 的采样率(Sample Rate)冲突与重采样失败.
原理解析:声卡通常有一个固定的硬件工作频率(如 48kHz 或 44.1kHz)。当 ASR 启动时,它向 硬件请求了一个特定的录音频率--16KHz
冲突点:此时 PulseAudio 的全局配置、TTS 的播放配置与 ASR 的录音配置三者之间的采样率或通道数不匹配。
结果:内核报错,TTS设置的频率无效,直观表现就是语速变慢、音调变低。
[ 5116.043399] hobot alsa: cpudai: BUG: i2s0: more than one user set i2s with different value: 16000 => 48000 [ 5116.043401] hobot alsa: cpudai: BUG: set channel failed [ 5116.043402] super-i2s 39480000.i2s: BUG: set sample rate failed
2.跨用户配置更新“假生效”
环境背景:系统采用多用户架构。音频服务(PulseAudio Server)运行在 A 用户下;当前运行 ROS/ASR/TTS 的是 B 用户,通过 export PULSE_SERVER=127.0.0.1 调用 A 用户的音频。
冲突点:在发现采样率问题后,你在 A 用户下修改了 PulseAudio 配置并重启了服务。但 B 用户的客户端(如 pactl 或 ROS 音频节点)并没有立刻应用新配置。
原理解析:因为 B 用户与 A 用户的 PulseAudio 之间建立的是 TCP 长连接(Persistent Connection)。A 用户重启服务时,B 用户的连接可能处于半死不活的挂起状态,它依然在用旧的参数去通信。
总结 1:为什么当时没有第一时间求助于 AI?客观现实:音频问题具有高度的非文本依赖性。原因:当时排查时,AI 无法直接“听到”现场 TTS 变慢、变调的实际声音表现。音频的卡顿、拉丝、变调在没有形成具体量化数据(如日志中的采样率报错)之前,很难用文字向 AI 精准描述。
总结 2:PulseAudio 模块“热插拔/自动配置”与 ASR 模型的隐蔽冲突客观现实:PulseAudio 过于“智能”的策略,反而掩盖了底层设备的真实状态。冲突过程:PulseAudio 的自动行为:PulseAudio 启动时,其内部模块(如 module-udev-detect 或 module-native-protocol-tcp)会自动检测并加载声卡,将其初始化为一个它认为“最合适”或“最高”的硬件频率/通道。在这个状态下,TTS 或普通播放器工作完全正常。ASR(语音识别)模型为了保证识别准确率,在代码底层硬编码了极其严格的音频流格式——必须是 4 通道、16000Hz 采样率。
对了,还有声音大小的设置,有时候莫名其妙的音量是0,哪哪都有问题