先看现象。用 openai 1.51 的 audio.transcriptions 转写一段 8 分钟的中文访谈,response_format 用 text,结果整段是一长串没有标点的文字,标点符号一个都没有,换 json 格式也一样。
真正麻烦的地方在于,几个原因的现象几乎一样。text 格式只回纯文本,标点依赖模型自身断句。另一种情况是音频里停顿短,VAD 没切出句边界。
少数情况下是prompt 参数为空,没有给出标点风格示例。
不容易想到的是,语言被自动识别成粤语或日语,断句规则不同。
先用 verbose_json 看分段与语言
python -c "from openai import OpenAI;c=OpenAI();r=c.audio.transcriptions.create(model='whisper-1',file=open('a.m4a','rb'),response_format='verbose_json');print(r.language,len(r.segments))"
显式指定语言并给出带标点的 prompt
python -c "print({'language':'zh','prompt':'以下是普通话访谈,请使用中文标点。'})"
随后改用支持标点的转写模型对照
python -c "from openai import OpenAI;c=OpenAI();print(c.audio.transcriptions.create(model='gpt-4o-transcribe',file=open('a.m4a','rb')).text[:80])"
长音频按静音切段后分别转写再拼接
ffmpeg -i a.m4a -af silencedetect=noise=-30dB:d=0.6 -f null -
怎么算真的好了,看的是同一批现象。转写结果里出现正常的中文句号与逗号,段落长度合理,随机抽三段与音频内容逐句能对上。
提醒一点。prompt 只在开头起作用,长音频后半段仍会漂,所以切段比反复调 prompt 更稳。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
