用 Realtime API 的 WebSocket 接车载麦克风,session.update 里把 turn_detection 设成 server_vad,silence_duration_ms 给 500。司机没说话时也频繁触发 response.created,日志里能看到 input_audio_buffer.speech_started 每 10 秒一次,试过把 threshold 从 0.5 提到 0.8 只是变少没有消失。

一开始怀疑是「麦克风增益过高,呼吸声的瞬时能量超过阈值」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。车内空调与发动机低频噪声落在 VAD 的检测频带里。也可能是prefix_padding_ms 太小,模型把噪声尾巴当成起始音。

还有一种情况,服务端 VAD 不认识非语音的周期性噪声。

动手时先把麦克风输入录下来看底噪电平

ffmpeg -f dshow -i audio="麦克风" -t 10 -af volumedetect -f null -

再往下在客户端加一道高通滤波再推流

ffmpeg -f dshow -i audio="麦克风" -af highpass=f=200,volume=-6dB -ar 24000 -f s16le pipe:1

然后把 turn_detection 改成客户端手动提交

python -c "import json;print(json.dumps({'type':'session.update','session':{'turn_detection':None}}))"

等前面都确认过,再对比调整前后的误触发次数

python -c "print('speech_started per 10min')"

改完先别撤,确认这几项。十分钟静音车内环境里 speech_started 次数降到 0,正常说话仍能即时触发,端到端响应延迟没有变长。

服务端 VAD 只看能量和频谱,对稳态噪声没有免疫力,车载和会议室场景要在推流前做高通与自动增益,别指望调阈值解决。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189