# 오디오 데이터 로드

[Audio](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Audio) 기능을 사용하여 오디오 데이터셋을 로드할 수 있으며, 이 기능은 예시를 접근할 때 오디오 파일을 자동으로 디코딩하고 리샘플링합니다. 오디오 디코딩은 [`torchcodec`](https://github.com/pytorch/torchcodec) 파이썬 패키지에 기반하며, 이 패키지는 내부적으로 [`FFmpeg`](https://www.ffmpeg.org/) C 라이브러리를 사용합니다.

## 설치

오디오 데이터셋을 다루려면 `audio` 의존성이 설치되어 있어야 합니다. 설치 방법은 [설치](./installation#audio) 가이드를 참고하세요.

## 로컬 파일

오디오 파일의 경로를 사용하여 자체 데이터셋을 로드할 수 있습니다. [cast_column()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Dataset.cast_column) 함수를 사용하여 오디오 파일 경로 컬럼을 가져와 [Audio](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.Audio) feature로 변환합니다:

```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>
```

## AudioFolder

`AudioFolder` 데이터셋 빌더를 사용하여 데이터셋을 로드할 수도 있습니다. 이 방법은 커스텀 dataloader를 작성할 필요가 없어, 수천 개의 오디오 파일로 구성된 오디오 데이터셋을 빠르게 생성하고 로드하는 데 유용합니다.

## 메타데이터가 포함된 AudioFolder

오디오 파일과 메타데이터 정보를 연결하려면 데이터셋에 `metadata.csv` 파일이 있는지 확인하세요. 데이터셋 구조는 다음과 같을 수 있습니다:

```
folder/train/metadata.csv
folder/train/first_audio_file.mp3
folder/train/second_audio_file.mp3
folder/train/third_audio_file.mp3
```

`metadata.csv` 파일에는 오디오 파일과 메타데이터를 연결하는 `file_name` 컬럼이 있어야 합니다. `metadata.csv` 파일의 예시는 다음과 같습니다:

```text
file_name,transcription
first_audio_file.mp3,znowu się duch z ciałem zrośnie w młodocianej wstaniesz wiosnie i możesz skutkiem tych leków umierać wstawać wiek wieków dalej tam były przestrogi jak siekać głowę jak nogi
second_audio_file.mp3,już u źwierzyńca podwojów król zasiada przy nim książęta i panowie rada a gdzie wzniosły krążył ganek rycerze obok kochanek król skinął palcem zaczęto igrzysko
third_audio_file.mp3,pewnie kędyś w obłędzie ubite minęły szlaki zaczekajmy dzień jaki poślemy szukać wszędzie dziś jutro pewnie będzie posłali wszędzie sługi czekali dzień i drugi gdy nic nie doczekali z płaczem chcą jechać dali
```

`AudioFolder`는 오디오 데이터를 로드하고 `metadata.csv`의 텍스트를 포함하는 `transcription` 열을 생성합니다:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
```

로컬 데이터셋의 경우, 이는 [load_dataset()](/docs/datasets/v5.2.0/ko/package_reference/loading_methods#datasets.load_dataset)에서 `audiofolder`를 수동으로 전달하고 `data_dir`에 해당 디렉터리를 지정하는 것과 동일합니다:

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

메타데이터는 JSON Lines 형식으로 지정할 수도 있으며, 이 경우 메타데이터 파일 이름으로 `metadata.jsonl`을 사용합니다. 이 형식은 컬럼 중 하나가 복잡한 값(예: float 목록)인 경우 파싱 오류를 방지하거나 복잡한 값을 문자열로 읽는 문제를 피하는 데 유용합니다.

메타데이터 파일의 정보를 무시하려면 [load_dataset()](/docs/datasets/v5.2.0/ko/package_reference/loading_methods#datasets.load_dataset)에서 `drop_metadata=True`를 설정하세요:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
```

메타데이터 파일이 없는 경우 `AudioFolder`은 디렉터리 이름에서 라벨 이름을 자동으로 추론합니다. 자동으로 생성된 라벨을 제거하려면 `drop_labels=True`를 설정하세요. 이 경우 데이터셋에는 오디오 컬럼만 포함됩니다:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
```

마지막으로 `filters` 인수를 사용하면 라벨 또는 메타데이터에 대한 조건을 기반으로 데이터셋의 부분 집합만 로드할 수 있습니다. 이는 메타데이터가 Parquet 형식으로 저장된 경우 특히 유용하며, 이 형식은 빠른 필터링을 지원하기 때문입니다. 기본적으로 필터링 전에 데이터셋이 완전히 다운로드되므로, 이 인수를 사용할 때 `streaming=True`를 함께 사용하는 것이 권장됩니다.

```python
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
```

> [!TIP]
> `AudioFolder` 데이터셋을 직접 만드는 방법에 대한 자세한 내용은 [오디오 데이터셋 만들기](./audio_dataset) 가이드를 참고하세요.

모든 유형의 데이터를 로드하는 방법에 대한 가이드는 일반적인 로드 가이드를 참고하세요.

## 오디오 디코딩

기본적으로 데이터셋을 반복할 때 오디오 파일은 [`AudioDecoder`](https://meta-pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.html#torchcodec.decoders.AudioDecoder) 객체로 순차적으로 디코딩됩니다. 그러나 멀티스레드 디코딩을 사용하면 데이터셋의 속도를 크게 높일 수 있습니다:

```python
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset:  # up to 20 times faster !
...     ...
```

`num_threads`를 사용하여 멀티스레딩을 활성화할 수 있습니다. 이는 원격 데이터 스트리밍을 가속하는 데 특히 유용합니다. 그러나 빠른 디스크의 로컬 데이터의 경우 `num_threads=0`보다 느릴 수 있습니다.

NumPy 배열로 디코딩된 이미지에 관심이 없고 대신 경로/바이트에 액세스하려면 디코딩을 비활성화할 수 있습니다:

```python
>>> dataset = dataset.decode(False)
```

참고: [IterableDataset.decode()](/docs/datasets/v5.2.0/ko/package_reference/main_classes#datasets.IterableDataset.decode)는 현재 스트리밍 데이터셋에서만 사용할 수 있습니다.

