
NeMo 说话人分离实战端到端与级联管线的 Checkpoint 加载、训练与推理【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech本文基于 NeMo本仓库docs/source/asr/speaker_diarization/results.rst文档展开系统讲解说话人分离Speaker Diarization中两类系统的 checkpoint 加载方式端到端 Sortformer 分离器的离线/流式训练与带后处理的推理命令以及级联Cascaded分离管线中 VAD 模型与说话人嵌入模型的本地/预训练加载方法。读完后你可以直接复制文档中的训练与推理命令运行模型并结合仓库中的配置文件与源码理解每个参数的实际作用包括后处理参数调优、流式推理参数覆盖与 DER 评估流程。一、Checkpoint 加载的两种方式文档开篇指出NeMo 中加载预训练 checkpoint 主要有两种方式与 ASR checkpoints 文档中介绍的方式一致。对说话人分离而言diarizer 会直接加载配置文件config file中传入的 checkpoint即通过 Hydra 配置项指定模型路径脚本在运行时自动完成加载。这两条主线下仓库给出了如下具体路径端到端分离器model_path指向.nemo/.ckpt文件或 HuggingFace 模型名级联管线分别通过diarizer.vad.model_path与diarizer.speaker_embeddings.model_path两个配置项传入 VAD 模型和说话人嵌入模型。从源码结构看端到端推理脚本 e2e_diarize_speech.py 在main()中按扩展名分派加载逻辑.ckpt走SortformerEncLabelModel.load_from_checkpoint(..., strictFalse).nemo走SortformerEncLabelModel.restore_from(...)其余后缀会直接抛出ValueError。二、端到端 Sortformer 分离器训练2.1 离线OfflineSortformer 训练命令文档给出的训练命令如下使用sortformer_diarizer_hybrid_loss_4spk-v1.yaml配置# Feed the config for Sortformer diarizer model training python ${NEMO_ROOT}/examples/speaker_tasks/diarization/neural_diarizer/sortformer_diar_train.py --config-path../conf/neural_diarizer \ --config-namesortformer_diarizer_hybrid_loss_4spk-v1.yaml \ trainer.devices1 \ model.train_ds.manifest_filepathtrain_manifest_path \ model.validation_ds.manifest_filepathdev_manifest_path \ exp_manager.namesample_train \ exp_manager.exp_dir./sortformer_diar_train对应入口脚本为 sortformer_diar_train.py配置文件为 sortformer_diarizer_hybrid_loss_4spk-v1.yaml。训练 manifest 每行的示例格式配置头注释中给出为{audio_filepath: /path/to/audio01.wav, offset: 390.83, duration: 90.00, text: -, num_speakers: 2, rttm_filepath: /path/to/audio01.rttm}2.2 训练配置关键参数详解从 sortformer_diarizer_hybrid_loss_4spk-v1.yaml 源码可以确认以下核心参数及其含义参数默认值说明model.max_num_of_spks4模型支持的最大说话人数当前固定为 4model.pil_weight/model.ats_weight0.5 / 0.5Permutation Invariant LossPIL与 Arrival Time SortATS损失的权重二者混合即配置名中的 hybrid_lossmodel.ats_tolerance0到达时间排序的容忍帧数并列说话人按预测重叠度匹配model.high_resolutionfalse为 true 时在前处理帧步长通常 10 ms上学习预测train_ds.session_len_sec90训练会话最长时长秒配合min_duration: 10、max_duration: 90与分桶num_buckets: 10bucket_duration_bins为 10~90train_ds.soft_label_thres0.5目标值二值化阈值越高模型预测说话人活动越保守model.encoder18 层 ConformerEncoderNESTFast-Conformer编码器d_model: 512subsampling_factor: 8self_attention_model: rel_posmodel.transformer_encoder18 层 TransformerEncoderhidden_size: 192inner_size: 768num_attention_heads: 8model.preprocessorAudioToMelSpectrogramPreprocessor80 维 melwindow_size: 0.025window_stride: 0.01normalize: per_featuremodel.lossBCELoss二元交叉熵reduction: meanmodel.optim/schedAdamWbetas [0.9, 0.98]weight_decay 1e-3/ InverseSquareRootAnnealinglr: 0.0001warmup_steps: 2500exp_manager.checkpoint_callback_paramsmonitorval_f1_accmaxsave_top_k: 9按验证 F1 保留最优 checkpoint可以推断pil_weight与ats_weight的 0.5/0.5 配比正是混合损失的体现PIL 提供排列不变性监督ATS 损失则按各说话人语音片段的到达时间顺序建模从而缓解分离任务中的排列问题。2.3 流式StreamingSortformer 训练命令# Feed the config for Sortformer diarizer model training python ${NEMO_ROOT}/examples/speaker_tasks/diarization/neural_diarizer/sortformer_diar_train.py --config-path../conf/neural_diarizer \ --config-namestreaming_sortformer_diarizer_4spk-v2.yaml \ trainer.devices1 \ model.streaming_modeTrue \ model.train_ds.manifest_filepathtrain_manifest_path \ model.validation_ds.manifest_filepathdev_manifest_path \ exp_manager.namesample_train \ exp_manager.exp_dir./sortformer_diar_train对应配置 streaming_sortformer_diarizer_4spk-v2.yaml仓库中另提供专用入口 streaming_sortformer_diar_train.py。与离线配置相比流式配置有以下关键差异均取自该 YAML 源码model.streaming_mode: Truebatch_size: 4离线为 8预处理器改为128 维 mel且normalize: NANEST 编码器17 层离线为 18 层/80 维sortformer_modules下新增一组流式参数例如chunk_len: 188每个流式块处理的帧数、spkcache_len: 188说话人缓存总帧长、spkcache_update_period: 188、fifo_len: 00 表示禁用 FIFO、chunk_left_context: 1、chunk_right_context: 1、pred_score_threshold: 0.25、causal_attn_rate: 0.5/causal_attn_rc: 7训练时按比例使用受限右上下文的自注意力学习率调度warmup_steps降为 500离线为 2500并额外定义了test_dsseq_eval_mode: True。三、端到端分离推理与后处理3.1 离线 Sortformer 推理命令# Config for post-processing PP_YAML1${NEMO_ROOT}/examples/speaker_tasks/diarization/conf/post_processing/sortformer_diar_4spk-v1_dihard3-dev.yaml PP_YAML2${NEMO_ROOT}/examples/speaker_tasks/diarization/conf/post_processing/sortformer_diar_4spk-v1_callhome-part1.yaml python ${NEMO_ROOT}/examples/speaker_tasks/diarization/neural_diarizer/e2e_diarize_speech.py \ batch_size1 \ model_path/path/to/diar_sortformer_4spk-v1.nemo \ postprocessing_yaml${PP_YAML2} \ dataset_manifest/path/to/diarization_manifest.json3.2 后处理参数文件的含义后处理Post-processing用于把模型输出的逐帧 sigmoid 概率转换为时间戳分段。以 sortformer_diar_4spk-v1_callhome-part1.yaml 为例该文件头注释说明参数方案借鉴了 Medennikov 等人的 Target-Speaker VAD 后处理流程并针对 CallHomeNIST SRE 2000 part1数据集用 Optuna 优化得到trial 24682最优目标值约 0.1026。六个参数含义如下参数该文件取值作用onset0.53判定语音片段开始的起始阈值offset0.49判定语音片段结束的偏移阈值pad_onset0.23在每个语音片段起点前扩展的时长pad_offset0.01在每个语音片段终点后扩展的时长min_duration_on0.42时长小于该值的语音片段被删除min_duration_off0.34时长小于该值的静音被删除即合并相邻片段流式模型对应的 diar_streaming_sortformer_4spk-v2_callhome-part1.yaml 取值为onset: 0.641, offset: 0.561, pad_onset: 0.229, pad_offset: 0.079, min_duration_on: 0.511, min_duration_off: 0.296。从源码看这些参数由 e2e_diarize_speech.py 通过load_postprocessing_from_yaml解析为PostProcessingParams再传给convert_pred_mat_to_segments生成分段若设置launch_pp_optimTrue脚本还会调用optuna_suggest_params对六个参数在固定搜索区间内做自动调优如onset ∈ [0.4, 0.8]、offset ∈ [0.4, 0.9]、min_duration_on/off ∈ [0.0, 0.75]步长 0.01以 DER 最小化为优化目标。3.3 推理脚本的关键配置项e2e_diarize_speech.py使用hydra_runner(config_nameDiarizationConfig, ...)组织参数DiarizationConfig数据类中与本文命令直接相关、以及进阶可调的默认值包括model_path.nemo或.ckpt路径必填dataset_manifestJSON manifest 路径必填评估 DER 时须含rttm_filepathbatch_size默认 1脚本注释明确建议batch_size1 以获得最长推理窗口和最高精度bypass_postprocessing默认 True默认只做二值化、跳过后处理要复现模型卡 DER 分数需传入postprocessing_yamlno_derFalse、collar0.25、ignore_overlapFalse默认执行 DER 评估out_preds_tensors/overwrite_preds_tensors启用预测张量缓存二次运行时可直接加载已算好的预测矩阵无需重跑前向precision默认 bf16、cuda负数表示纯 CPU 推理、compile_encoder对前端编码器与 Transformer 编码器做torch.compile流式专用参数async_streaming、async_pad_to_max、async_desync_updates、chunk_len脚本默认 6、chunk_right_context默认 7、fifo_len默认 188、spkcache_update_period默认 144、spkcache_lenNone 表示沿用模型值。脚本在diar_model.streaming_mode为真时会把这些覆盖写入sortformer_modules并调用_check_streaming_parameters()校验。评估链路为convert_pred_mat_to_segments概率矩阵 → 假设/参考/Uem 分段可同时写 RTTM 到out_rttm_dir→score_labels计算 DER支持 collar 与是否忽略重叠。3.4 流式 Sortformer 推理命令# Config for post-processing STREAM_PP_YAML1${NEMO_ROOT}/examples/speaker_tasks/diarization/conf/post_processing/diar_streaming_sortformer_4spk-v2_dihard3-dev.yaml STREAM_PP_YAML2${NEMO_ROOT}/examples/speaker_tasks/diarization/conf/post_processing/diar_streaming_sortformer_4spk-v2_callhome-part1.yaml python ${NEMO_ROOT}/examples/speaker_tasks/diarization/neural_diarizer/e2e_diarize_speech.py \ batch_size1 \ model_path/path/to/diar_streaming_sortformer_4spk-v2.nemo \ postprocessing_yaml${STREAM_PP_YAML2} \ dataset_manifest/path/to/diarization_manifest.json流式模型通过 AOSCArrival-Order Speaker Cache机制在不同 chunk 间保持说话人一致性chunk_len、fifo_len、chunk_right_context、spkcache_update_period等参数共同决定推理延迟与精度之间的取舍这些参数既可在推理时通过命令行覆盖如chunk_len340 fifo_len40 chunk_right_context40 spkcache_update_period300也可在 Python 中直接修改diar_model.sortformer_modules的同名属性见 examples/speaker_tasks/diarization/README.md 中的示例代码。四、HuggingFace 预训练 Checkpoint文档给出的通用加载方式为pip install -U huggingface_hub[cli] huggingface-cli login随后按模型名加载模型名即下表 Model Name 列# 加载离线 Sortformer 分离器 from nemo.collections.asr.models import SortformerEncLabelModel diar_model SortformerEncLabelModel.from_pretrained(nvidia/diar_sortformer_4spk-v1)# 加载流式 Sortformer 分离器 from nemo.collections.asr.models import SortformerEncLabelModel diar_model SortformerEncLabelModel.from_pretrained(nvidia/diar_streaming_sortformer_4spk-v2)文档内嵌的端到端分离模型清单来源于 e2e_diar_models.csvModel NameModel Base Classdiar_sortformer_4spk-v1SortformerEncLabelModeldiar_streaming_sortformer_4spk-v2SortformerEncLabelModeldiar_streaming_sortformer_4spk-v2.1SortformerEncLabelModel结合 examples/speaker_tasks/diarization/README.md 的补充说明diar_sortformer_4spk-v1为离线模型18 层 NEST 编码器 L-size 18 层 Transformer 编码器hidden size 192支持最多 4 个说话人diar_streaming_sortformer_4spk-v2为流式版本采用 AOSC 实现跨 chunk 的一致说话人跟踪延迟可配置从超低 0.32s 到 30.4sdiar_streaming_sortformer_4spk-v2.1在会议语音场景上做了增强训练。README 同时给出了各模型在不同数据集与延迟设置下的 DER 对比表可作为选型参考。五、级联Cascaded说话人分离管线的模型级联管线由 VAD、分段、说话人嵌入提取、聚类与目标说话人 VAD 等阶段串联而成见文首示意图下半部分。文档将其 checkpoint 的获取分为本地加载与预训练名两种。5.1 加载本地 Checkpoint加载 VAD 模型本地.nemo或预训练 VAD 模型名pretrained_vad_model/path/to/vad_multilingual_marblenet.nemo ... # pass with hydra config config.diarizer.vad.model_pathpretrained_vad_model加载说话人嵌入模型pretrained_speaker_model/path/to/titanet-l.nemo ... # pass with hydra config config.diarizer.speaker_embeddings.model_pathpretrained_speaker_model文档还说明NeMo 会自动把训练中的模型以.nemo格式保存 checkpoint也可随时手动调用model.save_to(checkpoint_path.nemo)保存。5.2 NGC 预训练 CheckpointASR collection 中包含在多种数据集上训练、面向多种任务的模型 checkpoint可通过 NGC 的 NeMo Automatic Speech Recognition collection 获取NGC 上的 model card 提供各 checkpoint 的详细信息。按模型名下表 Model Name 列直接传入配置pretrained_vad_modelvad_multilingual_marblenet pretrained_speaker_modeltitanet_large ... config.diarizer.vad.model_pathpretrained_vad_model config.diarizer.speaker_embeddings.model_pathpretrained_speaker_model文档内嵌的级联管线模型清单来源于 diarization_results.csvModel NameModel Base Classvad_multilingual_marblenetEncDecClassificationModelvad_marblenetEncDecClassificationModelvad_telephony_marblenetEncDecClassificationModeltitanet_largeEncDecSpeakerLabelModelecapa_tdnnEncDecSpeakerLabelModel5.3 级联管线推理与评估文档给出的运行入口为python NeMo_root/examples/speaker_tasks/diarization/offline_diarization.py并建议参考 NeMo 的说话人分离推理教程仓库中对应的教程 notebook 位于tutorials/speaker_tasks/目录如 End_to_End_Diarization_Inference.ipynb。音频与可选的 label 文件准备方式参见该文档系列的 Datasets 章节docs/source/asr/speaker_diarization/datasets.rst。在仓库中级联分离的实际推理入口为 clustering_diarizer/offline_diar_infer.py 与带 ASR 的 offline_diar_with_asr_infer.pyexamples/speaker_tasks/diarization/README.md 给出了完整的参数说明例如python clustering_diarizer/offline_diar_infer.py \ diarizer.manifest_filepathpath to manifest file \ diarizer.out_dirdemo_output \ diarizer.speaker_embeddings.parameters.save_embeddingsFalse \ diarizer.vad.model_pathpretrained model name or path to .nemo \ diarizer.speaker_embeddings.model_pathpretrained speaker embedding model name or path to .nemomanifest 中必填字段为audio_filepath、offset、duration、label: infer与text可选rttm_filepath、uem_filepath、num_speakers有 oracle VAD 与 GT RTTM 时传diarizer.oracle_vadTrueVAD 模型支持vad_multilingual_marblenet、vad_marblenet、vad_telephony_marblenet可传模型名自动从 NGC 下载或本地.nemo全路径说话人嵌入模型支持titanet_large、ecapa_tdnn、speakerverification_speakernet多尺度分离通过parameters.window_length_in_sec/parameters.shift_length_in_sec/parameters.multiscale_weights配置多尺度时各列表按从最长到基尺度最短降序排列且multiscale_weights必须提供如[1.5,1.0,0.5]/[0.75,0.5,0.25]/[0.33,0.33,0.33]域配置文件位于 conf/inference 目录包含diar_infer_general.yaml、diar_infer_meeting.yaml、diar_infer_telephonic.yamlREADME 中的 DER 结果即基于对应域配置测得。六、小结与延伸阅读本文档results.rst确立的 checkpoint 工作流可以归纳为端到端路线训练用sortformer_diar_train.pyconf/neural_diarizer/*.yaml离线/流式两套推理用neural_diarizer/e2e_diarize_speech.pyconf/post_processing/*.yaml模型可通过 HuggingFace 名nvidia/diar_sortformer_4spk-v1等一键from_pretrained获取级联路线在 Hydra 配置中分别设置diarizer.vad.model_path与diarizer.speaker_embeddings.model_path支持本地.nemo路径或 NGC 预训练模型名如vad_multilingual_marblenet、titanet_large推理入口在clustering_diarizer/目录。进一步阅读建议训练/推理的更多参数与 DER 数据见 examples/speaker_tasks/diarization/README.md说话人分离的完整文档系列位于docs/source/asr/speaker_diarization/含intro.rst、models.rst、configs.rst、datasets.rst端到端分离模型实现见nemo/collections/asr/modules/sortformer_modules.py与nemo/collections/asr/models中的SortformerEncLabelModel。【免费下载链接】SpeechA scalable generative AI framework built for researchers and developers working on Large Language Models, Multimodal, and Speech AI (Automatic Speech Recognition and Text-to-Speech)项目地址: https://gitcode.com/GitHub_Trending/nem/Speech创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考