定义
pyannote 是一个用 Python 编写、以 PyTorch 深度学习框架为基础的开源工具库,其主体组件 pyannote.audio 面向说话人日志(speaker diarization)任务,即把一段音频按说话人身份切分为若干连续时段并加以标注[1]。用一句话概括这一任务,就是判断「谁在什么时候说话」[2]。
工具库以「神经网络构件」的方式组织:语音活动检测、说话人变化检测、重叠语音检测与说话人嵌入等子任务各自有独立的模型实现,这些构件既可以单独训练,也可以组合成完整流水线并联合调优[3]。除 pyannote.audio 外,同一项目下还包含用于可复现评测与误差分析的 pyannote.metrics、用于管理实验协议的 pyannote.database 等辅助库[4]。
原理
工具库中的多数子任务被统一建模为序列标注问题:输入是一段特征向量序列 $\mathbf{X}=\{x_1, x_2, \ldots, x_T\}$,输出是长度相同的标签序列 $\mathbf{y}=\{y_1, y_2, \ldots, y_T\}$,类别数 $K$ 随任务而定[1]。由于直接处理长度可变的长音频并不实际,训练时从语料中随机抽取定长子序列组成小批量,测试时则以与训练等长的重叠滑窗逐段处理,再把每个时间步上的多组预测分数取平均得到最终结果[1]。
各子任务只是 $K$ 的取值不同:语音活动检测令 $K=2$,区分「有人说话」与「无人说话」;说话人变化检测同样令 $K=2$,但训练时把变化点附近约 200 毫秒邻域的人为标注为正类,以缓解类别不平衡;重叠语音检测令 $K=2$,判断该时刻是否同时有两人及以上在说话[1]。
自 2.1 版起,默认流水线改为三阶段结构:先以短滑窗对局部音频做端到端说话人分割,再为窗口内每个活跃说话人提取神经说话人嵌入,最后用凝聚层次聚类把所有局部说话人归并为全局说话人[5][6]。分割阶段采用 5 秒窗口、500 毫秒步长,对最多 3 名说话人每个 16 毫秒帧输出一次活跃概率[6]。第 3 步之所以选择经典的凝聚层次聚类而非谱聚类,是因为它只需要 1 个距离阈值作为停止条件,且不要求嵌入按严格周期排列[6]。
flowchart LR
A[输入音频<br/>16 kHz 单声道] --> B[局部神经网络说话人分割<br/>5 秒滑窗 / 500 毫秒步长]
B --> C[按阈值二值化<br/>得到瞬时说话人数]
C --> D[逐窗口提取说话人嵌入]
D --> E[凝聚层次聚类<br/>距离阈值停止]
E --> F[按瞬时人数重构<br/>输出说话人日志]
发展历程
项目源起于埃尔韦·布雷丹 2008 年的博士论文工作,其主题为自动语音处理;自 2014 年起,他把研究重心放在「谁在何时说话」这一问题上[7]。作为开源库的 pyannote.audio 自 2019 年前后已在代码托管平台上公开开发,1.x 系列支持 Python 3.7 及以上版本,主要面向 Linux 与 macOS[8]。
2020 年 5 月,团队在国际声学、语音与信号处理会议(ICASSP)上发表论文,正式介绍 pyannote.audio 及其面向语音活动检测、说话人变化检测、重叠语音检测与说话人嵌入的预训练模型[1]。2022 年 10 月发布的 2.1 版对默认流水线做了大幅重构,形成分割、嵌入、聚类三阶段范式[9]。该版本流水线被用于多项评测竞赛,在 Ego4D 2022 与 Albayzin 2022 中获得第 1 名,在 VoxSRC 2022 中获得第 6 名[5]。
2023 年 11 月发布的 3.1 版移除了对 ONNX 运行时的依赖,分割与嵌入均改由纯 PyTorch 执行,以简化部署[10]。同年团队在 VoxSRC 2023 技术报告中改用 10 秒窗与 1 秒步长、用于重叠语音建模的幂集多类交叉熵损失、WavLM 自监督特征以及 WeSpeaker 预训练 ResNet,最终单系统在测试集上取得 4.77% 的日志错误率(带 250 毫秒容差)[11]。2024 年,布雷丹与樊尚·莫利纳(Vincent Molina)共同创办 pyannoteAI 公司,将非开源的商业模型与云端服务与开源库并行推进[7]。
应用
说话人日志被视作对话式人工智能的基础层,为人类之间以及人机之间的对话提供说话人层面的结构化信息,进而支撑会议转写、呼叫中心分析、语音智能体与视频配音等下游应用[2]。开源模型还常与语音识别系统配合,用于生成带有说话人归属的转写文本[12]。
在具体用法上,预训练流水线可通过从模型仓库加载后直接调用,输入为 16 千赫兹单声道音频,立体声或多声道文件会被自动下混为单声道,采样率不符的文件在载入时自动重采样[10]。若已知说话人数,可通过参数指定精确人数或给出上下界;流水线默认在处理器上运行,也可迁移至图形处理器加速[10]。输出结果可写为 RTTM 格式,便于与其他评测工具衔接[10]。
除日志任务外,配套的能力还包括说话人识别与声纹。日志只给出 SPEAKER_00、SPEAKER_01 之类的通用标签,识别则借助声纹把片段对应到具体身份,二者解决的问题不同[12]。声纹要求音频只含目标说话人且没有重叠,时长上限为 30 秒,模型与语言无关[13]。此外,同一项目下的 pyannote.metrics 提供日志错误率、纯度与覆盖率、识别错误率等指标,并支持在 Python 或 Jupyter Notebook 环境中直接可视化流水线各步骤的输出,用于误差诊断[14]。
局限
该工具库只支持 Python 3.7 及以上版本,且官方面向 Linux 与 macOS,虽有在 Windows 上运行的可能,但并不保证可用,也没有添加官方支持的打算[8]。使用预训练流水线需要从模型仓库下载权重并配置访问令牌、接受模型使用条件,离线部署时还需自行准备本地模型文件与配置文件[10][15]。
聚类这一步本身依赖上游分割模型的结果,分割出错会连带劣化说话人嵌入的质量[6]。分割模型在训练时被设计为置换不变,并限定每个窗口内最多 3 名活跃说话人,因此同一说话人在不同窗口可能被赋予不同编号,需要靠后续聚类重新归并[6]。在 AVA-AVD、Ego4D 等包含大量重叠语音与远场拾音的公开评测集上,各版本流水线的日志错误率仍在 37% 至 46% 区间,说明复杂声学条件下的准确率仍有明显提升空间[2]。
评测口径本身也会影响结论:人工标注无法精确到音频采样级,研究中常在说话人段落边界附近去除 500 毫秒的容差区间,而重叠语音在带容差评测中会被大量剔除,使得最难的部分反而被回避,因此不同系统之间的错误率并不总能直接比较[14][16]。
参见
参考资料
- arxiv.org 上的网页 [引用日期2026-10-14]
- README.md · pyannote/README at main [引用日期2026-10-14]
- spsicassp20vid0175 [引用日期2026-10-14]
- pyannote | GitHub owners [引用日期2026-10-14]
- bredin23_interspeech [引用日期2026-10-14]
- document [引用日期2026-10-14]
- cnrsinnovation.com 上的网页 [引用日期2026-10-14]
- pypi.org 上的网页 [引用日期2026-10-14]
- Changelog [引用日期2026-10-14]
- README [引用日期2026-10-14]
- pyannote.audio speaker diarization pipeline at VoxSRC 2023 [引用日期2026-10-14]
- Feature overview [引用日期2026-10-14]
- How to identify speakers with voiceprints [引用日期2026-10-14]
- INTERSPEECH 2017 [引用日期2026-10-14]
- { [引用日期2026-10-14]
- pyannote.audio speaker diarization pipeline at VoxSRC 2022 [引用日期2026-10-14]