NeMo Speech Classification 配置文件详解:从 train_ds 到 ConvASRDecoderClassification 的完整配置实践
【免费下载链接】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 语音分类(Speech Classification)集合的配置文件编写展开,覆盖train_ds/validation_ds/test_ds数据集参数、MFCC/mel 预处理器、音频与谱图增强(augmentor与spec_augment)以及ConvASREncoder+ConvASRDecoderClassification的模型架构配置。读完后,你可以直接基于 marblenet_3x2x64.yaml 这类真实配置,为自己的语音分类或 VAD(Voice Activity Detection)任务写出可训练、可微调的完整 YAML。
配置文件总体结构
语音分类模型的配置文件中,model部分一般需要回答四个问题:用哪个数据集、用什么方式提取音频特征、做哪些数据增强、以及模型架构长什么样。对应地,配置文件分为以下几节:
| 配置节 | 作用 |
|---|---|
train_ds/validation_ds/test_ds | 训练、验证、测试数据集参数(manifest、采样率、标签、批大小等) |
preprocessor | 计算 MFCC 或 mel 谱特征的音频预处理模块 |
augmentor/spec_augment | 在线音频级增强与谱图级增强 |
encoder/decoder | 模型架构,通过_target_指定具体模块 |
文档明确指出:配置文件中数据集类接受的所有初始化参数都可以直接写进 YAML(参见 ASR API 中的 Datasets 列表);而通用的实验管理器(experiment manager)和 PyTorch Lightning trainer 参数属于所有 NeMo 模型共有的部分,不在本主题范围内重复展开。所有 NeMo ASR 脚本的示例配置文件位于 examples/asr/conf。
数据集配置(Dataset Configuration)
训练、验证、测试参数分别由train_ds、validation_ds和test_ds三个节指定。根据任务不同,你可能会配置音频文件的采样率、标签列表、是否 shuffle 数据集等参数。一个值得注意的灵活用法是:可以把manifest_filepath留空(写为???),在运行时通过命令行覆盖指定。官方文档给出的语音分类训练/验证配置示例如下:
model: sample_rate: 16000 repeat: 2 # number of convolutional sub-blocks within a block, R in <MODEL>_[BxRxC] dropout: 0.0 kernel_size_factor: 1.0 labels: ['bed', 'bird', 'cat', 'dog', 'down', 'eight', 'five', 'four', 'go', 'happy', 'house', 'left', 'marvin', 'nine', 'no', 'off', 'on', 'one', 'right', 'seven', 'sheila', 'six', 'stop', 'three', 'tree', 'two', 'up', 'wow', 'yes', 'zero'] train_ds: manifest_filepath: ??? sample_rate: ${model.sample_rate} labels: ${model.labels} # Uses the labels above batch_size: 128 shuffle: True validation_ds: manifest_filepath: ??? sample_rate: ${model.sample_rate} labels: ${model.labels} # Uses the labels above batch_size: 128 shuffle: False # No need to shuffle the validation data这段示例有几点值得注意:
manifest_filepath: ???表示该字段是“必填占位符”,必须在命令行或上层配置中给出,否则 Hydra 会报错。仓库中的真实配置(如 marblenet_3x2x64.yaml)正是采用???占位 + 命令行注入 manifest 的方式;sample_rate: ${model.sample_rate}使用 Hydra 插值引用顶层model下的采样率,保证数据集与预处理、模型三者采样率一致;labels: ${model.labels}同理复用顶层标签列表,避免多处维护同一份标签表;- 验证集
shuffle: False,因为验证数据无需打乱。
manifest 文件的字段要求
语音分类/VAD 任务的数据集类定义在 audio_to_label.py 中,从源码结构看,AudioToClassificationLabelDataset(分类标签)、AudioToSpeechLabelDataset(语音/非语音标签,即 Segment-VAD)以及对应的TarredAudio*流式变体都由同一个_AudioLabelDataset基类派生。以 examples/asr/speech_classification/README.md 中给出的 manifest 要求为准,每行是一个 JSON 字典,必需字段为audio_filepath、offset、duration、label:
{"audio_filepath": "/path/to/audio_file1", "offset": 0, "duration": 0.63, "label": "0"} {"audio_filepath": "/path/to/audio_file2", "offset": 0, "duration": 0.63, "label": "1"}Frame-VAD(帧级 VAD)的 manifest 则要求label为逐帧标签串。以 20ms 帧为例,1 秒音频对应 50 个帧标签(如"0 0 0 0 1 1 0 1 ... 0 1");文档同时说明也支持用 40ms 帧准备更短的标签串(为减小文件体积),模型会自动将其展开到每个 20ms 帧。
打包数据集(Tarred Dataset)
如果你希望使用 tarred 数据集(将音频与文本打包进.tar分片以提升大规模训练的 IO 效率),train_ds中还提供is_tarred、tarred_audio_filepaths、tarred_shard_strategy、shuffle_n、num_workers、pin_memory等字段,完整示例见 marblenet_3x2x64.yaml 中train_ds的注释分组(“tarred datasets”与“bucketing params”两组)。
预处理器配置(Preprocessor Configuration)
preprocessor节负责把原始波形转换为送入模型的特征(MFCC 或 mel 谱)。marblenet_3x2x64.yaml 中的语音分类预处理器配置如下:
preprocessor: _target_: nemo.collections.asr.modules.AudioToMFCCPreprocessor window_size: 0.025 window_stride: 0.01 window: "hann" n_mels: &n_mels 64 n_mfcc: *n_mels n_fft: 512关键参数含义:
window_size: 0.025:25ms 分析窗(16kHz 下约 400 个采样点),决定每个特征帧的时域覆盖;window_stride: 0.01:10ms 帧移,即特征帧率为 100fps;n_mels: 64与n_mfcc: *n_mels:YAML 锚点/别名让 MFCC 维数等于 mel 维数(64),并且同一锚点n_mels还被encoder的feat_in引用,从而保证特征维度与编码器输入严格一致——这是编写此类配置时必须遵守的约定;n_fft: 512:FFT 长度,略大于窗长以保证足够的频率分辨率。
增强配置(Augmentation Configurations)
文档指出 NeMo 提供两类在线(on-the-fly)增强:音频级的augmentor与谱图级的spec_augment。真实配置 marblenet_3x2x64.yaml 中两者的完整写法是:
# 数据集内的音频级增强 train_ds: augmentor: shift: prob: 1.0 min_shift_ms: -5.0 max_shift_ms: 5.0 white_noise: prob: 1.0 min_level: -90 max_level: -46 # model 下的谱图级增强 spec_augment: _target_: nemo.collections.asr.modules.SpectrogramAugmentation freq_masks: 2 time_masks: 2 freq_width: 15 time_width: 25 rect_masks: 5 rect_time: 25 rect_freq: 15augmentor.shift:以概率 1.0 对音频做 ±5ms 的随机时间平移;augmentor.white_noise:叠加 −90 dB ~ −46 dB 的白噪声;SpectrogramAugmentation中freq_masks/time_masks是频/时间方向的矩形谱图掩蔽数量,freq_width/time_width是掩蔽宽度;rect_masks等参数控制额外矩形掩蔽。这些增强只在train_ds训练路径上生效,验证/测试集不做增强。
模型架构配置(Encoder 与 Decoder)
文档强调:每个配置文件都必须通过encoder和decoder两节的_target_字段指定具体使用的模块。语音分类(MatchboxNet、MarbleNet 等)的组件配置非常相似,典型写法为:
encoder: _target_: nemo.collections.asr.modules.ConvASREncoder feat_in: *n_mels # 复用 preprocessor 的 n_mels 锚点 activation: relu conv_mask: true jasper: # Jasper 风格的分层 1-D 卷积块列表, # 每块含 filters/repeat/kernel/stride/dilation/dropout/residual/separable 等字段 - filters: 128 repeat: 1 kernel: [11] stride: [1] dilation: [1] dropout: ${model.dropout} residual: false separable: true kernel_size_factor: ${model.kernel_size_factor} # ... 中间多个残差块,最后一块: - filters: &enc_final_filters 128 repeat: 1 kernel: [1] stride: [1] dilation: [1] dropout: ${model.dropout} residual: falsejasper列表采用经典的 JasperNet 分层设计:滤波器数逐层变化(128 → 64×3 → 128 → 128)、卷积核尺寸递增(11/13/15/17/29)、末段引入dilation: [2]扩大感受野,顶层的repeat/dropout/kernel_size_factor通过${model.*}插值统一控制——这就是文档示例中repeat: 2 # number of convolutional sub-blocks within a block, R in <MODEL>_[BxRxC]注释所指的模型命名规则(如 MarbleNet-3x2x64 中的参数)。&enc_final_filters锚点记录编码器最终输出通道数,供解码器引用。
解码器:ConvASRDecoderClassification
编码器输出特征后,送入分类解码器计算嵌入并最终得到训练用的 log_probs:
decoder: _target_: nemo.collections.asr.modules.ConvASRDecoderClassification feat_in: *enc_final_filters return_logits: true # return logits if true, else return softmax output pooling_type: 'avg' # AdaptiveAvgPool1d 'avg' or AdaptiveMaxPool1d 'max'这一节的行为可以直接在源码 conv_asr.py 中得到印证:
- 构造函数签名为
feat_in, num_classes, init_mode="xavier_uniform", return_logits=True, pooling_type='avg',其中类别数num_classes由模型侧根据labels数量注入,无需手写; pooling_type只接受avg(AdaptiveAvgPool1d(1))或max(AdaptiveMaxPool1d(1)),其他取值直接抛出ValueError——这正是配置注释中只给出两个选项的原因;forward先把变长时序特征[B, C, T]池化为[B, C],再经线性层映射到[B, num_classes];return_logits: true时返回原始 logits(交由损失函数计算 log_probs),否则返回 softmax 概率。
训练与微调的实际用法
文档最后要求:编写自己的训练或微调脚本时,请遵循执行流程图顺序以保证推理正确。语音分类模型对应的实操入口是 examples/asr/speech_classification 目录,其中 Segment-VAD(整段二分类)与 Frame-VAD(帧级分类)的训练命令分别如下(来自 README.md):
# Segment-VAD:speech_to_label.py python speech_to_label.py \ --config-path="../conf/marblenet" \ --config-name="marblenet_3x2x64" \ model.train_ds.manifest_filepath="[<path to train manifest1>,<path to train manifest2>]" \ model.validation_ds.manifest_filepath=["<path to val manifest1>","<path to val manifest2>"] \ trainer.devices=-1 \ trainer.accelerator="gpu" \ strategy="ddp" \ trainer.max_epochs=100 # Frame-VAD:speech_to_frame_label.py,config 换成 marblenet_3x2x64_20ms python speech_to_frame_label.py \ --config-path="../conf/marblenet" \ --config-name="marblenet_3x2x64_20ms" \ model.train_ds.manifest_filepath="[<path to train manifest1>,<path to train manifest2>]" \ model.validation_ds.manifest_filepath=["<path to val manifest1>","<path to val manifest2>"] \ trainer.devices=-1 trainer.accelerator="gpu" strategy="ddp" trainer.max_epochs=100注意命令行参数的形态:manifest_filepath以列表字符串"[a,b]"形式传入,允许同时挂载多份 manifest;trainer.*、strategy属于 PyTorch Lightning 通用参数,与前述的model.*分类配置相互独立。推理侧有 frame_vad_infer.py 与 vad_infer.py,配合 examples/asr/conf/vad 下的frame_vad_infer_postprocess.yaml、vad_inference_postprocessing.yaml使用;若需评估 AUROC/DER,在推理配置中设evaluate: True并提供 ground truth 标签串或 RTTM 文件。
小结:编写语音分类配置的要点清单
labels、sample_rate定义在model顶层,用${model.*}插值复用,manifest_filepath用???占位以便命令行注入;preprocessor用 YAML 锚点(如&n_mels)保证特征维数与encoder.feat_in一致,编码器末块用&enc_final_filters传给decoder.feat_in;- 增强分两层:
train_ds.augmentor(shift、white_noise 等音频级)与model.spec_augment(SpectrogramAugmentation谱图掩蔽),只作用于训练; decoder固定使用ConvASRDecoderClassification,pooling_type仅限avg/max,return_logits: true时输出 logits;- 完整可参考的模板:marblenet_3x2x64.yaml(Segment-VAD/分类)与 marblenet_3x2x64_20ms.yaml(20ms 帧级 Frame-VAD)。
【免费下载链接】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),仅供参考