一段访谈或多人会议录音转成文字后,分清每句话是谁说的非常重要。Whisper Notes 在 iPhone 和 Mac 上离线完成语音识别和说话人识别(也叫说话人分离),要在准确率和速度之间取舍,而准确率一直是我们优先追求的。最近,我们把内置的说话人识别模型从 pyannote community-1 换成了 NVIDIA 的 Nemotron 3 Diarization,并用 122 段公开的中英文录音对比了两者:说话人识别错误率(DER)从 16.0% 降到了 9.9%。
Nemotron 3 把说话人识别错误率从 16.0% 降到 9.9%
说话人识别错误率(DER)把三种错误按时长合在一起计算:认错人、漏听,以及把杂音当成人声,这是衡量说话人识别最常用的指标。除了这个总指标,下表还列出了用户最常遇到的几类问题,以及两个模型在 Mac 和 iPhone 上的速度与内存。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| 说话人识别错误率(DER,122 段录音) | 16.0% | 9.9% |
| 人数判断正确 | 52% 的录音 | 80% 的录音 |
| 认错人 | 4.5% | 1.0% |
| Mac(M5)处理 1 小时录音 | 约 22 秒 | 约 8.5 秒 |
| Mac 内存占用 | 0.88 GB | 0.12 GB |
| iPhone 15 处理 55 分钟录音 | 约 27 秒 | 约 12 秒 |
| iPhone 15 识别时额外占用的内存 | 约 830 MB | 约 30 MB |
| 最多识别几位说话人 | 模型不设上限(App 里最多 10 位) | 8 位 |
本文表格和图中,绿色表示这一方更好,且差距超出误差范围:准确率看 95% 区间是否不含零,速度和内存看差距是否远大于多次运行间的波动。错误率越低越好。准确率各行基于 122 段公开录音(共 25 小时,中英文)。速度和内存是两个模型通过 Core ML 运行的结果,Nemotron 3 使用神经引擎;Mac 只计处理时间,iPhone 计从开始识别到出结果。
这个下降不是少数录音带来的。下图把 122 段录音逐段的变化,从降得最多排到升得最多:
每根竖条是一段录音,表示换成 Nemotron 3 后错误率变了多少个百分点:零线以下是降低,零线以上是升高。
Nemotron 3 不如旧模型的情况有三种:说话人超过 8 位、全程只有一个人说话,以及段落更常在句子中间断开。
认错人几乎消失:4.5% → 1.0%
三类错误里,认错人最影响阅读:文字一字不差,名字却是错的。漏听是有人说话、模型却没有标出来;把杂音当成人声,则是把没人说话的片段也标给了某个人。这次换模型,改进最大的正是认错人,漏听也明显减少,把杂音当成人声的情况则基本没变。
122 段录音的平均值,单位为语音时长的百分比,每行两根条都从零开始。认错人和漏听的下降都超出误差范围;杂音当人声的差别在误差范围内,所以那根条用浅灰色。各项经四舍五入,相加未必等于合计。
人数判对的录音从 52% 升到 80%
人数判错,往往意味着有一部分话归错了人。人数判少,等于把两个人当成了一个人,两人的话会出现在同一个标签下,这是 pyannote community-1 最常见的错误;Nemotron 3 大幅减少了这种情况,判对人数的录音明显增多。
122 段录音中,两个模型判断的人数与实际人数的对比。pyannote community-1 多数是判少;Nemotron 3 判对的更多,判错时判多、判少各 12 段。
中文录音错误率从 19.7% 降到 10.5%,会议和广播也都更准
不同录音的难度差别很大:远场收音的会议最难,广播最容易。按录音类型、语言和说话人数分组来看,录音不少于 10 段的分组错误率都有下降,中文录音几乎减半;只有 1 人这一组的差别在误差范围内。9 到 12 人的 3 段录音变差了,但样本太少,不做检验。
每组两根条都从零开始:灰色是 pyannote community-1,绿色是 Nemotron 3,条尾是平均错误率。绿色表示下降超出误差范围,浅灰表示差别在误差范围内,琥珀色表示变差。6 段财报电话会议计入总数,但数量太少,不单列。
整理转写稿时,每 10 分钟要手动改的地方从 28.9 处降到 18.9 处
错误率最终会变成整理转写稿的工作量:要把说话人视图改对,至少需要多少次合并段落、拆开段落和改说话人标签。我们在 4 段带逐字参考文本的双人录音(荷兰语 2 段,中文、芬兰语各 1 段)上算了这个次数。读者另一种容易注意到的错误,是一个人说的一句话被拆给了两个人;在 12 场远场收音的英语会议上,两个模型都很少出现这种情况,差别在误差范围内。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| 每 10 分钟需手动修改的次数(4 段双人录音) | 28.9 | 18.9 |
| 一句话被拆给两个人(12 场英语会议) | 0.58% 的句子 | 0.88% 的句子 |
手动修改次数只有 4 段录音,不做统计检验,不能代表普遍情况。“一句话被拆给两个人”指同一个人说的一句话,文字被分进了两个人的段落。
Nemotron 3 更快,内存不到原来的七分之一
在设备上离线运行,速度和内存同样重要。下表是两个模型通过 Core ML 运行时的处理时间和内存,Nemotron 3 使用神经引擎。在我们测的每台设备上,Nemotron 3 都更快,内存也少得多,这对只有 4 GB 内存的老款 iPhone 尤其重要。
| pyannote community‑1 | Nemotron 3 | |
|---|---|---|
| Mac(M5) | ||
| 1 小时录音 | 约 22 秒 | 约 8.5 秒 |
| 内存 | 0.88 GB | 0.12 GB |
| iPhone 15 | ||
| 55 分钟录音 | 26.6 秒 | 11.8 秒 |
| 识别时额外占用的内存 | 833 MB | 30 MB |
| iPhone 12 mini | ||
| 55 分钟录音 | 30.1 秒 | 17.2 秒 |
| 识别时 App 内存峰值 | 638 MB | 71 MB |
多次运行的中位数(pyannote community-1 在 iPhone 15 上只跑了一次),录音都是同一场 55 分钟、10 人参与的财报电话会议。两个模型都通过 Core ML 运行,Nemotron 3 使用神经引擎。Mac 只计处理时间,不含音频解码和模型加载;iPhone 计从开始识别到出结果,含模型加载,pyannote community-1 还含当时配套的后处理。手机全程连着 USB,每次都在机身冷却后开始。
Core ML 第一次在神经引擎上运行一个模型前,要先为这台设备编译模型:Mac 约 7 秒,iPhone 15 约 1 分钟。编译好之后,再次加载只要零点几秒。
pyannote community-1 仍然更好的地方
- 超过 8 位说话人。Nemotron 3 最多识别 8 人;3 段 9 到 12 人的录音里,有 2 段比 pyannote community-1 差。
- 只有一个人说话。14 段单人录音里,Nemotron 3 有 5 段多分出了说话人,pyannote community-1 只有 1 段。
- 段落在句子中间断开。12 场英语会议里,这种分段占 25.8%,pyannote community-1 是 14.6%。
在 Whisper Notes 里用好 Nemotron 3 的几个小技巧
- 知道有几个人,就先设好人数。在 108 段两人及以上的录音里,告诉 Nemotron 3 人数后,有 15 段的人数被改对,没有一段被改错;错误率没有明显变化(+0.16 个百分点,在误差范围内)。
- 只有一个人说话,就不必识别说话人。这样不会偶尔冒出一个“第二个人”。
- 超过 8 个人时,把标签当作初稿。需要时在说话人视图里合并、重命名。
在 Mac 的说话人视图里,从「Not right?」设定说话人数
说话人识别在 iPhone 和 Mac 上用法相同,全程在设备上完成。具体用法见 Whisper Notes 现已支持说话人识别。
两者原理:pyannote 先切片再聚类,Nemotron 3 按出场顺序给人编号
pyannote community-1 是一条三步流水线:先把音频切成 10 秒的窗口,在每个窗口里找出谁在说话(每个窗口最多 3 人,同一时刻最多 2 人);再给每段语音提取一个声纹;最后用 VBx 聚类,把相近的声纹归为同一个人。窗口里的编号只在本窗口内有效,所以总人数要到最后一步才能确定。
Nemotron 3 Diarization 只用一个模型:一个 31 层的 Transformer 编码器,对每个时刻给 8 条说话人轨道各打一个分。每条轨道单独打分,所以几个人同时说话时,几条轨道会同时亮起。它沿用 NVIDIA 的 Sortformer 方法,按每个人第一次开口的先后给轨道编号,最先开口的人永远在第 1 条轨道,这样模型就不用去猜“这个人该排第几”。按模型卡的流式用法,它还用一个按出场顺序排列的说话人缓存记住前面出现过的人,后面的片段就能对上同一个编号。
两种做法各有边界:pyannote community-1 不设人数上限,但同一时刻最多分出两个人;Nemotron 3 能分别标出同时说话的几个人,但只有 8 条轨道,最多识别 8 人。
示意图为简化画法。pyannote community-1:在 Whisper Notes 中约 21 MB,CC BY 4.0(模型卡);分段模型见 Plaquet 与 Bredin(Interspeech 2023),声纹模型来自 WeSpeaker,聚类用 VBx(Landini 等,2022)。Nemotron 3 Diarization:97 MB(Fluid Inference 的 8 位 Core ML 转换版),约 1 亿参数,OpenMDW 1.1(模型卡);方法见 Sortformer 和 Streaming Sortformer 两篇论文。
测试方法
- 录音。122 段公开录音,共 25 小时,英语和中文,每段 1 到 12 位说话人,包括远场收音的会议、广播、财报电话会议和由片段拼成的单人录音。另有 5 段双人录音(英语、荷兰语、中文、芬兰语),其中 4 段带逐字参考文本。
- 数据集。AMI、AISHELL-4、AliMeeting、VoxConverse、Earnings-21、LibriSpeech、IFADV、SKN,以及我们自己的录音;只用许可证允许公开结果的数据集,没有用任何用户录音。
- 指标。说话人识别错误率(DER),按 10 毫秒一帧计算,边界不留容差,重叠语音计入,按录音取平均。
- 统计。95% 区间来自对整段录音的 10,000 次重抽样(bootstrap);少于 10 段录音的分组不给区间。
- 设备。一台 M5 Mac、一台 iPhone 15、一台 iPhone 12 mini;准确率在 Mac 上算出。
- 预先登记。测试方案于 2026 年 11 月 2 日定稿;双人录音的划分于 11 月 4 日冻结,当时还没有任何模型跑过这些片段。
完整测试细节
数据选取。测试问题和规则是为一个更大的基准提前定好的;本文这个子集按许可证筛选,而不是按结果挑选,再用同一批输出、同一套打分重新计算。由 LibriSpeech、AISHELL-4 片段拼成的单人录音,计入各自的来源数据集。我们只公开汇总结果,不公开任何音频或参考文本。
| 数据集 | 许可证 | 用到的录音 |
|---|---|---|
| AMI Meeting Corpus | CC BY 4.0 | 16 场会议,16 段一分钟节选 |
| AISHELL-4 | CC BY-SA 4.0 | 5 场会议,5 段节选,5 段拼接的单人录音 |
| AliMeeting | CC BY-SA 4.0 | 8 场会议,8 段节选,1 段双人录音 |
| VoxConverse | CC BY 4.0(视频版权归原作者) | 30 段广播,18 段节选 |
| Earnings-21 | CC BY-SA 4.0 | 6 场财报电话会议,1 段双人录音 |
| LibriSpeech | CC BY 4.0 | 5 段拼接的单人录音 |
| IFADV | GNU GPL v2 或更高版本 | 2 段双人录音 |
| SKN 芬兰语方言样本 | CC BY(芬兰语言研究所) | 1 段双人录音 |
许可证以各数据集官方页面的说明为准,核对于 2026 年 11 月。
区间。总体下降 6.0 个百分点(4.5 到 7.6)。漏听下降 2.3 个百分点(1.3 到 3.4),认错人下降 3.4 个百分点(2.4 到 4.6);杂音当人声下降 0.30 个百分点,在误差范围内(−0.02 到 0.62)。人数判断正确的比例提高 27.9 个百分点(17.2 到 38.5)。分组中,除 1 人组外,各组区间都不含零。12 场英语会议上,“一句话被拆给两个人”的区间含零,“段落在句子中间断开”的区间不含零。
打分程序。我们的打分程序与 pyannote.metrics 相差不超过 0.003 个百分点。
超过 8 人的录音。这类录音的结果对芯片和音频解码的细微差异很敏感:那场 55 分钟、10 人的财报电话会议,Nemotron 3 换芯片、换设置、换音频解码方式,错误率在 30.6% 到 42.8% 之间浮动,pyannote community-1 是 21.6%。
后处理参数。部分后处理参数在预先登记之后、只用单独的调参录音选定,测试录音只用于报告结果。
局限。准确率只测了英语和中文;手动修改次数只有 4 段录音。Mac 的计时来自一台同时运行其他任务、装着 macOS 测试版的 M5 Mac;手机全程连着 USB,没有测耗电。
试一试
Whisper Notes 的 iPhone 版和 Mac 版都已改用 Nemotron 3 识别说话人。有问题欢迎发邮件到 support@whispernotes.app。