# 创建音频数据集

您可以在 Hugging Face Hub 上创建数据集仓库，与您的团队或社区中的任何人共享数据集：

```py
from datasets import load_dataset

dataset = load_dataset("<username>/my_dataset")
```

创建和共享音频数据集有几种方法：

- Create an audio dataset from local files in python with [Dataset.push_to_hub()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.push_to_hub). This is an easy way that requires only a few steps in python.

- 使用 `AudioFolder` 构建器创建一个音频数据集仓库。这是一种无需编写代码的解决方案，可快速创建包含数千个音频文件的音频数据集。

> [!TIP]
> 您可以通过要求用户先共享其联系信息来控制对数据集的访问权限。有关如何在 Hub 上启用此功能的更多信息，请参阅 [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) 指南。

## 本地文件

您可以使用音频文件的路径来加载自己的数据集。使用 [cast_column()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.cast_column) 函数获取音频文件路径列，并将其转换为 [Audio](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Audio) 特征：

```py
>>> audio_dataset = Dataset.from_dict({"audio": ["path/to/audio_1", "path/to/audio_2", ..., "path/to/audio_n"]}).cast_column("audio", Audio())
>>> audio_dataset[0]["audio"]
<datasets.features._torchcodec.AudioDecoder object at 0x11642b6a0>
```

然后使用 [Dataset.push_to_hub()](/docs/datasets/v5.2.0/zh/package_reference/main_classes#datasets.Dataset.push_to_hub) 将数据集上传到 Hugging Face Hub：

```py
audio_dataset.push_to_hub("<username>/my_dataset")
```

这将创建一个包含您的音频数据集的数据集仓库：

```
my_dataset/
├── README.md
└── data/
    └── train-00000-of-00001.parquet
```

## AudioFolder

`AudioFolder` 是一个数据集构建器，旨在快速加载包含数千个音频文件的音频数据集，且无需编写任何代码。

> [!TIP]
> 💡 查看 [Split pattern hierarchy](repository_structure#split-pattern-hierarchy) 以了解 `AudioFolder` 如何根据数据集仓库结构创建数据集拆分。

`AudioFolder` 会根据目录名称自动推断数据集的类别标签。请将数据集存储为如下目录结构：

```
folder/train/dog/golden_retriever.mp3
folder/train/dog/german_shepherd.mp3
folder/train/dog/chihuahua.mp3

folder/train/cat/maine_coon.mp3
folder/train/cat/bengal.mp3
folder/train/cat/birman.mp3
```

如果数据集遵循 `AudioFolder` 结构，则可以直接使用 [load_dataset()](/docs/datasets/v5.2.0/zh/package_reference/loading_methods#datasets.load_dataset) 加载：

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
```

这相当于在 [load_dataset()](/docs/datasets/v5.2.0/zh/package_reference/loading_methods#datasets.load_dataset) 中手动传入 `audiofolder` 以及 `data_dir` 中的目录：

```py
>>> dataset = load_dataset("audiofolder", data_dir="/path/to/folder")
```

您还可以使用 `audiofolder` 来加载涉及多个 split 的数据集。为此，您的数据集目录应具有以下结构：

```
folder/train/dog/golden_retriever.mp3
folder/train/cat/maine_coon.mp3
folder/test/dog/german_shepherd.mp3
folder/test/cat/bengal.mp3
```

> [!WARNING]
> 如果所有音频文件都位于同一个目录中，或者它们不在同一层级的目录结构中，则不会自动添加`label`列。如果需要该列，请显式设置`drop_labels=False`。

如果您希望为数据集添加额外信息，例如文本说明或边界框，请在您的文件夹中将其添加为 `metadata.csv` 文件。这可以让您快速创建用于不同计算机视觉任务的数据集，例如文本说明或目标检测。您也可以使用 JSONL 文件 `metadata.jsonl` 或 Parquet 文件 `metadata.parquet`。

```
folder/train/metadata.csv
folder/train/0001.mp3
folder/train/0002.mp3
folder/train/0003.mp3
```

您也可以将音频文件打包为 zip 文件，在这种情况下，每个 zip 文件都应同时包含音频文件和元数据

```
folder/train.zip
folder/test.zip
folder/validation.zip
```

您的 `metadata.csv` 文件必须包含一个 `file_name` 或 `*_file_name` 字段，用于将音频文件与其元数据关联起来：

```csv
file_name,additional_feature
0001.mp3,This is a first value of a text feature you added to your audio files
0002.mp3,This is a second value of a text feature you added to your audio files
0003.mp3,This is a third value of a text feature you added to your audio files
```

或使用 `metadata.jsonl`：

```jsonl
{"file_name": "0001.mp3", "additional_feature": "This is a first value of a text feature you added to your audio files"}
{"file_name": "0002.mp3", "additional_feature": "This is a second value of a text feature you added to your audio files"}
{"file_name": "0003.mp3", "additional_feature": "This is a third value of a text feature you added to your audio files"}
```

此处 `file_name` 必须是位于元数据文件旁边的音频文件的名称。更一般地说，它必须是包含元数据的目录到音频文件的相对路径。

在数据集中的每一行中，可以指向多个音频，例如当输入和输出都是音频文件时：

```jsonl
{"input_file_name": "0001.mp3", "output_file_name": "0001_output.mp3"}
{"input_file_name": "0002.mp3", "output_file_name": "0002_output.mp3"}
{"input_file_name": "0003.mp3", "output_file_name": "0003_output.mp3"}
```

您还可以定义音频文件列表。在这种情况下，您需要将该字段命名为 `file_names` 或 `*_file_names`。示例如下：

```jsonl
{"recordings_file_names": ["0001_r0.mp3", "0001_r1.mp3"], label: "same_person"}
{"recordings_file_names": ["0002_r0.mp3", "0002_r1.mp3"], label: "same_person"}
{"recordings_file_names": ["0003_r0.mp3", "0003_r1.mp3"], label: "different_person"}
```

## WebDataset

[WebDataset](https://github.com/webdataset/webdataset) 格式基于 TAR 归档，适用于大型音频数据集。实际上，您可以将音频文件分组到 TAR 归档中（例如，每个 TAR 归档包含 1GB 的音频文件），并拥有数千个 TAR 归档：

```
folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...
```

在归档中，每个示例由共享相同前缀的文件组成：

```
e39871fd9fd74f55.mp3
e39871fd9fd74f55.json
f18b91585c4d3f3e.mp3
f18b91585c4d3f3e.json
ede6e66b2fb59aab.mp3
ede6e66b2fb59aab.json
ed600d57fcee4f94.mp3
ed600d57fcee4f94.json
...
```

您可以使用 JSON 或文本文件来存放音频文件的标签/说明/边界框。

加载您的 WebDataset，它会为每个文件后缀（此处为 "mp3" 和 "json"）创建一个列：

```python
>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train")
>>> dataset[0]["json"]
{"transcript": "Hello there !", "speaker": "Obi-Wan Kenobi"}
```

也可以像这样在每个示例中包含多个音频文件：

```
e39871fd9fd74f55.input.mp3
e39871fd9fd74f55.output.mp3
e39871fd9fd74f55.json
f18b91585c4d3f3e.input.mp3
f18b91585c4d3f3e.output.mp3
f18b91585c4d3f3e.json
...
```

有关 WebDataset 格式和 python 库的更多详细信息，请参阅 [WebDataset 文档](https://webdataset.github.io/webdataset)。

