首页博客 → 谁说了什么:转录文本中的说话人分离

谁说了什么:转录文本中的说话人分离

发布于 2026-08-05 · 5 分钟阅读

这是关于转录最常见的问题,答案却最不让人满意:单个混音文件转出来是一条文本流,没有说话人标签。好消息是,大多数真实场景下你仍然能拿到区分——通常靠改变录音方式,而不是转录方式。

API 能做什么、不能做什么

先把话说直,免得在错误的假设上盖楼:转录接口返回文本和带时间轴的分段。它不返回说话人标签,也没有任何参数能打开这个功能。

说话人分离——判断有几个人在说话、每句话出自谁口——和识别是两个独立的任务。在抢话、相似嗓音和嘈杂房间里它确实很难,做这件事的是另外的模型。

所以实际的问题不是「怎么打开它」,而是「怎么安排事情让自己不需要它」。

方案一:每个说话人单独录音

遥遥领先的最佳方案,也最便宜——成本只是录音前做一个决定。

各个文件单独转录,就得到完美的区分。按时间戳交错合并,还原整场对话:

rows = []
for name, path in [("主持人", "a.mp3"), ("嘉宾", "b.mp3")]:
    with open(path, "rb") as f:
        r = client.audio.transcriptions.create(
            model="whisper-1", file=f, response_format="verbose_json")
    rows += [(s.start, name, s.text.strip()) for s in r.segments]

for start, name, text in sorted(rows):
    print(f"[{int(start)//60:02d}:{int(start)%60:02d}] {name}: {text}")

方案二:拆分立体声声道

如果录音是立体声、一人一个声道——电话系统和部分录音笔很常见——区分早就藏在文件里了:

ffmpeg -i call.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav

然后分别转录两个文件,按上面的方式交错。先确认声道确实是分开的——放进播放器分别听一下左右声道。两个声道都混着两个人声音的立体声文件,拆了也没有收获。

方案三:转录之后人工标注

两个人的对话,发言轮次交替得很有规律,角色通常从内容就能看出来——一个提问,另一个回答。通读一小时的转录文本并标上名字,只要几分钟。

语言模型可以从文字起草标注,但把结果当草稿看:它靠措辞推断,两人观点一致的段落它会自信地标错。发布之前对着时间轴抽查。

方案四:独立的说话人分离模型

如果确实需要在混音音频上自动打标——研究语料、合规档案、你控制不了的会议——路径是跑一个专门的分离模型,产出带时间的说话人轮次,再与转录分段对齐。

现实的代价:多维护一个模型、在转录之外多花 GPU 时间,而且恰恰在你最需要的地方——抢话和短插话上——准确率最差。这是一个真正的项目,不是一个参数。

动手之前,先确认方案一到三覆盖不了你的情况。实践中它们覆盖了大多数。

哪种方案适合哪种场景

场景最佳做法
你来安排的访谈两台录音设备,一人一台
销售或客服通话电话平台按通话方分轨录制
你主持的视频会议每位参会者单独的音频文件
一人一声道的立体声录音用 ffmpeg 拆分声道
两人对话、只有混音文件转录后人工标注
无法重录的大型档案专门的说话人分离模型

投入之前还值得确认一件事:说话人标签实际被用到的频率有多高?会议纪要和通话质检里,决定本身远比谁说的重要——不少分离系统是为一个没人真正需要的需求建的。

用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。

免费获取 API 密钥

常见问题

API 能自动标出说话人吗?

不能。它返回文本和带时间的分段;说话人标注是独立的任务,没有参数能打开。实际的答案是把参与者分开录音。

拿到区分最简单的办法是什么?

把每个说话人录到单独的文件或声道。各自转录就得到精确的区分,成本只是安排一下录音方式。

分开的音轨怎么合回一场对话?

每条音轨请求 verbose_json,给每个分段标上说话人名字,然后把所有分段按开始时间排序。

语言模型能猜出谁说了什么吗?

它能从措辞起草一份标注,但那是推断不是事实——两人说相似内容的段落会被标错。当草稿用,对着音频抽查。

值得跑一个独立的分离模型吗?

只对无法重录的档案值得——研究语料或合规材料。代价是多一个模型、更多 GPU 时间,而且在抢话上准确率最弱。

相关阅读