跳转至

数据准备

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