前言:为什么 Whisper 还不够?
OpenAI 的 Whisper 模型在 ASR(自动语音识别)领域已经是天花板级别的存在,它能听懂极其模糊的口音和多国语言。但在使用中发现,Whisper 原生不支持 Speaker Diarization(说话人分离)。它只能把音频变成文字,却无法告诉你这段文字是谁说的。
为了解决这个问题,我们需要引入 Pyannote.audio。这是一个基于 PyTorch 的开源音频分析工具包,它的专长就是'听声辨人'。我们要做的,就是把这两个模型'缝合'起来。
架构设计:双管齐下
我们的系统处理流程如下:
- 音频输入:一段包含多个人说话的会议录音。
- 路径 A (Whisper):负责听内容,输出
(开始时间,结束时间,文本)。 - 路径 B (Pyannote):负责听声纹,输出
(开始时间,结束时间,说话人 ID)。 - 对齐融合 (Alignment):根据时间戳,将两边的结果匹配起来。
这个流水线能确保我们既保留了高准确率的转写文本,又获得了清晰的说话人身份标识。
环境准备
首先确保安装了必要的依赖。Whisper 需要 torch 和 transformers,Pyannote 则需要 pytorch 和 pyannote.audio。
pip install openai-whisper pyannote.audio torchaudio
注意 Pyannote 对 CUDA 版本有要求,如果本地没有 GPU,建议使用 CPU 模式,虽然速度会慢一些,但开发调试更方便。
核心实现逻辑
这里的关键在于时间戳的对齐。Whisper 输出的片段可能比 Pyannote 的更细碎,或者反之。我们需要一个合并策略。
下面是一个简化的整合示例,展示了如何加载模型并获取初步结果:
import whisper
from pyannote.audio import Pipeline
import torch
# 加载 Whisper 模型
model = whisper.load_model("base")
result = model.transcribe("meeting_audio.mp3")
# 加载 Pyannote 说话人分离模型
# 注意:实际使用时可能需要下载预训练权重或配置 token
pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization-3.1")
pipeline.to(torch.device("cuda" if torch.cuda.is_available() else "cpu"))
diarization_result = pipeline("meeting_audio.mp3")
在实际运行中,你会发现 Whisper 返回的是连续的文本流,而 Pyannote 返回的是带有说话人标签的时间段。接下来的工作是将它们重叠部分进行映射。
时间戳对齐与输出
这一步是难点。通常的做法是遍历 Whisper 的每一段文本,找到它在 Pyannote 时间轴上对应的说话人 ID。
如果某段时间内 Pyannote 判定为说话人 A,那么该时间段内的所有 Whisper 文本都标记为 A。对于重叠区域,可以根据置信度取最大值,或者简单按时间顺序分配。
最终生成的 JSON 结构通常长这样:


