把 response.audio.delta 里的内容直接写进文件,得到的二进制播放器打不开,标称的采样率也对不上,试了几个播放器都提示格式不支持。
一开始怀疑是「分片顺序依赖 sequence 字段,乱序拼接会出现杂音」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。delta 是 base64 编码的 PCM 片段,要先解码再拼接。少数情况下是PCM 没有文件头,要自己补 wav 头,采样率固定 24000。
另外,用文本模式写文件会把 base64 当字符串存进去。
上来先把收集到的 delta 解码成裸 PCM
python -c "import base64;open('a.pcm','wb').write(base64.b64decode(open('delta.txt').read()))"
给 PCM 补一个 24k 单声道的 wav 头
python -c "import wave;w=wave.open('a.wav','wb');w.setnchannels(1);w.setsampwidth(2);w.setframerate(24000);w.writeframes(open('a.pcm','rb').read());w.close()"
接着用帧数反算时长核对是否合理
python -c "import wave;print(wave.open('a.wav').getnframes()/24000)"
末了用 ffprobe 确认采样率与声道数
ffprobe -v error -show_entries stream=sample_rate,channels a.wav
恢复的判定其实很直接。ffprobe 显示 sample_rate 为 24000、channels 为 1,播放器能正常播放且时长与对话长度相符,波形没有断续。
补一句。音频事件是按块推送的,服务端不会替你封装容器,落盘时补头这一步省不掉,否则拿到的永远是裸流。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
