# Tải dữ liệu âm thanh

Bạn có thể tải một tập dữ liệu âm thanh bằng tính năng [Audio](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Audio), tự động giải mã và lấy lại tần số mẫu của các tệp âm thanh khi bạn truy cập các ví dụ. Việc giải mã âm thanh dựa trên gói python [`torchcodec`](https://github.com/pytorch/torchcodec), sử dụng thư viện C [`FFmpeg`](https://www.ffmpeg.org/) bên trong.

## Cài đặt

Để làm việc với các bộ dữ liệu âm thanh, bạn cần cài đặt các phụ thuộc `audio`. Xem hướng dẫn [cài đặt](./installation#audio) để biết cách cài đặt.

## Tệp cục bộ

Bạn có thể tải bộ dữ liệu của riêng mình bằng cách sử dụng đường dẫn đến các tệp âm thanh. Sử dụng hàm [cast_column()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.cast_column) để lấy một cột chứa đường dẫn tệp âm thanh và chuyển đổi nó thành đặc trưng [Audio](/docs/datasets/v5.2.0/vi/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>
```

## AudioFolder

Bạn cũng có thể tải một dataset bằng dataset builder `AudioFolder`. Nó không yêu cầu viết một dataloader tùy chỉnh, giúp ích cho việc tạo và tải nhanh các dataset âm thanh có hàng nghìn tệp âm thanh.

## AudioFolder với metadata

Để liên kết các tệp âm thanh của bạn với thông tin metadata, hãy đảm bảo bộ dữ liệu của bạn có tệp `metadata.csv`. Cấu trúc bộ dữ liệu của bạn có thể trông như sau:

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

Tệp `metadata.csv` của bạn phải có cột `file_name` để liên kết các tệp âm thanh với metadata của chúng. Một tệp `metadata.csv` mẫu có thể trông như sau:

```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` sẽ tải dữ liệu âm thanh và tạo một cột `transcription` chứa văn bản từ `metadata.csv`:

```py
>>> from datasets import load_dataset

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

Đối với các bộ dữ liệu cục bộ, điều này tương đương với việc truyền `audiofolder` thủ công trong [load_dataset()](/docs/datasets/v5.2.0/vi/package_reference/loading_methods#datasets.load_dataset) và thư mục trong `data_dir`:

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

Metadata cũng có thể được chỉ định dưới dạng JSON Lines, trong trường hợp đó hãy dùng `metadata.jsonl` làm tên tệp metadata. Định dạng này hữu ích trong các kịch bản khi một trong các cột có cấu trúc phức tạp, ví dụ như một danh sách các số float, để tránh lỗi phân tích hoặc việc đọc các giá trị phức tạp dưới dạng chuỗi.

Để bỏ qua thông tin trong tệp metadata, đặt `drop_metadata=True` trong [load_dataset()](/docs/datasets/v5.2.0/vi/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

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

Nếu bạn không có tệp metadata, `AudioFolder` sẽ tự động suy ra tên nhãn từ tên thư mục. Nếu bạn muốn loại bỏ các nhãn được tạo tự động, hãy đặt `drop_labels=True`. Trong trường hợp này, tập dữ liệu của bạn sẽ chỉ chứa một cột audio:

```py
>>> from datasets import load_dataset

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

Cuối cùng, đối số `filters` cho phép bạn chỉ tải một tập con của bộ dữ liệu, dựa trên điều kiện về nhãn hoặc metadata. Điều này đặc biệt hữu ích nếu metadata ở định dạng Parquet, vì định dạng này cho phép lọc nhanh. Cũng nên sử dụng đối số này cùng với `streaming=True`, vì mặc định bộ dữ liệu sẽ được tải xuống hoàn toàn trước khi lọc.

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

> [!TIP]
> Để biết thêm thông tin về việc tạo bộ dữ liệu `AudioFolder` của riêng bạn, hãy xem hướng dẫn [Tạo bộ dữ liệu âm thanh](./audio_dataset).

Để tìm hiểu cách tải bất kỳ loại tập dữ liệu nào, hãy xem hướng dẫn tải chung.

## Giải mã âm thanh

Mặc định, các tệp âm thanh được giải mã tuần tự dưới dạng các đối tượng [`AudioDecoder`](https://meta-pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.html#torchcodec.decoders.AudioDecoder) của torchcodec khi bạn lặp qua một tập dữ liệu. Tuy nhiên, bạn có thể tăng tốc đáng kể tập dữ liệu bằng cách sử dụng giải mã đa luồng:

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

Bạn có thể bật đa luồng bằng cách sử dụng `num_threads`. Điều này đặc biệt hữu ích để tăng tốc độ truyền dữ liệu từ xa. Tuy nhiên, nó có thể chậm hơn so với `num_threads=0` đối với dữ liệu cục bộ trên các ổ đĩa nhanh.

Nếu bạn không quan tâm đến các hình ảnh được giải mã dưới dạng mảng NumPy và muốn truy cập đường dẫn/bộ nhớ đệm (bytes) thay vào đó, bạn có thể tắt việc giải mã:

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

Lưu ý: [IterableDataset.decode()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.IterableDataset.decode) hiện chỉ khả dụng cho các bộ dữ liệu dạng streaming.

