报错是这么冒出来的。会议转写用 gpt-4o-transcribe,想直接拿到谁说了哪句,于是加了 diarize=true,返回 400 说 unsupported parameter,退回去只拿文本,40 分钟的会议稿里两个说话人全并成了一段。
中间走过弯路,把「账号所在区域还没放开说话人分离能力」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。diarize 参数只在 realtime 转写接口上开放。另一种情况是录音本身是单声道混音,模型没有可用的声道线索。
另外,转写结果里 speaker 字段只在部分响应格式下返回。
先改用支持说话人分离的模型名先验证能力
curl https://api.openai.com/v1/audio/transcriptions -H "Authorization: Bearer $KEY" -F file=@meeting.m4a -F model=gpt-4o-transcribe-diarize -F response_format=diarized_json
随后把响应格式换成 diarized_json 才能看到 segment
python -c "import json;d=json.load(open('resp.json'));print([(s.get('speaker'),s['text'][:20]) for s in d['segments']][:5])"
然后用 ffprobe 确认原始录音声道数
ffprobe -v error -show_entries stream=channels -of csv=p=0 meeting.m4a
单声道素材改走本地 pyannote 补齐说话人标签
pip install pyannote.audio==3.3.2 && python -m pyannote.diarize meeting.m4a --out labels.rttm
怎么算真的好了,看的是同一批现象。响应里 segments 每条都带 speaker 字段,抽查前十分钟与人工标注一致,两个说话人不再粘连,导出的字幕能按人分色。
提醒一点。说话人分离不是所有同名音频接口都有的参数,报 unsupported 说明该模型没有这个能力,比在参数拼写上耗时间更有效的是换模型名或换接口。这类问题最好一次改到位,反复小改反而容易把原因搅混。
