news 2026/9/14 5:45:44

NeMo Speech 自监督学习集合 API 指南:SSL 模型类与 Mixin 深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NeMo Speech 自监督学习集合 API 指南:SSL 模型类与 Mixin 深度解析

NeMo Speech 自监督学习集合 API 指南:SSL 模型类与 Mixin 深度解析

【免费下载链接】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

本指南围绕 docs/source/asr/ssl/api.rst 展开,系统讲解 NeMo Speech 仓库中自监督学习(SSL)集合的核心 API:两个模型类SpeechEncDecSelfSupervisedModelEncDecDenoiseMaskedTokenPredModel,以及两个通用 MixinASRModuleMixinAccessMixin。阅读完本文,你将理解 SSL 预训练模型的构造流程、loss_list多损失机制、掩码 token 预测(NEST)的数据流,并掌握如何基于这些 API 训练、加载与迁移自监督预训练权重。

SSL 集合 API 文档的定位

在 NeMo 的 SSL 文档树中,api.rst 是面向开发者的"类库索引页",它以 Sphinxautoclass指令把 SSL 集合对外暴露的关键符号自动渲染成带完整 docstring、签名与继承关系的 API 参考。它与 intro.rst(原理介绍)、models.rst(模型设计思路)、configs.rst(配置指南)、results.rst(检查点与微调)共同构成完整的 SSL 文档体系。

api.rst 共收录四个符号,按功能可分为两组:

类别符号所在源码文件
模型类nemo.collections.asr.models.EncDecDenoiseMaskedTokenPredModelnemo/collections/asr/models/ssl_models.py
模型类nemo.collections.asr.models.SpeechEncDecSelfSupervisedModelnemo/collections/asr/models/ssl_models.py
Mixinnemo.collections.asr.parts.mixins.mixins.ASRModuleMixinnemo/collections/asr/parts/mixins/mixins.py
Mixinnemo.core.classes.mixins.access_mixins.AccessMixinnemo/core/classes/mixins/access_mixins.py

下文依次深入这些类的实现细节,并结合仓库中的示例脚本与 YAML 配置给出可落地的用法。

SpeechEncDecSelfSupervisedModel:自监督预训练基类

SpeechEncDecSelfSupervisedModel是 SSL 集合中最基础的模型类,定义于 ssl_models.py,其 docstring 明确了定位:"用于自监督编码器预训练的编码器-解码器模型基类"。它同时继承了三个父类:

  • ModelPT:NeMo 模型基类,提供from_config_dictfrom_pretrainedrestore_fromsave_tomaybe_init_from_pretrained_checkpoint等能力;
  • ASRModuleMixin:提供面向 ASR 模块的运行时调整方法(详见后文);
  • AccessMixin:提供中间层张量访问与注册机制(详见后文)。

构造流程:从配置到模块

构造方法(__init__)按以下顺序构建模型组件(ssl_models.py):

  1. preprocessor:从cfg.preprocessor实例化特征提取器(MFCC / Mel 频谱),把原始波形转为模型输入特征;
  2. encoder:从cfg.encoder实例化编码器,这是 SSL 训练后要保留下来的核心部分(后续微调直接复用);
  3. decoder + loss 或 loss_list:若配置中存在loss_list键,则构建多个 decoder-loss 对组成的nn.ModuleDict;否则按单decoder+ 单loss构建。SSL 阶段使用的 decoder 与损失在下游微调时会被丢弃;
  4. spec_augmentation:从cfg.spec_augment实例化频谱增强模块(SSL 中通常使用掩码类增强);
  5. dropout_features / dropout_features_q:可选的特征级 Dropout,分别作用于"送入编码器的特征"和"送入量化器的目标特征"(Wav2Vec 风格训练常用);
  6. feature_penalty:可选的预处理器输出特征惩罚项(Wav2Vec 训练的feat_pen机制),其值为processed_signal.float().pow(2).mean() * pen_factor
  7. access 配置:若cfg中存在access键,则通过set_access_cfg写入全局访问配置,供AccessMixin使用。

从源码结构可以推断,apply_masking标志控制训练时是否对频谱施加掩码增强,forward中会根据该标志决定是否调用self.spec_augmentation(ssl_models.py)。

前向传播:四元组输出

forward方法(ssl_models.py)接受两种互斥的输入组合:

  • 原始波形:input_signal(形状[B, T])+input_signal_length
  • 已处理特征:processed_signal(形状[B, D, T])+processed_signal_length(例如来自 DALI 预处理器)。

它返回一个四元组:

  1. spectrograms:形状[B, D, T],送入量化器/目标构造用的频谱(在 dropout_features_q 之后);
  2. spec_masks:形状[B, D, T],实际施加到频谱上的掩码(由增强模块产生,超出有效长度的位置被强制清零);
  3. encoded:编码器输出特征,形状[B, D, T]
  4. encoded_len:编码器下采样后的序列长度向量[B]

前向过程中还包含一个关键细节:若loss_list中任一子损失的output_from_layer非空,模型会通过AccessMixin注册机制在训练/验证时保存指定中间层的编码器输出,供后续损失使用(ssl_models.py)。

多损失机制:loss_list深度解读

SSL 集合最大的灵活性在于支持同时使用多个 decoder-loss 对(ssl_models.py)。loss_listDictConfig字典,每个键代表一个命名子损失,其配置字段如下(源自 configs.rst 与源码实现):

字段默认值含义
decoder必填解码器配置,指定_target_类与参数
loss必填对应损失配置
loss_alpha1.0该损失的加权系数
targets_from_lossNone从哪个对比损失中提取标签(当损失需要标签而 manifest 中没有时必填)
transpose_encodedFalse送入该损失前是否转置编码特征
start_step0该 decoder+loss 从第几步开始生效
output_from_layerNone提取编码特征的中间层名;为null时使用编码器最后一层
is_activeTrue是否启用该子损失(源码在构造时跳过非活跃项)

decoder_loss_step中(ssl_models.py),模型遍历decoder_losses

  • output_from_layerAccessMixin注册表中取指定中间层输出(registry[name]['encoder'][-1]);
  • transpose_encoded决定是否转置;
  • targets_from_loss指定了某个对比损失,则从该损失中取出量化目标target_idstarget_lengths作为其他损失的标签;
  • 每个损失根据自身needs_labels属性决定是否传入 targets;
  • 最终总损失为各损失按loss_alpha加权求和,同时返回未加权损失字典用于日志记录。

training_step中还有一个细节:每个子损失按trainer.global_step >= start_step动态激活(ssl_models.py),这允许训练初期只跑对比损失、后期再加入 MLM/CTC/RNNT 等需要标签的损失,以提升早期训练稳定性。

数据集加载:多后端支持

_setup_dataloader_from_config(ssl_models.py)展示了 SSL 数据管线的兼容性:

  • Lhotseuse_lhotse: true时走 Lhotse 数据加载;
  • DALIuse_dali: true时使用 GPU 数据管线;
  • tarred 数据集is_tarred: true时使用TarredAudioToCharDataset(配合shuffle_n做内存打乱);
  • 普通数据集:默认走get_char_dataset

此外还支持在数据集配置中注入augmentor(如random_segment扰动)。setup_training_data/setup_validation_data会默认填充shuffle(训练 True、验证 False)并对 IterableDataset 修正limit_train_batches步数。

官方预训练权重列表

list_available_models()(ssl_models.py)暴露了该基类可直接加载的 NGC 预训练模型:

  • ssl_en_conformer_large
  • ssl_en_conformer_xlarge

这两个模型可通过from_pretrained(model_name="ssl_en_conformer_large")直接实例化(详见后文"检查点加载"小节)。

EncDecMaskedTokenPredModelEncDecDenoiseMaskedTokenPredModel:掩码 token 预测家族

api.rst 直接收录的是EncDecDenoiseMaskedTokenPredModel,它继承自EncDecMaskedTokenPredModel(ssl_models.py),后者又继承自SpeechEncDecSelfSupervisedModel,三者构成掩码 token 预测(Masked Token Prediction)的自监督模型家族。

EncDecMaskedTokenPredModel:掩码预测基类

其 docstring 定位为"在编码器输出上执行掩码 token 预测的语音自监督模型"。构造时(ssl_models.py)构建五个组件:

  • quantizer:向量量化器,把频谱特征离散化为 token(伪标签来源);
  • mask_processor:掩码处理器;
  • encoder/decoder/loss

构造逻辑里有一个值得注意的参数mask_position(可选pre_conv/post_conv):

  • pre_conv(默认):在卷积下采样之前对原始频谱特征掩码;
  • post_conv:在卷积下采样之后掩码,此时源码会自动修正quantizer.feat_inmasking.feat_in(改为encoder.d_model)、masking.block_size(除以encoder.subsampling_factor)以及loss.combine_time_steps(置为 1),并通过ConvFeatureMaksingWrapper包装encoder.pre_encode实现后卷积掩码。

input_types/output_types声明了神经类型契约:输入为AudioSignal(或已处理SpectrogramType),输出为logprobsencoded_lenmaskstokens(当num_books == 1squeeze_single时 logprobs 为('B','T','C'),否则为('B','T','C','H'))。该类还定义了oomptimizer_schema,用于 OOMptimizer 对不同序列长度做最优 batch size 标定。

EncDecDenoiseMaskedTokenPredModel:NEST(去噪 + 掩码预测)

该类是NEST(Neural End-to-End Speech Transformer 类模型)在 NeMo 中的实现,docstring 明确指出其"执行去噪与掩码 token 预测",对应 NEST 论文(见 examples/asr/speech_pretraining/README.md)。其关键特性:

数据流:与普通 ASR 数据集不同,它使用ssl_dataset.AudioNoiseBatch,每个 batch 同时包含三路信号(ssl_models.py):

  • audio+audio_len:干净语音;
  • noise+noise_len:噪声信号;
  • noisy_audio+noisy_audio_len:加噪后的混合语音。

前向流程(ssl_models.py):

  1. 对干净语音processed_signal做量化,得到tokens作为预测目标;
  2. 对加噪语音processed_noisy_input_signal施加掩码(apply_mask控制是否掩码,掩码时用mask_processor或包装后的pre_encoder);
  3. 编码器接收掩码后的加噪特征,输出encoded
  4. decoderMultiSoftmaxDecoder)将编码输出映射为 logits,与量化 token 一起送入MultiMLMLossmask_threshold: 0.8控制掩码损失的阈值);
  5. 返回(log_probs, encoded_len, masks, tokens)

input_types完整声明了noise_signalnoisy_input_signal及其长度向量(ssl_models.py),output_types则根据num_books/squeeze_single动态决定 logprobs 维度(ssl_models.py)。

数据加载_setup_dataloader_from_config使用ssl_dataset.get_audio_noise_dataset_from_config(Lhotse 模式下用LhotseAudioNoiseDataset),数据集配置需要同时指定manifest_filepathnoise_manifest,并可配置batch_augmentor(如MultiSpeakerNoiseAugmentation)在 batch 级实时混噪。

ASRModuleMixin:ASR 模块运行时调整

ASRModuleMixin(mixins.py)是所有 ASR 模型(包括 SSL 模型)共享的模块级能力扩展,继承自ASRAdapterModelMixin。其设计原则是:每个方法先检查子类中是否存在对应模块,存在才提供附加功能。SSL 预训练阶段关注的核心方法包括:

change_attention_model(mixins.py):在训练/推理前修改编码器的注意力类型,支持:

  • rel_pos:相对位置编码 + Transformer-XL;
  • rel_pos_local_attn:相对位置编码 + 基于att_context_size重叠窗口的局部注意力;
  • abs_pos:绝对位置编码 + 标准 Transformer;
  • rope:旋转位置编码(此时可额外指定rope_baserotary_fraction)。

att_context_size[left, right]列表,控制每个 step 可见的左右上下文步数。update_configTrue时会同步回写self.cfg(包括rope_base/rotary_fraction),保证配置与模型状态一致。

change_conv_asr_se_context_window(mixins.py):当模型含ConvASREncoder时,更新其中 SqueezeExcitation 模块的 context window(以 STFT 帧为单位)。

change_subsampling_conv_chunking_factor:调整卷积下采样的 chunking 因子(流式/低延迟场景)。

此外,该类还承载了流式推理相关方法(conformer_stream_steptranscribe_simulate_cache_aware_streaming)与推理工具方法(path2audio_files_to_manifestdiarize等),可见它把"模块切换 + 推理辅助"两类能力统一在了同一 Mixin 中。

AccessMixin:中间层输出访问机制

AccessMixin(access_mixins.py)为模型提供"访问中间层输出"的能力,是 SSL 多损失机制(尤其是output_from_layer)与多层级特征提取的底层支撑。核心机制如下:

  • register_accessible_tensor(name, tensor):将张量注册到模块内部_registry字典(列表结构,可累积多次前向的结果)。受全局access_cfg控制,可配置convert_to_cpu(拷回 CPU)与detach(分离计算图);
  • get_module_registry(module):递归收集所有命名子模块的注册表,返回{模块名: registry}字典——SSL 的decoder_loss_step正是用它在编码器上取出layers.5layers.11等指定层的输出;
  • reset_registry():清空本模块及所有子模块的注册表,并在结束后调用set_access_enabled(False)显式关闭缓存;
  • access_cfg属性:读取全局共享的访问配置(按model_guid隔离,默认使用全局 GUID);
  • 类方法update_access_cfg/is_access_enabled/set_access_enabled:全局配置的读写与启用开关。

从源码结构看,AccessMixin采用"全局配置 + 按需注册"的设计:只有is_access_enabled为真且训练/验证状态成立时,forward才开启张量注册(ssl_models.py),避免推理或无关阶段产生额外内存开销。这一机制也让 scripts/ssl/extract_features.py 之类的工具能够从 NEST 中提取多层级特征用于下游分类任务(见 examples/asr/speech_pretraining/README.md)。

实战:基于 API 训练、加载与迁移 SSL 模型

数据格式

SSL 预训练沿用 ASR 数据集格式,但不需要真实转写文本。manifest(jsonl)示例如下(源自 examples/asr/speech_pretraining/README.md):

{"audio_filepath": "path/to/audio1.wav", "duration": 10.0, "text": ""} {"audio_filepath": "path/to/audio2.wav", "duration": 5.0, "text": ""}

NEST(去噪)训练还需要一个noise_manifest提供噪声数据,配合配置中的batch_augmentorMultiSpeakerNoiseAugmentation)在运行时按概率混合语音与噪声。

训练入口

仓库提供两个训练脚本,分别对应两类模型 API:

Wav2Vec-BERT 风格(对比/重建预训练,使用SpeechEncDecSelfSupervisedModel):

python examples/asr/speech_pretraining/speech_pre_training.py \ model.train_ds.manifest_filepath=<path to train manifest> \ model.validation_ds.manifest_filepath=<path to val/test manifest> \ trainer.devices=-1 \ trainer.accelerator="gpu" \ strategy="ddp" \ trainer.max_epochs=100 \ model.optim.name="adamw" \ model.optim.lr=0.001 \ model.optim.betas=[0.9,0.999] \ model.optim.weight_decay=0.0001 \ model.optim.sched.warmup_steps=2000

该脚本的默认配置为examples/asr/conf/ssl/fastconformer/fast-conformer.yaml(speech_pre_training.py)。

NEST 风格(去噪掩码 token 预测,使用EncDecDenoiseMaskedTokenPredModel):

python examples/asr/speech_pretraining/masked_token_pred_pretrain.py \ model.train_ds.manifest_filepath=<path to train manifest> \ model.train_ds.noise_manifest=<path to noise manifest> \ model.validation_ds.manifest_filepath=<path to val/test manifest> \ model.validation_ds.noise_manifest=<path to noise manifest> \ trainer.devices=-1 \ trainer.accelerator="gpu" \ strategy="ddp" \ trainer.max_epochs=100 \ model.optim.name="adamw" \ model.optim.lr=0.001 \ model.optim.betas=[0.9,0.999] \ model.optim.weight_decay=0.0001 \ model.optim.sched.warmup_steps=2000

默认配置为examples/asr/conf/ssl/nest/nest_fast-conformer.yaml(masked_token_pred_pretrain.py)。脚本主体逻辑是EncDecDenoiseMaskedTokenPredModel(cfg=cfg.model, trainer=trainer)+ 可选maybe_init_from_pretrained_checkpoint(cfg)+trainer.fit()

NEST 配置核心参数

examples/asr/conf/ssl/nest/nest_fast-conformer.yaml 是理解EncDecDenoiseMaskedTokenPredModel配置的完整样例,关键段落如下:

model: sample_rate: 16000 num_classes: 8192 # 量化码本大小 num_books: 1 # 码本数量 code_dim: 16 # 码字维度 squeeze_single: false mask_position: pre_conv # 掩码位置:pre_conv / post_conv train_ds: manifest_filepath: ??? # 训练 manifest(可字符串或列表) noise_manifest: null # 噪声 manifest sample_rate: ${model.sample_rate} batch_size: 8 shuffle: true num_workers: 8 max_duration: 60.0 min_duration: 1.0 is_tarred: false bucketing_strategy: "synced_randomized" batch_augmentor: _target_: nemo.collections.asr.modules.ssl_modules.MultiSpeakerNoiseAugmentation prob: 0.5 noise_ratio: 0.5 min_r_speech: -5.0 max_r_speech: 5.0 min_r_noise: -5.0 max_r_noise: 20.0 min_mix_rate: 0.5 max_mix_rate: 0.5 min_num_segments: 1 max_num_segments: 1 min_num_speakers: 1 max_num_speakers: 1 preprocessor: _target_: nemo.collections.asr.modules.AudioToMelSpectrogramPreprocessor sample_rate: ${model.sample_rate} window_size: 0.025 window_stride: 0.01 features: 80 n_fft: 512 log: true dither: 0.00001 pad_to: 16 masking: _target_: nemo.collections.asr.modules.RandomBlockMasking block_size: 40 # pre_conv 时每帧 10ms,40 帧即 400ms 一个块 mask_prob: 0.01 # allow_overlap=true 时表示每帧掩码概率 feat_in: ${model.preprocessor.features} freeze: true allow_overlap: true quantizer: _target_: nemo.collections.asr.modules.RandomProjectionVectorQuantizer feat_in: ${model.preprocessor.features} code_dim: ${model.code_dim} num_books: ${model.num_books} num_classes: ${model.num_classes} dist_fn: "l2" # 可选 ["l2", "cosine"] freeze: true squeeze_single: ${model.squeeze_single} combine_time_steps: ${model.encoder.subsampling_factor} encoder: _target_: nemo.collections.asr.modules.ConformerEncoder feat_in: ${model.preprocessor.features} n_layers: 17 d_model: 512 subsampling: dw_striding subsampling_factor: 8 self_attention_model: rel_pos n_heads: 8 att_context_size: [-1, -1] # -1 表示不限上下文 conv_kernel_size: 9 dropout: 0.1 decoder: _target_: nemo.collections.asr.modules.MultiSoftmaxDecoder feat_in: ${model.encoder.d_model} num_classes: ${model.num_classes} num_decoders: ${model.num_books} squeeze_single: ${model.squeeze_single} loss: _target_: nemo.collections.asr.losses.MultiMLMLoss combine_time_steps: ${model.encoder.subsampling_factor} mask_threshold: 0.8 num_decoders: ${model.num_books} squeeze_single: ${model.squeeze_single} optim: name: adamw lr: 5.0 betas: [0.9, 0.98] weight_decay: 1e-3 sched: name: NoamAnnealing d_model: ${model.encoder.d_model} warmup_steps: 25000 min_lr: 1e-6

配置注释中还给出了 FastConformer 各规模变体的推荐超参(d_model / n_heads / n_layers / conv_kernel_size / weight_decay 等),从 Small(14M)到 XXLarge(1.2B),供按资源选型。trainer段推荐precision: 32val_check_interval: 2500enable_checkpointing: False(检查点由 exp_manager 管理),exp_manager段支持always_save_nemo: True(直接保存.nemo格式)与resume_if_exists(断点续训)。

数据集配置的三个技巧

configs.rst 特别强调:做对比损失时,一个 batch 内各句需要掩码等量 patch,因此应控制 batch 内时长差异,三种推荐做法:

  1. min_duration:在数据集配置中直接丢弃过短样本(适合短样本占比不影响总时长的场景);
  2. random_segment扰动:对长音频在运行时随机采样固定长度片段(不足部分 padding):
augmentor: random_segment: prob: 1.0 duration_sec: 16 # 指定目标片段时长
  1. bucketing:按时长分桶保证 batch 内长度相近,参考仓库中bucketing_strategy: "synced_randomized"的用法。

对比损失还需保证掩码步数足够采样负例:例如 4x stride 下要采样 100 个负例,就需要超过 400 个掩码步;使用默认patch_size=48mask_patches至少设为 9。掩码增强推荐使用MaskedPatchAugmentation

spec_augment: _target_: nemo.collections.asr.modules.MaskedPatchAugmentation patch_size: 48 mask_patches: 0.5 # 掩码比例(也可设为固定整数数量) freq_masks: 3 # 切 3 个频率带 freq_width: 20 # 每个频率带最大宽度 20

多损失组合示例

基于loss_list,可以将对比损失与其他损失组合(完整示例见 configs.rst):

对比 + MLM(MLM 的标签来自对比损失的量化器,targets_from_loss: "contrastive"):

loss_list: contrastive: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderReconstruction feat_in: ${model.encoder.d_model} feat_hidden: 128 feat_out: ${model.decoder_out} stride_layers: 0 non_stride_layers: 0 loss: _target_: nemo.collections.asr.losses.ContrastiveLoss in_dim: ${model.preprocessor.features} proj_dim: ${model.decoder_out} combine_time_steps: 4 quantized_targets: true codebook_size: 300 num_groups: 2 sample_from_same_utterance_only: true sample_from_non_masked: false mlm: decoder: _target_: nemo.collections.asr.modules.ConvASRDecoder feat_in: ${model.encoder.d_model} num_classes: 90000 # 等于 codebook_size^groups loss: _target_: nemo.collections.asr.losses.MLMLoss combine_time_steps: 4 targets_from_loss: "contrastive" loss_alpha: 1000. transpose_encoded: false start_step: 0 output_from_layer: null

对比 + CTC / RNNT:CTC 与 RNNT 不要求标签与步数严格对齐,可将对比损失的reduce_ids设为true把连续相同 id 合并为单个(configs.rst 中contrastive+ctccontrastive+rnnt示例完整给出了ConvASRDecoder/CTCLossForSSLRNNTDecoderJointSSL/RNNTLossForSSL的配置)。

多中间层 MLM:利用output_from_layer+transpose_encoded,可以从编码器第 6、12 层及最后一层分别接入 MLM 损失,实现多层级监督(对应 configs.rst 中的mlmmlm_2layers.5)、mlm_3layers.11)示例),这正是AccessMixinloss_list协同工作的典型场景。

检查点加载与下游微调

results.rst 给出了完整的加载路径:

加载本地.nemo检查点

import nemo.collections.asr as nemo_asr ssl_model = nemo_asr.models.ASRModel.restore_from(restore_path="<path/to/checkpoint/file.nemo>")

从 NGC 下载预训练模型SpeechEncDecSelfSupervisedModel.list_available_models()列出的ssl_en_conformer_large/ssl_en_conformer_xlarge):

ssl_model = nemo_asr.models.ASRModel.from_pretrained(model_name="ssl_en_conformer_large")

也可从具体模型类调用from_pretrained(如SpeechEncDecSelfSupervisedModel)以访问特定模型功能;用list_available_models()可编程列出某基类下全部可用模型。

把 SSL 权重迁移到下游模型(微调的核心步骤):

# 定义下游模型(以 RNNT-BPE 为例) asr_model = nemo_asr.models.EncDecRNNTBPEModel(cfg=cfg.model, trainer=trainer) # 加载 SSL 检查点并复制 state_dict(strict=False 丢弃 SSL 专用 decoder/loss 权重) asr_model.load_state_dict(ssl_model.state_dict(), strict=False) del ssl_model

SSL 阶段使用的 decoder 与损失在下游微调时被替换为任务相关模块,只有 encoder 被保留——这正是 models.rst 强调的设计。训练脚本中的maybe_init_from_pretrained_checkpoint(cfg)也可以自动完成这一初始化。若将 NEST 作为多层级特征提取器用于下游分类,参考 downstream/speech_classification_mfa_train.py(配置examples/asr/conf/ssl/nest/multi_layer_feat/下的nest_ecapa_tdnn_small.yamlnest_titanet_small.yaml),或在 scripts/ssl/extract_features.py 中直接抽取多层级特征。

小结

NeMo SSL 集合的 API 设计体现了清晰的分层思想:

  • SpeechEncDecSelfSupervisedModel提供通用的"预处理器 + 编码器 + 多损失解码器"框架,loss_list使其能灵活组合对比、MLM、CTC、RNNT 等损失,适配 Wav2Vec-BERT 等对比/重建式预训练;
  • EncDecDenoiseMaskedTokenPredModel(含其父类EncDecMaskedTokenPredModel)实现 NEST 风格的"去噪 + 掩码 token 预测",通过AudioNoiseBatch同时建模干净语音、噪声与加噪语音;
  • ASRModuleMixin提供注意力切换、SE context window 调整等模块级能力;
  • AccessMixin提供中间层张量注册与访问,支撑多层级损失与特征提取。

理解这四个 API 符号,就抓住了 NeMo SSL 集合的骨架——无论你是要复现预训练、把 SSL encoder 迁移到 ASR/说话人任务,还是要基于 NEST 抽取多层级特征,都可以在 ssl_models.py、configs.rst 与 examples/asr/speech_pretraining 的配合下快速落地。

【免费下载链接】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),仅供参考

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

Agent跨会话记忆系统设计:从状态连续性到生产落地

1. 为什么“让 Agent 记住你”不是功能&#xff0c;而是系统级重构的起点“走进AI Agent第三篇&#xff1a;让 Agent 记住你”——这个标题乍看像一句温情提示&#xff0c;实则藏着当前Agent工程落地中最硬的一块骨头。我去年在给三家ToB企业做智能客服Agent升级时&#xff0c;…

作者头像 李华
网站建设 2026/9/14 5:44:05

51单片机波形发生器设计:2路输出、4种波形、调幅调频

简介&#xff1a;一套基于51单片机的波形发生器完整设计方案&#xff0c;面向电子类课程设计、毕业设计或嵌入式入门学习者。项目实现双通道信号输出&#xff0c;通过DAC0832完成数模转换&#xff0c;LCD1602实时显示&#xff0c;可产生正弦波、方波、三角波、锯齿波四种波形&a…

作者头像 李华
网站建设 2026/9/14 5:43:14

MySQL索引优化实战:从慢SQL到执行计划的调优全攻略

生产告警群在凌晨两点炸了。核心订单表的慢查询数从每分钟几十条跳到几千条&#xff0c;数据库 CPU 飙到 99%&#xff0c;后面排队的接口一个接一个超时。翻开慢日志&#xff0c;罪魁祸首是一条分页 SQL&#xff0c;而这 SQL 的查询条件其实对应着现成的索引。这大概是做 SQL 调…

作者头像 李华
网站建设 2026/9/14 5:42:41

化妆品商城推荐系统实战:从爬虫采集到可视化大屏的完整数据链路

很多人做商城类系统&#xff0c;习惯一上来就写 Spring Boot CRUD&#xff0c;把商品表、用户表、订单表建好&#xff0c;再套一个协同过滤算法&#xff0c;最后发现推荐接口返回的结果全是“猜你喜欢同款”&#xff0c;因为根本没什么候选商品。我做这套化妆品推荐商城时&…

作者头像 李华
网站建设 2026/9/14 5:42:34

Vue3+Leaflet实现地图考勤打卡:围栏绘制与定位判断实战

前阵子行政提了个需求&#xff1a;能不能在网页里做个考勤打卡&#xff0c;员工进园区后在地图上能看到公司范围&#xff0c;点一下按钮完成签到&#xff0c;别再让大伙儿装 App。我第一反应是这活儿 Vue3 Leaflet 地图库加 Leaflet Draw 插件就能干&#xff0c;而且能干净利落…

作者头像 李华