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以及ConvASREncoderConvASRDecoderClassification的模型架构配置。读完后你可以直接基于 marblenet_3x2x64.yaml 这类真实配置为自己的语音分类或 VADVoice 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 Configurationpreprocessor节负责把原始波形转换为送入模型的特征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.02525ms 分析窗16kHz 下约 400 个采样点决定每个特征帧的时域覆盖window_stride: 0.0110ms 帧移即特征帧率为 100fpsn_mels: 64与n_mfcc: *n_melsYAML 锚点/别名让 MFCC 维数等于 mel 维数64并且同一锚点n_mels还被encoder的feat_in引用从而保证特征维度与编码器输入严格一致——这是编写此类配置时必须遵守的约定n_fft: 512FFT 长度略大于窗长以保证足够的频率分辨率。增强配置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_probsdecoder: _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_modexavier_uniform, return_logitsTrue, pooling_typeavg其中类别数num_classes由模型侧根据labels数量注入无需手写pooling_type只接受avgAdaptiveAvgPool1d(1)或maxAdaptiveMaxPool1d(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-VADspeech_to_label.py python speech_to_label.py \ --config-path../conf/marblenet \ --config-namemarblenet_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.acceleratorgpu \ strategyddp \ trainer.max_epochs100 # Frame-VADspeech_to_frame_label.pyconfig 换成 marblenet_3x2x64_20ms python speech_to_frame_label.py \ --config-path../conf/marblenet \ --config-namemarblenet_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.acceleratorgpu strategyddp trainer.max_epochs100注意命令行参数的形态manifest_filepath以列表字符串[a,b]形式传入允许同时挂载多份 manifesttrainer.*、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.augmentorshift、white_noise 等音频级与model.spec_augmentSpectrogramAugmentation谱图掩蔽只作用于训练decoder固定使用ConvASRDecoderClassificationpooling_type仅限avg/maxreturn_logits: true时输出 logits完整可参考的模板marblenet_3x2x64.yamlSegment-VAD/分类与 marblenet_3x2x64_20ms.yaml20ms 帧级 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),仅供参考