先看现象。用阿里云智能语音交互的 RESTful 接口转写客服录音,wav 是 8000 采样单声道,按文档填 sample_rate 16000,返回 40000001 提示音频格式错误,本地播放正常。

这类报错背后常见的原因有几处,逐个排除就行。音频真实采样率是 8k 但请求参数填了 16k。也可能是wav 头里声明 16k 而实际数据是 8k,服务端按头解析。

还有一种情况,格式参数写成 wav 但文件其实是 8k 的 amr 改名。

另外,base64 编码了整段音频导致请求体超限被拒。

先读出 wav 头的采样率与位深

python -c "import wave;w=wave.open('call.wav');print(w.getframerate(),w.getnchannels(),w.getsampwidth())"

然后用 ffprobe 再核一次真实格式

ffprobe -v error -show_entries stream=sample_rate,channels,codec_name -of default=nw=1 call.wav

接着按真实采样率填参数重发一次

curl -X POST 'https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/asr?appkey=$APPKEY&format=wav&sample_rate=8000' --data-binary @call.wav

等前面都确认过,再把音频统一转成 16k 再走批量

ffmpeg -i call.wav -ac 1 -ar 16000 call16.wav

恢复的判定其实很直接。同一段录音返回 200 且 result 里有完整句子,8k 与 16k 两条路径都能出结果,字错率差异在可接受范围。

接口是先读文件头再看参数,两边不一致时错误码指向的往往是格式而不是采样率字段,用 ffprobe 看一眼比反复改参数快。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189