用 openai 1.68 的 Python SDK 调 gpt-4o-mini-tts 合成语音,按老习惯带了 response_format='mp3',接口直接返回 400,原文是 Unknown parameter: response_format,换成 audio.speech.create 的官方示例就能出声,但拿到的文件是 wav。
把日志和配置对完,能解释这个现象的基本就这几处。gpt-4o-mini-tts 的音频格式改由 output_format 指定;SDK 版本低于 1.60 时该字段还没暴露,参数被静默忽略;组织被灰度到了新音频模型,旧参数名在两套后端上表现不同;前端把格式写死在代码里,与后端实际返回的容器不一致。
第一件事是把请求体打印出来确认真正发出去的字段
python -c "from openai import OpenAI;import json;c=OpenAI();print(c.audio.speech.with_raw_response.create(model='gpt-4o-mini-tts',voice='alloy',input='测试',response_format='mp3').http_request.body)"
然后改用 output_format 指定 mp3 再请求一次
curl https://api.openai.com/v1/audio/speech -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d '{"model":"gpt-4o-mini-tts","voice":"alloy","input":"测试","output_format":"mp3"}'
升级 SDK 后核对签名里是否存在 output_format
pip install -U openai==1.68.0 && python -c "import inspect,openai;print(inspect.signature(openai.resources.audio.speech.Speech.create))"
剩下的就是用 ffprobe 确认落盘文件真实容器
ffprobe -v error -show_entries format=format_name -of csv=p=0 out.bin
改完先别撤,确认这几项。请求返回 200,用 ffprobe 看到 format_name 是 mp3,前端播放器不再报解码错误,同一段文本三次请求都能正常出声。
提醒一点。音频接口的参数名在两代模型之间改过,报 Unknown parameter 时先去 SDK 签名里确认字段,别在文档旧版本和代码之间反复猜。这类问题最好一次改到位,反复小改反而容易把原因搅混。
