两小时搭出「谁说了什么」会议纪要流水线Nemotron-3-Diarization 流式 ASR 组合实战【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization会议录音要变成谁说了什么的纪要业界默认的做法是两段式先用说话人分离Diarization切出每个人的发言片段再把每个片段丢给普通单说话人 ASR 转写。这套流程看起来顺理成章一遇到真实会议就露馅——两个人同时开口时切出来的片段里混着两条声轨单说话人 ASR 要么把两句话拼成一句要么只认其中一个声音。NVIDIA 在 2026 年 9 月开放的 Nemotron-3-Diarization 改变了这个局面它是一枚 1 亿参数、支持最多 8 位说话人、延迟最低 0.32 秒的流式分离模型而仓库里配套的 ASR_INTEGRATION_GUIDE.md 给出了与流式 ASR 深度耦合的完整接法。本文不空谈概念直接基于仓库源码拆解分离模型 流式 ASR的分工、端到端输出格式以及从一段音频文件到结构化纪要的最小实现路径。为什么传统两段式流水线在会议上会崩先把问题说透。传统方案是先分离、后转录Diarization 输出每段语音的起止时间和说话人标签ASR 拿到的是被裁剪出来的时间窗口。问题在于裁剪窗口并不等于干净的单人音频——窗口内所有重叠的声轨都会被一起保留。正如 ASR_INTEGRATION_GUIDE.md 中明确写到的an extracted time range still contains every voice that overlaps it, so a conventional ASR may merge or select the wrong speakers words。也就是说错误不在分离模型切得不够准而在架构本身单说话人 ASR 没有能力感知窗口里同时有几个人在说话。这正是多说话人multitalker方案的价值——让 ASR 直接消费分离模型输出的说话人活动信息而不是把音频切碎再转录。分工分离模型回答谁何时说话ASR 回答说了什么Nemotron-3-Diarization 的职责非常单一模型卡里一句话说得很清楚determinewho spoke when——谁在什么时间说话。它输出的是一个[T, 8]的逐帧概率张量T 是帧数默认每帧 10ms8 个通道对应最多 8 位说话人每一位在每帧上是一个 0~1 的活动概率。为了在极低延迟下做到这件事模型的结构值得留意详见 README.md31 层 Transformer 编码器 RoPE 旋转位置编码总参数量 1 亿输入是 10ms 的 Mel 频谱特征通过8 倍特征堆叠压缩成 80ms 的编码器帧率编码器之上再接一层Conv1D 把预测上采样回 10ms 分辨率保证时间戳精度流式推理时到达顺序说话人缓存AOSC FIFO 队列跨块保留说话人身份信息AOSC 记住前面 chunk 出现过谁FIFO 为每一步处理提供最近的帧上下文从而让 8 个声道在长时间流中保持身份稳定。关键的排序机制来自 Sortformer8 个输出声道不是按说话人是谁排的而是按该说话人在音频中首次出现的先后顺序排列。这绕开了传统分离模型最头疼的排列permutation歧义也让输出标签天然稳定——第一个开口的人永远是 Speaker 0。而说了什么这件事交给与它配对的流式 ASR。仓库给出了两条官方支持路线ASR 选项特点配合方式Multitalker Parakeetmultitalker-parakeet-streaming-0.6b-v1专为重叠语音微调的流式 ASR仅支持英语masked_asrfalse把说话人活动作为条件信息喂给 ASRNemotron 3.5 ASRnemotron-3.5-asr-streaming-0.6b常规单说话人流式 ASR开箱支持 32 种语言区域masked_asrtrue用分离活动去掩蔽每个说话人各自的转写流从而在重叠场景下分离出各人话语这是一个耦合的流式流水线Diarization 持续产出帧级说话人活动ASR 阶段则为每一个被检测到的说话人维护一条独立的转写流。两条流是并行推进的不是先跑完分离再跑 ASR。组合后怎么接一条命令拿到带说话人标签的转录官方集成脚本是 NeMo Speech 仓库中的speech_to_text_multitalker_streaming_infer.py它同时加载分离模型与 ASR 模型按 chunk 流式跑完整段音频并把结果写成一个 JSON 文件。选 Multitalker Parakeet 的组合命令如下python examples/asr/asr_cache_aware_streaming/speech_to_text_multitalker_streaming_infer.py \ asr_modelnvidia/multitalker-parakeet-streaming-0.6b-v1 \ diar_modelnvidia/Nemotron-3-Diarization \ audio_file/absolute/path/to/conversation.wav \ max_num_of_spks8 \ single_speaker_modefalse \ masked_asrfalse \ parallel_speaker_strategytrue \ cache_gatingtrue \ binary_diar_predstrue \ att_context_size[70,13] \ fifo_len264 \ spkcache_update_period222 \ generate_realtime_scriptsfalse \ output_path./speaker_attributed_output.json换用 Nemotron 3.5 ASR 时把asr_model换成对应仓库 IDmasked_asrtrueatt_context_size[56,13]并可用target_langauto让模型自动推断语言。几个参数值得理解而不是照抄max_num_of_spks8会话中维护的说话人流数量的上界不是一定会出现 8 个人。实际说话人由分离模型从音频里发现。说话人少时调低它能显著省显存和算力。cache_gatingtrue只在最近的分离窗口里检测到某说话人活跃时才运行对应说话人的 ASR 流避免为静音段空转计算。fifo_len264FIFO 队列最多保留的 80ms 分离编码帧数spkcache_update_period222每次更新说话人缓存时从 FIFO 取出多少帧。这两者与 chunk 几何强耦合ASR_INTEGRATION_GUIDE.md 特别提醒ASR 与分离模型的 chunk 几何必须保持对齐不要各自独立调参。脚本输出的 JSON 采用 NeMo 的 SegLST 格式每条最终化结果都包含文本、时间范围与匿名说话人标签。渲染出来大致是这个效果Speaker 0: Welcome, everyone. Let us begin. Speaker 1: I have the latest numbers. Speaker 2: I agree, but there is one remaining issue.注意这里有一个语义红线说话人编号只是本次会话流内发现的身份不是生物识别身份。编号会在重连或新会话后变化也不对应真实姓名。如果产品要显示人名必须另做注册/映射enrollment环节这一点在集成指南的 Troubleshooting 一节里被反复强调。最小实现从音频文件到结构化纪要把上面的设计落到能跑的最小流水线只需要三步。第一步装环境。模型基于 NeMo Framework v3.0推荐直接使用 NeMo Speech 仓库的最新 checkout因为多说话人流式辅助代码与模型同步演进apt-get update apt-get install -y libsndfile1 ffmpeg git git clone --branch main --single-branch https://github.com/NVIDIA-NeMo/Speech.git cd Speech curl -LsSf https://astral.sh/uv/install.sh | sh uv sync --python 3.13 --extra asr --extra cu13 --no-dev source .venv/bin/activate第二步预处理。两条模型链路都要求 16kHz 单声道音频其他格式一律先转ffmpeg -i input.mp3 -ac 1 -ar 16000 -c:a pcm_s16le conversation.wav第三步跑通输出。想先验证分离模型本身用 README.md 里的 Quick Start 即可——这是全流程里最快能见到效果的一段代码from nemo.collections.asr.models import SortformerEncLabelModel diar_model SortformerEncLabelModel.from_pretrained(nvidia/Nemotron-3-Diarization) diar_model.eval() # 四档流式配置之一ultra-low latency0.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_size1) for segment in predicted_segments[0]: print(segment)diarize()的输入支持四种形态单个文件路径、路径列表、numpy 数组、JSONL manifest输出既可以是begin_seconds, end_seconds, speaker_index形式的时间片段列表也可以通过include_tensor_outputsTrue拿回逐帧说话人活动概率张量。再往上走一步把分离与流式 ASR 组合起来跑speech_to_text_multitalker_streaming_infer.py就能拿到前面展示的speaker_attributed_output.json——此时谁说了什么已经结构化落地可以直接喂给下游做摘要、行动项提取或知识库入库。如果目标是实时服务而非离线回放集成指南给出了生产化的正确姿势模型权重每个 worker 进程加载一次、跨连接共享以省显存每个客户端连接创建独立的流式会话SpeakerTaggedASR 流式缓冲 说话人缓存均为会话私有绝不能跨客户端共享。核心循环是LiveMultitalkerSession.accept_audio()接收 PCM 块 → 归一化 → 按模型要求的 hop/cache 几何拼帧 → 调perform_parallel_streaming_stt_spk()推进一条流并返回最新转写。把这个方法挂到 WebSocket、HTTP 或任意自定义传输上就是完整的实时会议转写服务。精度与延迟四档配置怎么选流式与精度从来是交换关系模型卡给出了四档官方配置所有参数以 80ms 帧为单位配置输入缓冲延迟CHUNK_LENRIGHT_CONTEXTFIFO_LENUPDATE_PERIODVery high latency离线30.4s3404040300Low latency1.04s94264222Very low latency0.64s62264222Ultra-low latency0.32s31264222延迟的计算口径是(CHUNK_LEN RIGHT_CONTEXT) × 80ms不含计算耗时想更激进单 checkpoint 甚至支持低至 80ms 的输入缓冲。离线配置因为 chunk 大、上下文足精度最高越往超低延迟走DER 缓慢爬升。以 DIHARD III全量、collar0、含重叠为例30.4s 配置下 DER 12.73%0.32s 下仅微增到 13.55%而上一代 4 说话人基线在同等设置下分别是 19.09% 与 19.85%——流式换来的是接近离线水平的精度同时把说话人数上限从 4 翻到 8。在 NOTSOFAR1 SC5-7 人远场会议这类多说话人重灾区离线配置 DER 从基线的 30.49% 降到 11.00%降幅过半推理速度方面离线配置 batch_size32 的 RTFx 从基线的 3204 提升到 12196。完整分数据集、分档位的 DER/SCA/MAE 与 RTFx 数据都在 README.md 的 Performance Evaluation 一节按需查阅即可。落地注意事项许可模型受 OpenMDW License 1.1 约束官方明示支持商业与非商业使用商用前请核对条款。能力边界上限是 8 位说话人超过 8 人必有漏标或误标高噪声、严重混响、超长录音下表现会下降explainability.md 有明确说明。评估纪律DER 数字只有在固定协议下才可比——参考标签来源如 forced-alignment、collar、是否计重叠、流式参数、精度与硬件都要一并报告diarization_evaluation.md 给了完整的报告清单。隐私与身份输出的是匿名通用标签而非身份信息训练数据已获授权但你上传的录音属于你自己的数据处理责任展示人名必须走独立映射。从装环境、转音频、跑通speech_to_text_multitalker_streaming_infer.py到拿到带说话人标签的结构化 JSON核心路径其实只有三条命令加一段 Quick Start 代码——谁在何时说了什么的会议纪要流水线一个工作日的开头就能立起来。剩下的就是把accept_audio()接进你自己的产品里。【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考