六轮真机定位出四个叠加的原因,每修掉一个概率降一档: 1. 发包定时器系统性漂移:scheduleWithFixedDelay 从任务**结束**起算,WSOLA+G.722+ 写 socket 的 1~3ms 全叠进周期,"20ms"实测 21~23ms、只有 0.9 倍速。改成 scheduleAtFixedRate 固定节拍且永不重排。 2. 起播缓冲在句中重新生效(杂音落在句中的真凶):队列空了就要求再攒 120ms,而 变速追赶时队列中途归零很常见,等于句中硬插 120ms 静音。加 playing 标志让 起播缓冲只在句首用一次;真正的断粮单独计数并打「句中空洞」日志。 3. 恢复发包时从空缓冲起播(杂音落在句首):两路都空就停发、耳机缓冲被榨干。 现在先塞 4 包编码静音垫底再发真音频,两路空后再续 500ms 静音才停。 4. 24k→16k 重采样是逐块独立的线性插值、无抗混叠、每块相位从零重算。换成 64 阶低通 FIR + 跨块连续(Resampler24kTo16k.kt/.swift,Python 复刻校验 1k/3k/6k 正弦)。 顺带:耳机 0xD6 帧 data[6] 的语义是「补一包」不是「改速率」,按此重写 onHeadsetPace(01 补 1 包、00 补 2 包、03 扣 1 包);空闲那一路的静音帧改用该路 自己的编码器编零(G.722 是自适应差分,固定码流会让解码器状态跳);裁静音加 滞回(300 进 / 600 出)+ 3ms 淡入;速率每帧最多变 0.03;150ms 内有新数据不补零 收尾;HARD_CAP_SEC 补回 30s 纯兜底。DEEPVOICE_PARITY 对照开关保持 false。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>