集合数据集指南:NeMo Manifest 与 Lhotse 格式的构建、转换与实战配置)
NeMo Speech 音频audio集合数据集指南NeMo Manifest 与 Lhotse 格式的构建、转换与实战配置【免费下载链接】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/SpeechNeMonem/Speech的audio集合speech enhancement / restoration 等 audio-to-audio 任务要求训练、验证与测试数据集以NeMo 格式或Lhotse 格式组织。本文以官方数据集文档 docs/source/audio/datasets.rst 为主线完整讲解两种格式的规范、实验配置写法、NeMo Manifest 到 Lhotse 的转换脚本用法以及 Lhotse Shar 数据集的构建流程并结合仓库源码转换脚本、数据集类、配置样例、单元测试深入剖析其底层实现帮助读者从数据准备到配置接入一次打通。一、概述audio 集合的两类数据集格式audio集合的模型如语音增强、语音恢复等 audio-to-audio 任务在读取数据时期望训练、验证、测试数据以以下两种格式之一提供NeMo 格式每个数据集由一组独立的音频文件加一个 JSON Manifest每行描述一条话语构成这也是多数场景下的默认输入方式Lhotse 格式基于 Lhotse 语音数据处理库CutSet manifest / Shar 数据通过在数据集配置中设置use_lhotseTrue即可启用支持动态 batch、动态分桶等高级采样能力。Lhotse dataloader 的完整能力支持的input_cfg类型、bucketing、索引化 manifest 与可断点续训 dataloading、LhotseDataLoadingConfig字段参考详见仓库文档 docs/source/dataloaders.rst。二、NeMo 格式一条 JSON 一行一个 Manifest 描述一个数据集2.1 Manifest 的基本结构在 NeMo 格式下每个数据集由独立的音频文件与描述它们的 Manifest 文件组成Manifest 中每行对应一条话语以.json文件形式存放。一个数据集对应一个 Manifest。每个传入的数据集都应有一个独立的 Manifest 文件如果用户希望训练集与验证集分开就必须分别为它们准备单独的 Manifest否则会把验证数据混入训练数据反之亦然。在 speech restoration / enhancement 等大多数应用中模型的目标是把输入音频信号变换为目标音频信号。此时 Manifest 的每一行应具有如下结构{input_filepath: /path/to/input_audio.wav, target_filepath: /path/to/target_audio.wav, duration: 3.147}input_filepath输入音频路径可以是绝对路径也可以是相对于 Manifest 所在目录的相对路径target_filepath目标音频路径同样支持绝对路径或相对路径duration该条话语的时长秒用于训练时的长度控制与采样。输入与目标音频的键名key是可以自定义的通过模型配置文件中的input_key/target_key指定详见下文“NeMo 数据集配置”小节与 docs/source/audio/configs.rst 中的audio-configs-nemo-dataset-configuration章节。2.2 Manifest 的书写规范Manifest 是严格的行式 JSON每条记录描述一个音频文件必须以{和}包裹且必须位于同一行各key: value之间以逗号分隔如上例所示NeMo 强制要求 Manifest 中不得有空行以保证“总行数 数据集中的音频文件总数”从而正确统计数据集规模。2.3 在实验配置中引用 Manifest准备好描述每个音频文件的 Manifest 后在实验配置文件中为其赋值即可例如training_ds.manifest_filepathpath/to/manifest.json关于各类 tarred打包成 tar 分片数据集及其参数包括 shuffle 选项等可查阅对应数据集的类 API 文档docs/source/audio/api.html#datasets一节或直接阅读仓库中数据集类实现 nemo/collections/audio/data/audio_to_audio.py。2.4 数据集类与配置字段源码级解读从源码看audio集合通过工厂函数实例化三类数据集见 nemo/collections/audio/data/audio_to_audio_dataset.pyget_audio_to_target_dataset(config)最基础的输入→目标映射实例化AudioToTargetDatasetget_audio_to_target_with_reference_dataset(config)额外携带一路参考信号referenceget_audio_to_target_with_embedding_dataset(config)额外携带 embedding 向量。三者共用的核心配置字段如下均从config字典中读取配置字段默认值说明manifest_filepath必填NeMo Manifest 路径sample_rate必填所有音频信号统一使用的采样率input_key必填Manifest 中输入音频路径的键名target_key必填Manifest 中目标音频路径的键名audio_durationNone训练音频片段时长秒为None时加载整个文件random_offsetFalse文件长于audio_duration时是否随机选取子片段起始位置max_duration/min_durationNone按时长过滤样本的上下界max_utts0最多加载的话语条数上限input_channel_selector/target_channel_selectorNone多声道文件加载时的声道选择器reference_key/reference_channel_selector/reference_is_synchronized/reference_duration-参考信号相关仅 reference 数据集embedding_key-embedding 文件路径键名仅 embedding 数据集normalization_signalNone以指定信号为基准做 [-1, 1] 归一化其余信号同比例缩放真实的实验配置样例见 examples/audio/conf/masking.yaml其train_ds/validation_ds/test_ds配置节摘录如下model: sample_rate: 16000 train_ds: manifest_filepath: ??? input_key: audio_filepath # manifest 中输入信号路径的键 target_key: target_filepath # manifest 中目标信号路径的键 target_channel_selector: 0 # 目标信号取文件的第一声道 audio_duration: 4.0 # 训练片段时长秒 random_offset: true # 文件长于 audio_duration 时随机取子片段 min_duration: ${model.train_ds.audio_duration} batch_size: 64 shuffle: true num_workers: 8 pin_memory: true validation_ds: manifest_filepath: ??? input_key: audio_filepath target_key: target_filepath target_channel_selector: 0 batch_size: 64 shuffle: false num_workers: 4 pin_memory: true test_ds: manifest_filepath: ??? input_key: audio_filepath target_key: target_filepath target_channel_selector: 0 batch_size: 1 shuffle: false num_workers: 4 pin_memory: true注意这里input_key使用的是audio_filepath与转换脚本的默认值一致而 2.1 节示例中的键名为input_filepath——键名完全由配置决定两者都可正常工作。三、Lhotse 格式use_lhotseTrue一键启用NeMo 支持将 Lhotse 作为数据加载选项在数据集配置中设置use_lhotseTrue即可启用详见 docs/source/audio/configs.rst 中的audio-configs-lhotse-dataset-configuration章节。3.1 Lhotse 支持的输入类型Lhotse CutSet manifest常规的 Lhotse CutSet 清单通常是 gzip 压缩的 JSONL即.jsonl.gz。关于 Lhotse 的数据格式可参阅 Lhotse Cuts 官方文档Lhotse Shar 数据同样基于 tar 文件实现顺序加载的数据格式但设计为模块化易于扩展新的数据源与新的特征字段。具体可参考 Lhotse 官方 Shar 教程 notebook。3.2 Lhotse CutSet 数据集配置示例以下配置以 Lhotse CutSet manifest 作为训练集目标信号应存放在自定义的target_recording字段中train_ds: use_lhotse: true # 启用 Lhotse dataloader cuts_path: ??? # Lhotse cuts manifest 路径含输入与目标信号目标在 custom target_recording 字段 truncate_duration: 4.00 # 截断音频至 4 秒 truncate_offset_type: random # 文件长于 truncate_duration 时随机选取子片段 batch_size: 64 shuffle: true num_workers: 8 pin_memory: true若使用 Lhotse CutSet 并叠加在线增强RIR 卷积 加性噪声可参考 examples/audio/conf/masking_with_online_augmentation.yaml其核心配置为train_ds: use_lhotse: true cuts_path: ??? # 用于增强的语音 cuts manifest含 custom target_recording 字段 truncate_duration: 4.00 truncate_offset_type: random batch_size: 64 shuffle: true num_workers: 8 pin_memory: true rir_enabled: true # 启用房间冲激响应RIR增强 rir_path: ??? # RIR 信号 Lhotse recordings manifest noise_path: ??? # 噪声信号 Lhotse cuts manifest3.3 底层实现LhotseAudioToTargetDataset源码解读Lhotse 路径下audio集合使用 nemo/collections/audio/data/audio_to_audio_lhotse.py 中的LhotseAudioToTargetDataset类其是 ASR 集合AudioToTargetDataset的 Lhotse 变体。其__getitem__接收一个 CutSet mini-batch处理逻辑要点如下通过collate_audio(cuts, fault_tolerantTrue)加载输入音频fault_tolerantTrue可跳过个别损坏样本例如加载.flac时偶发的 FileSeek 错误代价是少数情况下 batch 尺寸略小输出字典固定包含input_signal、input_length两个键若 cuts 含target_recording字段则额外输出target_signal、target_length若含reference_recording字段则输出reference_signal、reference_length若含embedding_vector字段则输出embedding_signal对MixedCut在线增强后的混合 cut会提取首个非填充子 cut 作为干净信号。四、从 NeMo Manifest 转换到 Lhotse仓库提供了开箱即用的转换脚本scripts/audio_to_audio/convert_nemo_to_lhotse.py可将 NeMo 格式的 Manifest 一键转换为 Lhotse 格式。4.1 基本用法CONVERT_SCRIPTscripts/audio_to_audio/convert_nemo_to_lhotse.py INPUT_MANIFEST/path/to/data/nemo_manifest.json OUTPUT_MANIFEST/path/to/data/lhotse_manifest.jsonl python ${CONVERT_SCRIPT} ${INPUT_MANIFEST} ${OUTPUT_MANIFEST} -i input_filepath -t target_filepath4.2 命令行参数详解结合 scripts/audio_to_audio/convert_nemo_to_lhotse.py 中的 argparse 定义完整参数如下参数默认值说明input位置参数-输入 NeMo Manifest 路径output位置参数-输出 Lhotse Manifest 路径支持.jsonl.gz与.jsonl两种扩展名-i, --input_keyaudio_filepath输入录音字段键名映射到 Lhotse 的Cut.recording-t, --target_keytarget_filepath目标录音字段键名映射到 Lhotse 的Cut.target_recording-r, --reference_keyreference_filepath参考录音字段键名映射到 Lhotse 的Cut.reference_recording-e, --embedding_keyembedding_filepathembedding 字段键名映射到 Lhotse 的Cut.embedding_vector-a, --force_absolute_pathsFalsestore_true强制输出 Manifest 中使用绝对路径4.3 转换原理源码级剖析转换核心函数convert_manifest_nemo_to_lhotse位于 nemo/collections/audio/data/audio_to_audio_lhotse.py实现要点逐行读取NeMo Manifestload_jsonl用CutSet.open_writer流式写入输出 Manifest构建录音与 cut以input_key对应路径创建 LhotseRecording转成Cut后按duration字段截断、按offset默认 0.0偏移路径相对化默认不传--force_absolute_paths会把录音源路径改写成与原 Manifest 中一致的相对路径传入--force_absolute_paths时保留绝对路径声道选择器若 Manifest 行含input_channel_selector/target_channel_selector/reference_channel_selector字段会执行声道选择目标/参考声道的选择器会被写入 Lhotse 的 custom 字段target_recording_channel_selector、reference_recording_channel_selectortarget / reference / embedding存在对应键时分别填充cut.target_recording、cut.reference_recordingembedding 仅支持.npynumpy文件存储为numpy_files类型的Array自定义字段透传行内剩余未被消费的字段会自动落入cut.custom保证信息不丢失。4.4 等价性验证单元测试作证仓库单元测试 tests/collections/audio/test_audio_datasets.py 直接验证了转换正确性与两条加载路径的一致性先用convert_manifest_nemo_to_lhotse(..., input_key..., target_key...)把 NeMo Manifest 转成_cuts.jsonl第 260-265 行再用get_lhotse_dataloader_from_config({cuts_path: cuts_path, use_lhotse: True, ...}, datasetLhotseAudioToTargetDataset())构建 Lhotse dataloader第 268-277 行最后对use_lhotse ∈ {False, True}两条路径逐样本、逐信号做形状与数值np.allclose比对确保转换前后数据完全一致第 293-308 行。五、构建 Lhotse Shar 数据集SharSharded Audio Recorder是 Lhotse 提供的模块化 tar 分片格式适合大规模顺序加载。构建流程分两步。5.1 步骤一转换为绝对路径的 Lhotse ManifestShar 导出要求路径可跨机器解析因此先用--force_absolute_paths生成绝对路径版本CONVERT_SCRIPTscripts/audio_to_audio/convert_nemo_to_lhotse.py INPUT_MANIFEST/path/to/data/nemo_manifest.json OUTPUT_MANIFEST/path/to/data/lhotse_manifest_absolute_paths.jsonl # 转换强制绝对路径 python ${CONVERT_SCRIPT} ${INPUT_MANIFEST} ${OUTPUT_MANIFEST} -i input_filepath -t target_filepath --force_absolute_paths5.2 步骤二使用lhotse shar export生成 Shar 分片LHOTSE_MANIFEST/path/to/data/lhotse_manifest_absolute_paths.jsonl OUTPUT_DIR/path/to/data/shar # 创建 shar 分片每片 2084 条样本音频转存为 flac 格式 lhotse shar export --num-jobs 16 --verbose --shard-size 2084 --audio flac ${LHOTSE_MANIFEST} ${OUTPUT_DIR}该命令依赖环境中的lhotseCLI--num-jobs 16指定 16 个并行任务--shard-size 2084控制每个分片的样本数--audio flac指定音频转存格式。lhotse shar系列命令还支持cut estimate-bucket-bins等配套工具用于估算分桶边界。5.3 Shar 数据集的配置接入生成 Shar 目录后在实验配置中通过shar_path接入train_ds: shar_path: ??? # Lhotse Shar 目录路径 use_lhotse: true truncate_duration: 4.00 # 截断音频至 4 秒 truncate_offset_type: random batch_size: 8 shuffle: true num_workers: 8 pin_memory: trueShar 格式配置的完整示例可参考 examples/audio/conf/flow_matching_generative_ssl_pretraining.yamlSSL 预训练示例。此外docs/source/audio/configs.rst 还提供了多数据集组合时的温度重加权机制reweight_temperature支持标量或按嵌套深度取值的列表可在混合多个 Shar / tarred 数据集时动态平衡采样分布无需手工反复调整权重。六、进一步阅读docs/source/audio/configs.rstaudio 集合完整的配置说明NeMo / Lhotse / Shar 数据集配置、在线增强、温度重加权docs/source/dataloaders.rstLhotse dataloader 全貌——input_cfg类型、动态 bucketing、索引化可断点续训、LhotseDataLoadingConfig字段参考nemo/collections/audio/data/audio_to_audio_lhotse.pyLhotse 转换与数据集类实现nemo/collections/audio/data/audio_to_audio.pyNeMo 格式数据集类AudioToTargetDataset及其信号加载/同步逻辑examples/audio/conf/全部 audio 集合示例配置含masking.yaml、masking_with_online_augmentation.yaml、flow_matching_generative_ssl_pretraining.yaml等tests/collections/audio/test_audio_datasets.pyNeMo 与 Lhotse 两条加载路径等价性的单元测试。【免费下载链接】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),仅供参考