news 2026/10/10 21:05:57

10 分钟上手 Nemotron-3-Diarization:从下载模型到跑出带说话人标签的会议转写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
10 分钟上手 Nemotron-3-Diarization:从下载模型到跑出带说话人标签的会议转写

10 分钟上手 Nemotron-3-Diarization:从下载模型到跑出带说话人标签的会议转写

【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization

会议录音转写一直存在一个尴尬的断层:ASR 模型能把语音变成文字,但文字上不标注"这句话是谁说的"。一场 8 人的项目周会,转写稿里十几段话来回穿插,事后要靠人工回忆去猜归属——这正是说话人分离(Speaker Diarization)要解决的问题:判断"谁在什么时候说了话"(who spoke when)。

2026 年 9 月 23 日,NVIDIA 发布了开源权重模型Nemotron-3-Diarization,把这一能力从"企业级专有服务"拉到了"单张消费级 GPU 即可本地运行"的层面:约 1 亿参数、支持最多 8 位说话人、流式推理输入缓冲延迟最低可到 0.32 秒,且遵循 OpenMDW 1.1 许可,允许商用。本文基于仓库源码,带你从零开始:装环境、拉权重、跑通离线 Demo,并逐字段读懂带说话人标签的输出。

先看全景:这个模型解决什么,凭什么快

在进入实操前,先建立一个直观认知。说话人分离的经典方案是"先声纹聚类、后时间切分",流程长、依赖多且对重叠语音敏感。Nemotron-3-Diarization 走的是端到端路线:输入 16 kHz 单声道音频,直接输出 8 个说话人通道的逐帧活动概率。根据 README.md 中的架构描述,模型核心是 31 层带 RoPE 旋转位置编码的 Transformer 编码器:

  • 10 ms 的 Mel 频谱特征先做 8 倍堆叠(feature stacking),得到 80 ms 的编码器帧率,这是 0.32 秒超低延迟的关键前提;
  • 编码器上方接一层 Conv1D,把 80 ms 的预测上采样回 10 ms 的输入特征分辨率;
  • 流式推理时,采用 Streaming Sortformer 提出的 AOSC(按到达顺序的说话人缓存)与 FIFO 队列,缓存保留此前各说话人的身份信息,FIFO 为每个处理块提供近期帧上下文,从而在分块流式推理下保持身份不漂移,且音频时长不受限制。

与仓库一并提供的演示动图(streaming_diarization_demo.gif)直观展示了这套模型配合流式 ASR 时"边说话、边出带说话人标签转写"的效果。

两个关键数字值得一提:在 DIHARD III 评测集上,离线配置(30.4 s 缓冲)下模型的 DER 为 12.73%,而上一代 4 说话人基线diar_streaming_sortformer_4spk-v2.1为 19.09%;在 5–9 说话人子集上,DER 从 40.21% 大幅降至 27.58%,这正是"8 人会议"场景最吃力的部分。而把延迟压到 0.32 s 后,DER 仅微增至 13.55%——低延迟与准确率之间的权衡控制得相当好。

第 1 步:装好 NeMo 依赖,把权重拿到本地

模型本体是一份.nemo格式的检查点,仓库根目录即包含 Nemotron-3-Diarization.nemo(约 198 MB,Git LFS 指针指向的真实文件约 189 MB)。推理依赖 NVIDIA NeMo Speech(nemo-toolkit[asr]),官方推荐的安装命令(出自 README.md):

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

要求 Python 3.12+。如果你打算用仓库自带的这份.nemo文件做离线推理,这是最省事的路径;如果希望走 Hugging Face 模型库自动下载,也可以直接使用模型 IDnvidia/Nemotron-3-Diarization(from_pretrained方式,需要可读取该仓库的 HF Token)。两种加载方式在代码中差异很小:

from nemo.collections.asr.models import SortformerEncLabelModel # 方式一:从本地 .nemo 文件恢复(推荐,本仓库自带该文件) diar_model = SortformerEncLabelModel.restore_from( restore_path="Nemotron-3-Diarization.nemo", map_location='cuda', strict=False, ) # 方式二:从 Hugging Face 直接拉取 # diar_model = SortformerEncLabelModel.from_pretrained("nvidia/Nemotron-3-Diarization") diar_model.eval()

模型运行时要求 NVIDIA GPU 环境(官方支持 Ampere 及更新的架构),评估配置默认使用 BF16 精度,一张 24 GB 显存级别的显卡即可流畅承载离线与流式推理。

第 2 步:一条路径跑通离线 Demo

仓库 README.md 的 Quick Start 给出了最小可用示例,这里拆解成"配置流式参数 + 调用 diarize"两步。SortformerEncLabelModel的流式行为由一组以80 ms 帧为单位的参数控制,离线场景对应"Very high latency"档位:

diar_model.sortformer_modules.chunk_len = 340 diar_model.sortformer_modules.chunk_right_context = 40 diar_model.sortformer_modules.fifo_len = 40 diar_model.sortformer_modules.spkcache_update_period = 300 diar_model._check_streaming_parameters() predicted_segments = diar_model.diarize(audio=["/path/to/your/audio.wav"], batch_size=1)

diarize()的入参有 4 种形态,覆盖从"单文件快速验证"到"批量/流式服务"的全部场景:

输入方式写法注意事项
单个文件路径audio="/path/to/a.wav"支持.wav/.flac/.opus/.mp3
路径列表audio=["a.wav", "b.wav"]批量推理
Numpy 数组audio=np.random.randn(16000*10).astype(np.float32)必须同时传sample_rate,默认 16000
JSONL manifestaudio="/path/to/manifest.json"每行含audio_filepath、offset、duration

对于 numpy 数组和 manifest 输入,官方文档反复强调:numpy 数组必须显式指定sample_rate(默认 16 kHz);manifest 则允许按offset/duration切片,例如只处理一段 600 秒会议录音中的指定区间:

{"audio_filepath": "/path/to/multispeaker_audio1.wav", "offset": 0, "duration": 600}

如果手头音频不是 16 kHz 单声道,先做一次转换(见 ASR_INTEGRATION_GUIDE.md):

ffmpeg -i input.mp3 -ac 1 -ar 16000 -c:a pcm_s16le conversation.wav

想对效果做量化验证、按collar/ignore_overlap复现 DER 指标的读者,可以进一步使用 NeMo Speech 的e2e_diarize_speech.py评测脚本,传入 manifest、RTTM 参考标注与上述流式参数组合——评估协议的完整说明见仓库的 diarization_evaluation.md。

第 3 步:读懂输出——两种形态,一个逻辑

diarize()的默认返回是一份"带说话人标记的时间片段"列表,形如:

['speaker1', 0.51, 12.62] ['speaker2', 12.98, 25.10] ...

每个元素包含三个字段:通用说话人标签(speaker index)、起始秒、结束秒。这正是会议转写下游最需要的形态——不关心声纹是谁,只关心"第几号发言人、在哪段时间说话"。

如果需要更细粒度的信息,传入include_tensor_outputs=True会额外返回逐帧说话人活动概率张量:

predicted_segments, predicted_probs = diar_model.diarize( audio=["/path/to/your/audio.wav"], batch_size=1, include_tensor_outputs=True, )

predicted_probs是一个[T, 8]的浮点张量:T是输出帧数(默认帧步长 10 ms,可配置为 30/80/240 ms 等 10 的倍数),8 个通道分别对应 8 位说话人的活动概率,取值范围[0, 1]。

理解这 8 个通道的顺序很重要:通道按说话人在音频中的首次出现时间排序(arrival-time ordering)。这是 Sortformer 系列模型"置换解耦"设计的核心——传统 diarization 模型存在说话人排列歧义(permutation problem),即同一个说话人在不同片段可能被分到不同通道;Nemotron-3-Diarization 通过按首现排序统一了通道语义,再配合流式场景下的 AOSC 说话人缓存,使得"1 号说话人"从头到尾都指向同一个人,不会中途漂移。这也意味着:输出标签是会话内匿名的身份编号,而非真实姓名或生物特征。若应用需要显示人名,必须在系统层面单独做注册映射(详见 ASR_INTEGRATION_GUIDE.md 的说明)。

时间片段可以直接喂给下游 ASR 做"切段转写",但仓库更推荐的是与多说话人流式 ASR 的联合部署:以multitalker-parakeet-streaming-0.6b-v1或nemotron-3.5-asr-streaming-0.6b作为 ASR 侧,由speech_to_text_multitalker_streaming_infer.py脚本把 diarization 的逐帧活动概率与 ASR 流对齐,最终产出"谁说了什么"的完整转写,输出到 SegLST 格式 JSON:

Speaker 0: Welcome, everyone. Let us begin. Speaker 1: I have the latest numbers. Speaker 2: I agree, but there is one remaining issue.

延迟与精度的取舍:四档配置怎么选

流式推理的延迟由(CHUNK_LEN + RIGHT_CONTEXT) × 80 ms决定,即"输入缓冲延迟"(不含计算时间)。README.md 给出了四档推荐配置:

配置延迟SPKCACHE_LENFIFO_LENCHUNK_LENRIGHT_CONTEXTUPDATE_PERIOD
Very high(离线)30.4 s2644034040300
Low1.04 s26426494222
Very low0.64 s26426462222
Ultra-low0.32 s26426431222

选择逻辑很直观:录好的会议文件直接走离线档(准确率最高);实时同传、现场速记等服务按可接受的延迟选低档或超低档。实测数据显示(README.md 性能表),从离线切到 0.32 s 超低延迟,DIHARD III 的 DER 仅从 12.73% 升到 13.55%;而推理速度方面,离线档 eager 模式下 RTFx 达 1340(batch=1)/ 12196(batch=32),即便超低延迟档也有 12.5 / 199,远超实时需求。

最后提醒三件容易踩坑的事:其一,模型上限是 8 位说话人,音频中说话人超过 8 个时必然出现漏检或错配(explainability.md 明确标注了这一技术限制);其二,numpy 数组输入漏传sample_rate会得到错误结果;其三,说话人标签是会话级、非持久化的,重连新会话后标签编号可能变化,不能把标签当身份标识使用。至于数据合规,模型本身输出不含身份信息、训练数据均已授权,但你上传到服务的音频仍属个人数据,采集与存储责任在自己一方(详见 privacy.md 与 safety.md)。

从安装依赖到读懂第一段带标签的输出,整个链路不超过 10 分钟。下一步可以顺着 ASR_INTEGRATION_GUIDE.md 把多说话人流式 ASR 接进来,把"谁在何时说话"升级成完整的"谁说了什么"。

【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 21:04:36

聚水潭销售订单→钉钉赠送及内购申请:单策略回传单号实战教程

这个策略解决什么问题某零售企业在钉钉上用一张「公司产品赠送及内购申请表」做内部福利与样品领用审批,审批通过后再到聚水潭里落地为销售订单。问题是:审批单与销售单在两边各跑一套号,员工要把单号手动复制回钉钉,3 个月后两边…

作者头像 李华
网站建设 2026/10/10 21:02:05

PCA9422+PIC18F67K40构建可测可控可溯的嵌入式电源管理系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/10 21:00:37

YOLOv5 TensorRT Windows DLL工业部署方案

简介:本资源是面向计算机视觉开发者与嵌入式AI工程师的YOLOv5模型TensorRT加速部署方案,聚焦于Windows平台下高性能目标检测的工程化落地。它提供已编译的DLL动态链接库,封装了YOLOv5模型经TensorRT优化后的推理能力,显著提升边缘…

作者头像 李华
网站建设 2026/10/10 21:00:33

Tab 编程 + Copilot 让 AI 写代码:TaoToken 统一 Key 接入与本地验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华