NeMo 全家桶再添一员:Nemotron-3-Diarization 与 Multitalker Parakeet 组队后开源语音栈齐了
【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization
2026 年 9 月 23 日,NVIDIA 在 Hugging Face 上放出了 Nemotron 3 Diarization 的开放权重——一个 1 亿参数、最多支持 8 说话人、最低 0.32 秒流式延迟的说话人分离(Speaker Diarization)模型。对熟悉 NeMo 生态的开发者来说,这几乎是最后一块拼图:识别语音的 ASR 早已就位,合成语音的 TTS 早已就位,唯独"谁在何时说话"这道分离问题,此前只能靠 4 说话人的旧版 Sortformer 或各种割裂的社区方案硬撑。本文基于仓库内的模型卡、评测文档与 ASR 集成指南,逐层拆解这个模型的架构设计、流式调参、基准实测,以及与 Multitalker Parakeet 组队后形成的"端到端带说话人转写"流水线。
从"说了什么"到"谁说的":开源语音栈终于闭环
把一句话说清楚:ASR 解决"说了什么",TTS 解决"如何说",而 Diarization 解决"谁在何时说"。三者拼在一起,才是完整的语音产品。在过去很长一段时间里,NeMo 生态的 ASR(Parakeet 家族、Nemotron 3.5 ASR)与 TTS(Nemotron 3 TTS)都是开放权重、可商用的,唯独说话人分离环节——尤其是实时场景——始终是短板。社区里大量本地转写工具(如 Vibe)虽然集成了 Whisper / Parakeet / Nemotron 系模型做转录,但说话人分离普遍依赖后置的嵌入聚类方案,延迟高、稳定性差,重叠语音一多就崩。
Nemotron-3-Diarization 的发布让这条链路第一次以"全家桶"形式闭环:流式 ASR 输出逐词文本,Diarization 模型同步输出逐帧的说话人活动概率,二者在 NeMo 的缓存感知流式框架里耦合运行,最终产出一份带说话人标签的转写稿。仓库里还附带了一段 8 个开源声音的演示视频 nemotron3_tts_8_open_voices.mp4,直观展示 TTS 与多说话人场景的联动。语音输入的最后一环,至此不再依赖闭源服务或第三方拼装。
100M 参数的"8 声源雷达":架构与训练内幕
模型的完整技术规格写在 README.md 的模型卡中,核心是一套 31 层 Transformer 编码器,配合四个关键设计:
- RoPE 旋转位置编码:对长序列位置信息更鲁棒,是流式推理稳定性的基础;
- 8 倍特征堆叠:10ms Mel 谱特征堆叠成 80ms 编码帧率,压缩序列长度、降低计算量,同时为流式帧对齐提供了整数倍几何;
- Conv1D 上采样:编码器之上再接一层卷积,把 80ms 粒度的预测还原回 10ms 输入分辨率,输出帧步长可按 10ms 的倍数自由配置(30ms / 80ms / 240ms);
- AOSC 说话人缓存 + FIFO 上下文队列:源自 Streaming Sortformer 论文的机制——AOSC 保留早期 chunk 的说话人信息以维持跨时间段的身份一致,FIFO 队列则为每一步处理提供最近的帧上下文。
说话人通道的排序遵循 Sortformer 的思路:按每位说话人在音频中的首次出现顺序排列输出通道。这意味着 8 个通道不是固定的"1 号位 2 号位",而是动态指代,模型天然规避了说话人置换(permutation)难题。输出是一个[T, 8]的张量,T 为帧数,每个值是对应说话人的活动概率,可后处理为["speaker1", 0.51, 12.62]这样的"开始秒、结束秒、通用标签"片段。
训练数据与算力同样透明地写在模型卡里:约 1 万小时真实会话(Fisher、AMI、ICSI、AISHELL-4、CALLHOME、NOTSOFAR1、DISPLACE 2024/2026、YODAS-v2 等),外加 82,611 小时由 FastMSS 工具包合成的 1–8 人混音音频;训练在 8 节点共 64 张 A100-SXM4-80GB 上分两阶段完成——先在纯合成数据上离线预训练,再用真实会话 + 合成混音做流式微调。全部训练数据均有来源与授权说明,语音数据作为个人数据的合规边界在 privacy.md 中逐项列明。
0.32 秒超低延迟:流式参数一张表调明白
流式推理的延迟由输入缓冲决定,计算公式为(CHUNK_LEN + RIGHT_CONTEXT) × 80ms。仓库的 README 给出了四档官方推荐配置:
| 配置 | 输入缓冲延迟 | SPKCACHE_LEN | FIFO_LEN | CHUNK_LEN | RIGHT_CONTEXT | UPDATE_PERIOD |
|---|---|---|---|---|---|---|
| 离线(极高延迟) | 30.4s | 264 | 40 | 340 | 40 | 300 |
| 低延迟 | 1.04s | 264 | 264 | 9 | 4 | 222 |
| 很低延迟 | 0.64s | 264 | 264 | 6 | 2 | 222 |
| 超低延迟 | 0.32s | 264 | 264 | 3 | 1 | 222 |
有趣的是,模型本身支持最低 80ms 的输入缓冲,但官方建议的最低档是 0.32s——因为过小的 chunk 会让编码器上下文严重不足。延迟与精度之间是显式的权衡:在 DIHARD III 上,从 30.4s 降到 0.32s,DER 只从 12.73 微升到 13.55,代价极小。而离线配置下输入无时长上限(chunked 推理),流式配置则适合会议、通话、直播等实时场景。
调用方式极其简洁,加载与推理只差几行代码,完整示例见 README.md:
from nemo.collections.asr.models import SortformerEncLabelModel diar_model = SortformerEncLabelModel.from_pretrained("nvidia/Nemotron-3-Diarization") diar_model.eval() # 切换为超低延迟流式配置(0.32s 输入缓冲) diar_model.sortformer_modules.chunk_len = 3 diar_model.sortformer_modules.chunk_right_context = 1 diar_model.sortformer_modules.fifo_len = 264 diar_model.sortformer_modules.spkcache_update_period = 222 diar_model._check_streaming_parameters() predicted_segments = diar_model.diarize(audio=["/path/to/your/audio.wav"], batch_size=1) for segment in predicted_segments[0]: print(segment)输入支持四种形态:单文件路径、路径列表、numpy 数组(必须显式传sample_rate)、以及 line-delimited JSON manifest。仓库中直接提供了.nemo格式的权重文件 Nemotron-3-Diarization.nemo,可离线restore_from加载,不依赖联网拉取。
基准实测:DER 全面下降,多说话人场景接近"清零"
模型卡在 diarization_evaluation.md 中明确了评测协议(DER = 虚警 + 漏检 + 说话人混淆,含重叠语音计分),并与 4 说话人基线diar_streaming_sortformer_4spk-v2.1在 8 组条件上做了同协议对比。以下为离线(30.4s)配置的完整 DER 数据:
| 评测集 | 基线 DER | Nemotron-3-Diarization DER | 降幅 |
|---|---|---|---|
| DIHARD III(1–4 说话人) | 13.98 | 9.13 | −34.7% |
| DIHARD III(5–9 说话人) | 40.21 | 27.58 | −31.4% |
| DIHARD III(全量) | 19.09 | 12.73 | −33.3% |
| CALLHOME-Part2(全量) | 10.32 | 9.10 | −11.8% |
| AliMeeting Test Near | 11.57 | 6.40 | −44.7% |
| AliMeeting Test Far | 13.69 | 10.47 | −23.5% |
| AMI Test MHM | 15.81 | 9.25 | −41.5% |
| AMI Test SDM | 21.42 | 11.14 | −48.0% |
| NOTSOFAR1 MHM(全量) | 21.77 | 6.77 | −68.9% |
| NOTSOFAR1 SC(全量) | 30.49 | 11.00 | −63.9% |
最亮眼的是多说话人硬场景:NOTSOFAR1 的远场单通道(SC)条件 DER 从 30.49 砍到 11.00,MHM 混合麦克风条件从 21.77 砍到 6.77,说话人计数准确率(SCA)从 35.00% 飙到 93.75%,计数平均绝对误差(MAE)从 0.9375 降到 0.0625——几乎每个录音都能数对人数。旧基线在 5–7 说话人场景基本失效,而新模型在 DIHARD III 5–9 人子集上仍把 DER 压到 27.58。
推理速度同样拉开代差:离线配置下 batch=1 的 RTFx(实时倍速)从基线的 1468(compiled)提升到 4385;batch=32 时更是从 2619 提升到 15113。即便在 0.32s 超低延迟档,batch=32 编译后仍能跑到 292× 实时,这意味着单卡撑起几百路并发的 8 人会议转写是完全可行的量级。
组队作战:Multitalker Parakeet 让"谁说了什么"落地
分离模型本身只回答"谁在何时说话",要让输出变成"谁说了什么",必须与 ASR 组队。仓库里的 ASR_INTEGRATION_GUIDE.md 给出了两条官方配对路线:
- Multitalker Parakeet(
multitalker-parakeet-streaming-0.6b-v1):专为重叠加扰语音微调的流式 ASR,仅支持英语,配合masked_asr=false——Diarization 的活动概率作为条件信号喂给 ASR; - Nemotron 3.5 ASR(
nemotron-3.5-asr-streaming-0.6b):常规单说话人流式 ASR,默认支持 32 个语言区域,配合masked_asr=true——用分离结果对每个说话人流做掩码,从而部分识别重叠语音。
这是耦合的流式流水线:Diarization 输出帧级说话人活动,ASR 阶段为每个检测到的说话人维护独立的转录流。关键参数是cache_gating=true——只在最近分离窗口内检测到活跃的说话人上运行 ASR,显著省算力;max_num_of_spks=8是会话维护的说话人流上限,按场景调低可进一步降内存。一条典型的调用命令:
python examples/asr/asr_cache_aware_streaming/speech_to_text_multitalker_streaming_infer.py \ asr_model=nvidia/multitalker-parakeet-streaming-0.6b-v1 \ diar_model=nvidia/Nemotron-3-Diarization \ audio_file=/absolute/path/to/conversation.wav \ max_num_of_spks=8 \ single_speaker_mode=false \ masked_asr=false \ parallel_speaker_strategy=true \ cache_gating=true \ binary_diar_preds=true \ att_context_size='[70,13]' \ fifo_len=264 \ spkcache_update_period=222 \ output_path=./speaker_attributed_output.json输出以 NeMo 的 SegLST 格式落盘,每个最终片段包含文本、时间区间与匿名说话人标签,效果形如"Speaker 0: Welcome, everyone. Let us begin."。注意标签只是会话内的身份代号,不是生物识别身份——指南明确强调,若产品要显示姓名,必须由应用层另行做注册映射。指南还给出了生产级实时服务的完整 Python 骨架(LiveMultitalkerSession):每个客户端连接持有一份独立的流式会话(说话人缓存、ASR 解码状态、时间戳、待处理音频缓冲都是会话级的),模型权重跨连接共享以省显存,逐块喂入 16kHz 单声道 PCM 即可实时返回带说话人的转录。仓库根目录的 streaming_diarization_demo.gif 展示了这套流式 ASR + 分离流水线的实际运行效果。
21GB 显存本地语音助手:从 4 人到 8 人的升级空间
社区此前已有在单张 21GB 显存 GPU 上跑通 NeMo Voice Agent 的实操记录:流式 ASR + 端点检测 + 4 说话人分离 + 双路 TTS(Kokoro / FastPitch-HiFiGAN)+ LLM(Nemotron-9B / Qwen2.5-7B)的本地语音助手栈,全部跑在一张卡上。当时卡点恰恰在说话人分离只支持 4 人。
Nemotron-3-Diarization 的 100M 参数量级与 0.32s 流式延迟,正好为这个栈提供了直接升级路径:8 说话人上限覆盖了绝大多数会议与多人通话场景,Diarization 的帧级活动概率又可以作为cache_gating的开关信号,帮 ASR 和 LLM 阶段省下无效计算。从模型卡的硬件兼容列表看,从 Ampere(RTX 30 系、A100)到 Ada、Hopper、Blackwell(RTX 50 系、B200、DGX Spark)全系支持,消费级显卡即可承载。换句话说,"21GB 显存的本地语音助手"不再是 4 人会议的特供方案,而是可以直面 8 人圆桌的通用底座。
为什么开发者愿意为这套栈买单
把选择理由收敛成三点,每一点都能在仓库里找到实证:
其一,权重开放且可商用。模型受 OpenMDW License 1.1 约束,README 明确标注"This model is ready for commercial or non-commercial use"。对创业团队而言,这等于拿到了一张无版税、无平台绑定的语音入场券。
其二,隐私与合规边界清晰。输出只有[T, 8]的活动概率与匿名通用标签,不含身份信息(见 explainability.md);训练数据有完整来源与授权声明,语音数据作为个人数据的采集、处理责任被逐项披露(见 privacy.md)。更难得的是模型卡没有回避短板:bias 子卡如实填写了偏见缓解措施为"None",技术限制部分明确写了超过 8 人必漏、高噪声与混响下性能下降、降低延迟会牺牲精度——这种透明披露本身就是开发者评估落地风险时最需要的文档。
其三,工程链路完整。从离线评测脚本、流式参数校验、多说话人 ASR 集成,到实时麦克风服务的会话管理代码,全部随仓库或 NeMo Speech 示例脚本提供。评测协议(DER 的 collar、overlap、参考标注来源)在 diarization_evaluation.md 中被强制要求随分数一起上报,防止各说各话的"刷分式评测"。
至此,NeMo 开源语音栈的三驾马车——Parakeet / Nemotron 3.5 ASR 负责转写,Nemotron-3-Diarization 负责分离,Nemotron 3 TTS 负责合成——全部就位且彼此原生对接。对开发者来说,这意味着"采集音频 → 谁在何时说 → 说了什么 → 以何种声音回应"的整条链路,第一次可以在自己的 GPU 上、用自己的数据、按自己的延迟预算,端到端地跑起来。
【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考