为何说话人日志至关重要

每一段对话都包含两层核心信息:说了什么以及谁在说。自动语音识别(ASR)负责转录文字,而说话人日志(Diarization)则用于界定谁在何时发言,确保内容与参与者精准对应。

若会议或播客的转录文本缺失发言人归属,用户虽能阅读文字,却难以判断承诺主体、异议来源或插话者。这将直接削弱搜索、摘要、行动项提取及语音代理记忆等功能的有效性。

说话人日志旨在识别每位发言人的活跃时间段,包括重叠语音时段。这些时间戳与ASR结合,即可生成带说话人归属的完整转录文本。

NVIDIA Nemotron 3 Diarization 是一款拥有1亿参数的开源权重模型。在 Voice Arena 的 Diarization-Bench 排行榜上,其说话人错误率(DER)为 14.72%,位居第一。该模型支持实时和录制对话中多达八位说话人,能够处理重叠语音,并通过分块处理适应灵活录音长度,提供可定制的流式延迟。

相较于早期仅支持四人的 NVIDIA Streaming Sortformer,Nemotron 3 Diarization 将支持扩展至八人,并在准确性和吞吐量上实现了显著提升。

Nemotron 3 Diarization 的工作原理

离线与流式对话的统一模型

日志系统需解决两大难题:一是检测语音并分配给正确说话人;二是在沉默、中断或长间隔后保持身份一致性。流式处理因仅接收有限上下文,使得第二点更具挑战。

Nemotron 3 Diarization 沿用 Sortformer 方法,按说话人首次出现的时间对输出通道排序。首个新声音占据第一通道,次个占据第二通道,以此类推。这种“到达时间排序”确保了通用说话人标签的稳定性,避免了每段音频重新排列组合的计算需求。

训练数据方面,模型使用了公开及许可语音数据,包括来自 David AI 的多说话人标注真实对话及涵盖21种语言的模拟音频。引入 David AI数据后,复合说话人错误率(DER)从11.19%降至10.42%,降幅达0.77个百分点,适用于离线及超低延迟场景。

模型输出的八个说话人通道为匿名标签(如 speaker_2),而非真实身份。下游应用可通过会议元数据或声纹验证模型,将这些匿名ID映射为具体人员。

从音频到说话人活动

Nemotron 3 Diarization 接收 16 kHz 单声道音频,转换为 Mel 频谱图特征,并经8倍因子堆叠生成 80 ms 帧,输入至带有旋转位置嵌入(RoPE)的31层 Transformer 编码器。

Transformer 上方的 Conv1D 层将预测上采样至输入特征分辨率。默认输出为 [T, 8] 浮点张量,表示每个时间步八个通道的活跃概率。默认步长为 10 ms,支持配置为其他倍数。若两人同时说话,两个通道可在同一帧中活跃,后处理阶段将这些概率转化为带起止时间戳的标签。

在流式推理中,两种记忆机制提供上下文支持:

  • 到达顺序说话人缓存(AOSC):按到达顺序保留早期片段中的说话人信息。
  • 先进先出(FIFO)队列:提供当前片段前的最近帧上下文。

输入缓冲区还包含“右上下文”(当前片段后的音频)。较多的右上下文有助于解释说话人转换,较少的右上下文则降低等待时间。结合当前片段、右上下文、FIFO队列和说话人缓存,模型可在多个延迟点上运行。分块推理消除了固定最大音频时长限制,但在极端噪声或远场采集下性能可能受限。

日志与多说话人 ASR 的区别

独立日志仅产生说话人活动和时间戳,不生成文字;ASR 生成文字但未必保留说话人归属。完整的说话人归属转录管道需结合两者输出。这种分离设计允许应用分别评估日志错误(漏检、误检、分配错误)和 ASR 错误(单词错误)。

平衡延迟与准确性

模型支持多种输入缓冲区延迟配置,推荐值为 30.4、1.04、0.64 和 0.32 秒。较短缓冲区响应更快,较多上下文则提升准确性和吞吐量。需注意,这些值仅为推理前缓冲音频的时间,端到端延迟还需计入计算、网络及ASR处理时间。尽管技术上支持 80 ms 缓冲区,但最低推荐配置为 0.32 秒。

基准测试:Voice Arena 排名第一

在 Voice Arena 初始 Diarization-Bench 评估中,Nemotron 3 Diarization 在12个系统及17个总配置中排名第一。评估涵盖139段英语对话(约22小时)。在对重叠语音评分、无边界容差的情况下,其 DER 为 14.72%,优于第二名系统的 19.3%,相对减少约24%。在100毫秒和250毫秒容差,以及面对面和在线录音场景中,该模型均位列第一。

与 NVIDIA 此前的四说话人流式 Sortformer 基线相比,Nemotron 3 在披露的评分和吞吐量设置下表现更优。

测量日志准确性

主要评估指标为说话人错误率(DER),包含三类错误:

  • 漏检语音:参考说话人活跃,但系统未检测到。
  • 误报:系统标记说话人活跃,但参考中无相应语音。
  • 说话人混淆:检测到语音,但分配给错误说话人。

Nemotron 3 评估涵盖901个特定条件录音,包括多语言电话、会议、近/远场麦克风及复杂声学环境。DIHARD III、AliMeeting 等数据集使用零秒容差,CALLHOME-Part2 使用 0.25 秒容差。

性能提升显著

在1.04秒输入缓冲区延迟下,Nemotron 3 Diarization 在所有八个评估条件下均降低了 DER。相对减少幅度从 CALLHOME-Part2 的9.0%到 NOTSOFAR1 MHM 的65.2%不等,未加权平均相对减少值为 41.0%。在30.4、1.04 和 0.32 秒共享延迟点上,最终模型在全集 DER 上均优于基线。

在高说话人数量条件下,优势进一步扩大。值得注意的是,在两人组的 CALLHOME 子集中,最终模型 DER 为 5.98%,略高于基线的 5.68%;但在整个 CALLHOME-Part2 评估中,DER 从 10.32% 改善至 9.10%,表明其在高说话人场景下提升更为明显。

准确性与吞吐量

模型卡报告了实时因子加速比(RTFx),即总音频时长除以总处理时间。更高 RTFx 意味着单位时间内处理更多音频。

在30.4秒配置下(torch.compile(),批量大小32),Nemotron 3 Diarization 达到 15,113× RTFx,基线为 2,619×;同时 DIHARD III DER 从 19.09% 降至 12.73%。在1.04秒配置下,RTFx 达到 865×,基线为 136×;DER 从 19.60% 降至 13.18%。开发者应在目标硬件上对整个管道进行基准测试,以获取真实的端到端延迟数据。

实际应用与演示

NVIDIA 提供了实时模型演示,支持合成对话、八说话人模式、实时麦克风输入及多语言流式日志处理。用户可通过 ConversationLive MicAudio File 选项体验。演示显示,带说话人归属的转录能清晰区分承诺者与回答者,并保留重叠语音的时间轴信息,助力下游摘要器提取行动项。

合作伙伴 Argmax 已在 Argmax Pro SDK 3 中集成 Nemotron 3 Diarization,支持多达八位说话人的实时归属,并引入预日志转录 API,以改善重叠语音下的转录效果。

使用 NVIDIA NeMo Speech 入门

安装依赖项

确保安装 Python 3.12+、Cython 及最新 PyTorch,随后安装系统包和 NeMo 依赖:

apt-get update && apt-get install -y libsndfile1 ffmpeg
uv pip install Cython packaging
uv pip install 'nemo-toolkit[asr]'

运行离线日志

以下示例加载检查点并使用推荐的30.4秒离线配置处理16 kHz单声道录音:

from nemo.collections.asr.models import SortformerEncLabelModel

diar_model = SortformerEncLabelModel.from_pretrained(
    "nvidia/Nemotron-3-Diarization"
)
diar_model.eval()

diar_model.sortformer_modules.spkcache_len = 264
diar_model.sortformer_modules.fifo_len = 40
diar_model.sortformer_modules.chunk_len = 340
diar_model.sortformer_modules.chunk_right_context = 40
diar_model.sortformer_modules.spkcache_update_period = 300
diar_model._check_streaming_parameters()

predicted_segments = diar_model.diarize(
    audio=["/path/to/conversation.wav"],
    batch_size=1,
)

for segment in predicted_segments[0]:
    print(segment)

输出格式为 start_seconds end_seconds speaker_id。例如:

0.400 2.100 speaker_0
1.800 3.250 speaker_1
3.600 4.700 speaker_0

这表明两位说话人在1.800至2.100秒间重叠。API 支持音频路径、NumPy 数组等输入,专为配备 NVIDIA Ampere、Hopper 或 Blackwell GPU 的 Linux 系统设计。

选择延迟-质量工作点

下表列出了推荐配置参数。延迟值计算公式为:(CHUNK_LEN + RIGHT_CONTEXT) × 80 ms。

配置 输入缓冲区延迟 说话人缓存 FIFO 块大小 右上下文 缓存更新周期
离线风格 30.4 s 264 40 340 40 300
低延迟 1.04 s 264 264 9 4 222
极低延迟 0.64 s 264 264 6 2 222
超低延迟 0.32 s 264 264 3 1 222

降低延迟通常会牺牲准确性和吞吐量,开发者应根据产品需求选择工作点。

将日志与离线 ASR 结合

以下示例展示如何将 Parakeet TDT 0.6B v3 生成的单词时间戳与说话人日志对齐:

from nemo.collections.asr.models import ASRModel

asr_model = ASRModel.from_pretrained(
    model_name="nvidia/parakeet-tdt-0.6b-v3"
)
words = asr_model.transcribe(
    ["/path/to/conversation.wav"], timestamps=True
)[0].timestamp["word"]

turns = []
for segment in predicted_segments[0]:
    start, end, speaker = segment.split()
    turns.append((float(start), float(end), speaker))

def speaker_at(midpoint):
    active = sorted({
        speaker for start, end, speaker in turns if start <= midpoint < end
    })
    if len(active) == 1:
        return active[0]
    return "overlap/ambiguous" if active else "unassigned"

for word in words:
    midpoint = (word["start"] + word["end"]) / 2
    label = speaker_at(midpoint)
    print(f"{word['start']:.2f}-{word['end']:.2f} {label}: {word['word']}")

此中点规则为简单启发式方法,生产级应用需进一步评估重叠处理和边界对齐。

部署注意事项

模型最多支持八位说话人,超出可能导致漏检或分配错误。噪声、混响及领域偏移也会影响性能。下游应用应保留不确定性,并在代表性音频上评估系统整体表现。模型使用受 OpenMDW 许可协议版本 1.1 约束。