数据准备¶
VoiceStudio 使用自定义的 WebDataset 格式进行训练,其中音频数据被打包为 tar 分片,并配有对应的 JSONL 元数据文件。每个 tar 分片包含数百到数千个样本(以 .npy 音频 token 数组形式存储),大幅降低训练期间的磁盘 I/O。独立的 jsonl 文件便于修改元数据。本文档详细介绍数据格式,并逐步说明数据准备流程。
1. 输入格式¶
准备一个 JSONL 文件,其中每一行都是一个 JSON 对象:
{"id": "sample_001", "audio_path": "/data/audio/001.wav", "text": "Hello world", "language_id": "en"}
{"id": "sample_002", "audio_path": "/data/audio/002.wav", "text": "你好世界", "language_id": "zh"}
字段说明:
- id — 唯一样本标识符(用于跨分片和标签文件匹配样本)
- audio_path — 音频文件的绝对路径(wav/flac/mp3,将重采样至 24 kHz)
- text — 转写文本
- language_id —(可选)语言代码,用于多语言训练,可省略
2. 处理¶
音频 token 提取脚本 extract_audio_tokens.py 将音频转换为 8 层离散 token,并将它们打包到 WebDataset 分片中。
export CUDA_VISIBLE_DEVICES="0,1,2,4" # GPUs used for token extraction
python -m omnivoice.scripts.extract_audio_tokens \
--input_jsonl data.jsonl \
--tar_output_pattern output/audios/shard-%06d.tar \
--jsonl_output_pattern output/txts/shard-%06d.jsonl \
--tokenizer_path eustlb/higgs-audio-v2-tokenizer \
--nj_per_gpu 3 \
--shuffle True
该脚本的作用:
1. 读取你的 JSONL 清单
2. 使用音频 tokenizer 将每个音频文件编码为离散 token
3. 将 token 打包到带有对应 jsonl 元数据文件的 WebDataset tar 分片中
4. 生成 data.lst 清单文件
备选方案:WebDataset 输入(如果你已有原始音频 tar 分片)
传入 data.lst 清单文件(而不是 --input_jsonl):
export CUDA_VISIBLE_DEVICES="0,1,2,4" # GPUs used for token extraction
python -m omnivoice.scripts.extract_audio_tokens \
--input_manifest existing_data/data.lst \
--tar_output_pattern output/audios/shard-%06d.tar \
--jsonl_output_pattern output/txts/shard-%06d.jsonl \
--tokenizer_path eustlb/higgs-audio-v2-tokenizer \
--nj_per_gpu 3 \
--shuffle True
existing_data/data.lst 由以下命令生成:
python -m omnivoice.scripts.jsonl_to_webdataset \
--input data.jsonl \
--output data/shards \
--sr 24000 \
--shard-size 1000
该命令将音频重采样至目标采样率,并将 FLAC 文件打包到带有对应 jsonl 元数据文件的 tar 分片中。
脚本选项说明¶
| 选项 | 默认值 | 说明 |
|---|---|---|
--input_manifest |
None | 输入数据清单(data.lst)的路径,与 --input_jsonl 互斥 |
--input_jsonl |
None | 原始 JSONL 文件的路径,与 --input_manifest 互斥 |
--tar_output_pattern |
(必填) | Tar 分片输出模式,例如 output/audios/shard-%06d.tar |
--jsonl_output_pattern |
(必填) | JSONL 分片输出模式,例如 output/txts/shard-%06d.jsonl |
--tokenizer_path |
eustlb/higgs-audio-v2-tokenizer |
HuggingFace tokenizer 路径或本地路径 |
--nj_per_gpu |
3 | 每个 GPU 的工作进程数 |
--loader_workers |
24 | 用于流式 IterableDataset 的 DataLoader 工作进程数 |
--shuffle |
True | 分片前对样本进行打乱 |
--shuffle-seed |
42 | 打乱所用的随机种子 |
--samples_per_shard |
1000 | 每个 tar 分片的最大样本数 |
--min_num_shards |
32 | 输出分片的最小数量(确保分片数量 >= num_gpu × num_workers) |
--min_length |
0.0 | 跳过短于该时长(秒)的音频 |
--max_length |
inf | 跳过长于该时长(秒)的音频 |
--skip_errors |
False | 处理出错时继续运行而不是中止 |
--num_machines |
1 | 分布式运行时的总机器数 |
--machine_index |
0 | 分布式预处理中从零开始的机器索引 |
输出结构¶
使用以下输出模式时的输出结构:
--tar_output_pattern output/audios/shard-%06d.tar \
--jsonl_output_pattern output/txts/shard-%06d.jsonl
目录结构将为:
output/
├── audios/ # WebDataset tar shards (audio tokens)
│ ├── shard-000000.tar # Each tar packs ~1000 samples
│ ├── shard-000001.tar
│ └── ...
├── txts/ # Per-shard companion JSONL labels
│ ├── shard-000000.jsonl # One JSON line per sample in the corresponding tar
│ ├── shard-000001.jsonl
│ └── ...
├── data.lst # Manifest linking tar ↔ jsonl shards
└── errors.jsonl # Samples that failed processing (if any)
data.lst 和 errors.jsonl 会写入 audios/ 和 txts/ 的上级目录。
data.lst 清单¶
data.lst 中的每一行描述一个分片:
/path/to/shard-000000.tar /path/to/shard-000000.jsonl 1000 3600.500
/path/to/shard-000001.tar /path/to/shard-000001.jsonl 800 2880.200
格式:<tar_path> <jsonl_path> <num_samples> <total_duration_seconds>
- 路径均为绝对路径
.tar文件包含音频 token。.jsonl文件包含原始 JSONL 文件中的元数据,无需解压 tar 文件即可更方便地访问和修改元数据。- 训练数据配置所引用的正是该清单文件。
tar 分片内部¶
每个 .tar 文件将大量样本(默认每个分片 1000 个)打包到单个归档文件中。这正是 WebDataset 的关键优势:数据加载器无需读取成千上万个微小文件,而是从少数几个大型 tar 文件顺序读取,大幅降低磁盘 I/O 压力。
tar 中的每个样本都是一对具有匹配键的文件:
shard-000000.tar:
sample_001.npy # Audio tokens: numpy array, shape [8, T], dtype int16
sample_002.npy
...
sample_1000.npy
3. 训练数据配置¶
创建 WebDataset 分片后,编写一个引用这些分片的数据配置 JSON:
{
"train": [
{
"language_id": "en",
"manifest_path": ["data/custom/tokens/train/data.lst"],
"repeat": 1
}
],
"dev": [
{
"language_id": "en",
"manifest_path": ["data/custom/tokens/dev/data.lst"],
"repeat": 1
}
]
}
manifest_path — data.lst 文件的列表(每个分片目录对应一个)
- repeat — 每个 epoch 中重复该数据集的次数(用于平衡不同语言)
- language_id 不会被实际使用,仅用于更好地组织数据。
现成的数据配置文件参见 examples/config/。
有关去噪和噪声增强,请参阅 docs/data_preparation_advanced.md。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio