会议转写三件套就位:流式 ASR + 说话人分离 + 大模型摘要,本地语音助手进化到哪一步了
【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization
把一段会议录音变成"谁在什么时候说了什么,以及整场会议讲了什么"——这套能力被拆成三件套:流式 ASR(转写)、说话人分离(Diarization,分人)和大模型摘要(提炼)。过去两年,三件套各自都有开源代表,但拼装时总有短板:Whisper 转写很稳却天生非流式;说话人分离要么只能离线跑、要么最多认 4 个人;摘要环节则完全依赖云 API 的隐私取舍。
2026 年 9 月 23 日,NVIDIA 发布开源权重模型 Nemotron-3-Diarization,把"短板"补上了最关键的一块:100M 参数、支持最多 8 人、流式/离线双模推理、输入缓冲延迟最低可到 0.32 秒,且采用 OpenMDW 1.1 许可证允许商用。本文基于该仓库源码与社区实测情报,拆解这套三件套管道目前的真实成熟度、本地部署的硬件门槛,以及还差在哪。
一、三件套各自的开源代表与成熟度
先说结论:三件套里,ASR 和摘要已经高度成熟,说话人分离此前是"能用但不够用"——流式能力与多说话人上限是两个主要缺口。
流式 ASR 的开源版图已经相当拥挤。OpenAI Whisper 用大模型思路解决了通用转写和多语言,但逐块处理、延迟高;NVIDIA 的 Parakeet / Nemotron 3.5 ASR 系列走的是"流式听写"路线,专为低延迟实时转写优化,Nemotron 3.5 ASR 开箱支持 32 种语言-locale;阿里 FunASR 则把中文生态做成了全家桶(含标点恢复、VAD);社区端还有 audio.cpp 这类纯 C++ 引擎,把 Nemotron ASR 量化成 GGUF 后可在 CPU/Metal/Vulkan 上以 2~9 倍加速跑流式转写。ASR 不缺选择,缺的是"和说话人分离对齐"的流式管道。
摘要环节在本地也能闭环。7B~9B 量级的本地 LLM(如 Qwen、Nemotron-9B)通过 Ollama 等工具即可对转写文本做摘要、议程提取与待办整理,这也是 Vibe 等桌面工具集成"本地摘要"的标准做法,技术上没有悬念。
说话人分离则是短板所在。pyannote.audio 长期是开源基准,但主流路径是离线聚类,流式支持有限;NVIDIA 此前开源的流式 Sortformer 模型只支持 4 个说话人。Nemotron-3-Diarization 的定位就是补上"实时 + 8 人"这一格:基于 Sortformer 架构,按说话人在音频中的首次到达顺序排列输出通道,从根上化解多说话人标签置换问题;流式推理则采用 Streaming Sortformer 引入的 AOSC(到达顺序说话人缓存)与 FIFO 队列——AOSC 把较早 chunk 的说话人信息保留下来维持身份一致性,FIFO 为每个处理步提供最近的帧上下文(见 README.md)。
二、Nemotron-3-Diarization:把"谁在何时说话"做成流式
架构与参数
模型本体是 100M 参数的 Transformer 编码器:31 层、RoPE 旋转位置编码;输入 10ms 的 Mel 频谱特征,先做 8 倍特征堆叠降采样到 80ms 编码器帧率,编码后由 Conv1D 上采样回 10ms 分辨率输出。整体链路(见 explainability.md):
- 输出为
[T, 8]浮点张量,T 为输出帧数,8 个通道按说话人到达顺序排列,每通道是[0,1]的说话人活动概率; - 默认输出步长 10ms,可配置为 10ms 的任意倍数(30ms / 80ms / 240ms);
- 分块推理下音频时长不受限。
值得注意的一个细节:README 明确写道,单个 checkpoint 即可支持低至 80ms 的输入缓冲延迟,只是官方推荐的最低配置是 0.32 秒——也就是说延迟与精度由同一份权重通过超参切换,不必为流式单独下载模型。
四档延迟配置:同一份权重,四种档位
流式行为由 5 个参数决定(均以 80ms 帧为单位):SPKCACHE_LEN(说话人缓存帧数)、FIFO_LEN(当前 chunk 前附加的 FIFO 帧数)、CHUNK_LEN(处理块帧数)、RIGHT_CONTEXT(chunk 后附加的未来帧数)、UPDATE_PERIOD(从 FIFO 提取更新说话人缓存的帧数)。输入缓冲延迟 =(CHUNK_LEN+RIGHT_CONTEXT)× 80ms,不含计算时间。官方推荐配置如下:
| 配置 | 延迟 | 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 |
调用方式同样简洁——加载模型、设置流式参数、直接出带时间戳的说话人片段:
from nemo.collections.asr.models import SortformerEncLabelModel diar_model = SortformerEncLabelModel.from_pretrained("nvidia/Nemotron-3-Diarization") diar_model.eval() 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) for segment in predicted_segments[0]: print(segment)输入支持四种形态:单个文件路径、路径列表、NumPy 数组、JSONL manifest(每行含audio_filepath/offset/duration),统一要求 16kHz 单声道(wav/flac/opus/mp3)。输出也可二选一:带说话人标记的时间片段列表,或逐帧说话人活动概率张量(include_tensor_outputs=True)。
评测数据:DER 大幅下降,且几乎"延迟换精度"不成立
官方在 8 个测试集上对比了基线diar_streaming_sortformer_4spk-v2.1(4 人模型),社区实测归纳为"DER 平均下降约 42%,多说话人场景降幅达 70%"(详见 README.md 与 diarization_evaluation.md)。挑几个关键数字(DER 越低越好,均含重叠语音):
| 测试集 | 基线 30.4s | 新模型 30.4s | 新模型 0.32s |
|---|---|---|---|
| DIHARD III(全量) | 19.09 | 12.73 | 13.55 |
| DIHARD III(5–9 人) | 40.21 | 27.58 | 29.49 |
| NOTSOFAR1 SC(5–7 人) | 38.42 | 13.21 | 17.61 |
| AliMeeting 近场 | 11.57 | 6.40 | 7.19 |
| CALLHOME-Part2(全量) | 10.32 | 9.10 | 11.32 |
两个值得注意的现象:其一,多说话人场景(5 人以上)的收益远大于 2 人场景——基线在 NOTSOFAR1 5–7 人场景的 SCA(说话人计数准确率)仅 33% 左右,新模型升至 78%;其二,从 30.4s 切到 0.32s 超低延迟,DIHARD III 全量 DER 只从 12.73 涨到 13.55(约 0.8 个百分点),AliMeeting 近场从 6.40 涨到 7.19——延迟换精度的代价被压到了很小。推理速度上,30.4s 离线配置 batch_size=32 时 RTFx(实时倍率)从基线的 3204 提升到 12196,编译后更达 15113,即约 4.7 倍提速;0.32s 流式配置 batch_size=1 也有 12.5 倍实时倍率。这些数据在 Blackwell RTX PRO 5000 上以 BF16 精度测得。
三、三件套如何组装:带说话人标签的流式转写
说话人分离产出的是"谁在何时说话",要和 ASR 拼成"谁说了什么",关键在于耦合的流式管道,而非事后切音频再逐段转写。仓库中的 ASR_INTEGRATION_GUIDE.md 给出两种官方配对:
- 方案一:Multitalker Parakeet Streaming 0.6B(
masked_asr=false):专为重叠语音微调的多说话人流式 ASR,把说话人活动作为条件输入,仅支持英语; - 方案二:Nemotron 3.5 ASR Streaming 0.6B(
masked_asr=true):常规单说话人流式 ASR,用分离活动掩码各说话人流,可部分处理重叠,支持 32 种语言-locale。
官方示例命令(节选):
python examples/asr/asr_cache_aware_streaming/speech_to_text_multitalker_streaming_infer.py \ asr_model=nvidia/nemotron-3.5-asr-streaming-0.6b \ diar_model=nvidia/Nemotron-3-Diarization \ audio_file=/absolute/path/to/conversation.wav \ max_num_of_spks=8 \ masked_asr=true \ parallel_speaker_strategy=true \ cache_gating=true \ binary_diar_preds=true \ att_context_size='[56,13]' \ fifo_len=264 \ spkcache_update_period=222 \ target_lang=auto \ output_path=./speaker_attributed_output.json最终输出是 NeMo SegLST 格式的speaker_attributed_output.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.几个工程要点值得展开:
max_num_of_spks=8是会话维护的说话人流上限,不是承诺一定出现 8 人——活跃说话人身份由音频驱动发现;降低该值可显著减少计算与显存。cache_gating=true只对"最近分离窗口内活跃"的说话人跑 ASR,省掉大量空转计算。- ASR 与分离模型的 chunk 几何必须对齐(
fifo_len、spkcache_update_period等不能独立乱调),否则流式参数校验直接失败。 - 更现实的替换方案:如果说话人很少重叠,可先分离再按段切割、用普通单说话人 ASR 逐段转写——但指南明确警告这不是等效替代:切割出的时间段仍包含所有重叠进来的声音,常规 ASR 可能选错或合并说话人。
指南还给出了生产级实时麦克风服务的完整骨架:模型权重每个 worker 加载一次、可跨连接共享省显存;每个客户端连接创建独立流式会话(SpeakerTaggedASR+ 缓存感知音频缓冲),accept_audio()接收 PCM 块、内部按 hop/cache 几何组帧、返回最新带说话人标签的转写文本;说话人缓存、ASR 解码状态、时间戳、转写历史全部是session 级状态,严禁跨客户端共享。连接断开即重置会话——这意味着"Speaker 0"这类标签是会话内匿名标识,不承载生物身份,展示人名需应用层另行做注册映射。
四、本地全套部署的硬件门槛实测
把三件套全部落在本地,硬性门槛比想象中低。逐层拆解:
说话人分离这一层最轻。100M 参数、BF16 权重约 200MB 量级,RTX 3060(12GB)级别的卡即可顺畅跑流式;0.32s 配置在 RTX PRO 5000 上 batch_size=1 也有 12.5× 实时倍率(eager),消费级 GPU 留足余量。即便 CPU 推理,30.4s 离线配置 batch_size=32 的 12196× RTFx 也说明吞吐根本不是瓶颈。
ASR 层有极多降级选项。桌面工具 Vibe(Rust + ggml)把 Whisper / Parakeet / Nemotron 系模型量化成 GGUF(Q4_K_M / Q8_0),在无 GPU 的 Mac/PC 上也能离线转录,支持 GPU 加速(Vulkan/CoreML);audio.cpp 则让 Nemotron 3.5 ASR 以纯 C++ 跑流式麦克风转写。若选 Nemotron 3.5 ASR 0.6B,权重体量与分离模型同级,16GB 显存的消费卡完全装得下两枚。
摘要层决定整机的显存预算。社区实测的 NeMo Voice Agent 方案给出一个清晰的参考坐标:单张 21GB 显存 GPU即可本地跑通"流式 ASR + 端点检测 + 4 人说话人分离 + 双路径 TTS(Kokoro / FastPitch-HiFiGAN)+ LLM 摘要(Nemotron-9B / Qwen2.5-7B)+ 工具调用"的完整语音助手栈。把 LLM 换成 7B 量化版,8GB 卡也能闭环;再退一步,摘要用 CPU 上的 GGUF 小模型,三件套可以在无独显的机器上以"转写实时、摘要准实时"的方式运行。
社区横向对比(Qwen3-ASR、Voxtral、Nemotron 3.5 ASR 的 audio.cpp 实测)显示流式 ASR 的推理加速比可达 2~9 倍,字节级一致性有保障。综合判断:16GB 显存是"全精度全家桶"的舒适区,8GB + 量化是及格线,纯 CPU 能跑简化版——这已经显著低于两年前"本地会议转写至少要一块专业卡"的普遍认知。
五、下一个缺口:评测规范与中文优化
三件套拼齐后,真正暴露出来的是两个"软缺口"。
其一,评测口径比跑分本身更值得较真。官方 DER 数字有严格的协议约束(见 diarization_evaluation.md):DER = 虚警 + 漏检 + 说话人混淆;必须声明 collar(DIHARD III 等为 0s,CALLHOME 为 0.25s)、是否计入重叠语音、参考标注来源。README 特别强调,AMI / AliMeeting / NOTSOFAR1 使用的是forced-alignment 参考标签——因为这些语料的原始标注按转写用途生成,会把段内静音标成语音、虚增参考活动量;换一套参考标签就是换一套评测协议,数字不可直接比较。对中文社区而言,这意味着:转写/摘要模型可以直接套用各自 benchmark,但说话人分离的"中文实测 DER"目前只有 AliMeeting 近/远场各 20 条录音,样本量单薄,谁想在中文场景复现数字,都必须先对齐参考 RTTM 与评测脚本版本。
其二,中文场景的三件套仍有拼接缝。好消息是模型训练语料并不缺中文:真实对话含 AISHELL-4、AliMeeting 普通话语料,混音模拟还覆盖多语言(DISPLACE 印地语/卡纳达语等),中文 AliMeeting 近场 DER 已做到 6.40(30.4s)对基线 11.57 的领先。但管道端仍有断层:官方推荐的流式 ASR 配对中,Multitalker Parakeet 仅支持英语;中文流式转写要么用 Nemotron 3.5 ASR 的 32 语言-locale(含中文),要么换用 FunASR 等中文引擎再自行对齐帧几何——指南反复强调 ASR 与分离的 chunk 几何必须对齐,这给"混搭引擎"设了不小的工程门槛。摘要环节同样面临中文 LLM 选型与转写文本的格式适配。此外还有工程上的隐性成本:VAD、标点恢复、语气词过滤在中文会议口语里远比英语重要,目前这些组件在流式管道里大多是外挂而非内置。
从更长的时间轴看,这一代的完成度已经很高:NVIDIA 用"8 节点 A100 两阶段训练 + 约 1 万小时真实对话与 8.26 万小时 FastMSS 模拟混音"炼出一个 100M 参数的流式 8 人分离模型,配合流式 ASR 与本地 LLM,会议转写三件套第一次具备了"全本地、可商用(OpenMDW 1.1)、低至 0.32 秒流式"的完整形态。语音数据不出设备这一条,在隐私合规日益收紧的当下本身就是生产力——而下一轮竞争,大概率会在中文评测基准的补齐与"混搭引擎无缝对齐"这类工程细节上展开。
【免费下载链接】Nemotron-3-Diarization项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Diarization
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考