# Создание набора данных с аудио

Вы можете поделиться набором данных со своей командой или с любым участником сообщества, создав репозиторий набора данных на 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/main/ru/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/main/ru/package_reference/main_classes#datasets.Dataset.cast_column), чтобы взять столбец с путями к аудиофайлам и привести его к типу [Audio](/docs/datasets/main/ru/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>
```

Затем загрузите набор данных в Hugging Face Hub с помощью [Dataset.push_to_hub()](/docs/datasets/main/ru/package_reference/main_classes#datasets.Dataset.push_to_hub):

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

Это создаст репозиторий датасета, содержащий ваш аудиодатасет:

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

## AudioFolder

`AudioFolder` — это конструктор набора данных, предназначенный для быстрого загрузки аудиоданных, содержащих несколько тысяч аудиофайлов, без необходимости писать какой-либо код.

> [!TIP]
> 💡 Ознакомьтесь с [Иерархией паттернов разбиения](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/main/ru/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

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

Это эквивалентно ручной передаче `audiofolder` в [load_dataset()](/docs/datasets/main/ru/package_reference/loading_methods#datasets.load_dataset) и указанию каталога в `data_dir`:

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

Вы также можете использовать `audiofolder` для загрузки наборов данных, содержащих несколько разбиений. Для этого каталог вашего набора данных должен иметь следующую структуру:

```
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, при этом каждый архив должен содержать как файлы аудио, так и метаданные

```
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 (например, 1 ГБ аудиофайлов на один архив 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).

