Transformers documentation
Phân loại âm thanh
Phân loại âm thanh
Phân loại âm thanh - giống như với văn bản - gán một nhãn lớp làm đầu ra từ dữ liệu đầu vào. Điểm khác biệt duy nhất là thay vì đầu vào văn bản, bạn có các dạng sóng âm thanh thô. Một số ứng dụng thực tế của phân loại âm thanh bao gồm xác định ý định của người nói, phân loại ngôn ngữ, và thậm chí là xác định loài động vật qua âm thanh của chúng.
Hướng dẫn này sẽ cho bạn thấy cách:
- Tinh chỉnh Wav2Vec2 trên bộ dữ liệu MInDS-14 để phân loại ý định của người nói.
- Sử dụng mô hình đã tinh chỉnh của bạn để suy luận.
Để xem tất cả các kiến trúc và checkpoint tương thích với tác vụ này, chúng tôi khuyến nghị bạn kiểm tra trang tác vụ
Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt tất cả các thư viện cần thiết:
pip install transformers datasets evaluate soundfile librosa torchcodec
Chúng tôi khuyến khích bạn đăng nhập vào tài khoản Hugging Face của mình để có thể tải lên và chia sẻ mô hình của bạn với cộng đồng. Khi được yêu cầu, hãy nhập token của bạn để đăng nhập:
>>> from huggingface_hub import notebook_login
>>> notebook_login()Tải bộ dữ liệu MInDS-14
Bắt đầu bằng cách tải bộ dữ liệu MInDS-14 từ thư viện 🤗 Datasets:
>>> from datasets import load_dataset, Audio
>>> minds = load_dataset("PolyAI/minds14", name="en-US", split="train")Tách split train của bộ dữ liệu thành tập train và test nhỏ hơn bằng phương thức train_test_split. Điều này sẽ cho bạn cơ hội thử nghiệm và đảm bảo mọi thứ hoạt động trước khi dành thêm thời gian cho toàn bộ bộ dữ liệu.
>>> minds = minds.train_test_split(test_size=0.2)Sau đó, hãy xem xét bộ dữ liệu:
>>> minds
DatasetDict({
train: Dataset({
features: ['path', 'audio', 'transcription', 'english_transcription', 'intent_class', 'lang_id'],
num_rows: 450
})
test: Dataset({
features: ['path', 'audio', 'transcription', 'english_transcription', 'intent_class', 'lang_id'],
num_rows: 113
})
})Mặc dù tập dữ liệu chứa nhiều thông tin hữu ích, chẳng hạn như lang_id và english_transcription, bạn sẽ tập trung vào audio và intent_class trong hướng dẫn này. Hãy xóa các cột còn lại bằng phương thức remove_columns:
>>> minds = minds.remove_columns(["path", "transcription", "english_transcription", "lang_id"])Dưới đây là một ví dụ:
>>> minds["train"][0]
{'audio': {'array': array([ 0. , 0. , 0. , ..., -0.00048828,
-0.00024414, -0.00024414], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~APP_ERROR/602b9a5fbb1e6d0fbce91f52.wav',
'sampling_rate': 8000},
'intent_class': 2}Có hai trường:
audio: mộtarraymột chiều của tín hiệu giọng nói, phải được gọi để tải và lấy mẫu lại tệp âm thanh.intent_class: đại diện cho id lớp của ý định người nói.
Để giúp mô hình dễ dàng lấy tên nhãn từ id nhãn, hãy tạo một từ điển ánh xạ tên nhãn sang số nguyên và ngược lại:
>>> labels = minds["train"].features["intent_class"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
... label2id[label] = str(i)
... id2label[str(i)] = labelBây giờ bạn có thể chuyển đổi id nhãn thành tên nhãn:
>>> id2label[str(2)]
'app_error'Tiền xử lý
Bước tiếp theo là nạp trình trích xuất đặc trưng Wav2Vec2 để xử lý tín hiệu âm thanh:
>>> from transformers import AutoFeatureExtractor
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")Bộ dữ liệu MInDS-14 có tần số lấy mẫu là 8kHz (bạn có thể tìm thấy thông tin này trong thẻ dữ liệu), điều này có nghĩa là bạn sẽ cần lấy mẫu lại bộ dữ liệu lên 16kHz để sử dụng mô hình Wav2Vec2 được huấn luyện trước:
>>> minds = minds.cast_column("audio", Audio(sampling_rate=16_000))
>>> minds["train"][0]
{'audio': {'array': array([ 2.2098757e-05, 4.6582241e-05, -2.2803260e-05, ...,
-2.8419291e-04, -2.3305941e-04, -1.1425107e-04], dtype=float32),
'path': '/root/.cache/huggingface/datasets/downloads/extracted/f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-US~APP_ERROR/602b9a5fbb1e6d0fbce91f52.wav',
'sampling_rate': 16000},
'intent_class': 2}Bây giờ hãy tạo một hàm tiền xử lý mà:
- Gọi cột
audiođể tải, và nếu cần, lấy lại mẫu (resample) tệp âm thanh. - Kiểm tra xem tần số lấy mẫu của tệp âm thanh có khớp với tần số lấy mẫu của dữ liệu âm thanh mà mô hình đã được tiền huấn luyện hay không. Bạn có thể tìm thông tin này trong model card của Wav2Vec2.
- Đặt độ dài đầu vào tối đa để nhóm các đầu vào dài hơn mà không cắt ngắn chúng.
>>> def preprocess_function(examples):
... audio_arrays = [x["array"] for x in examples["audio"]]
... inputs = feature_extractor(
... audio_arrays, sampling_rate=feature_extractor.sampling_rate, max_length=16000, truncation=True
... )
... return inputsĐể áp dụng hàm tiền xử lý lên toàn bộ bộ dữ liệu, hãy sử dụng hàm map của 🤗 Datasets. Bạn có thể tăng tốc map bằng cách đặt batched=True để xử lý nhiều phần tử của bộ dữ liệu cùng lúc. Xóa các cột không cần thiết và đổi tên intent_class thành label, như yêu cầu của mô hình:
>>> encoded_minds = minds.map(preprocess_function, remove_columns="audio", batched=True)
>>> encoded_minds = encoded_minds.rename_column("intent_class", "label")Đánh giá
Việc đưa một chỉ số vào trong quá trình huấn luyện thường hữu ích để đánh giá hiệu suất của mô hình. Bạn có thể nhanh chóng tải một phương pháp đánh giá bằng thư viện 🤗 Evaluate. Đối với tác vụ này, hãy tải chỉ số accuracy (xem quick tour của 🤗 Evaluate để tìm hiểu thêm về cách tải và tính toán một chỉ số):
>>> import evaluate
>>> accuracy = evaluate.load("accuracy")Sau đó, tạo một hàm truyền các dự đoán và nhãn của bạn vào compute để tính độ chính xác:
>>> import numpy as np
>>> def compute_metrics(eval_pred):
... predictions = np.argmax(eval_pred.predictions, axis=1)
... return accuracy.compute(predictions=predictions, references=eval_pred.label_ids)Hàm compute_metrics của bạn đã sẵn sàng, và bạn sẽ quay lại với nó khi thiết lập quá trình huấn luyện.
Huấn luyện
Nếu bạn chưa quen với việc tinh chỉnh mô hình bằng Trainer, hãy xem hướng dẫn cơ bản tại đây!
Bạn đã sẵn sàng để bắt đầu huấn luyện mô hình của mình! Hãy nạp Wav2Vec2 bằng AutoModelForAudioClassification cùng với số nhãn dự kiến và các ánh xạ nhãn:
>>> from transformers import AutoModelForAudioClassification, TrainingArguments, Trainer
>>> num_labels = len(id2label)
>>> model = AutoModelForAudioClassification.from_pretrained(
... "facebook/wav2vec2-base", num_labels=num_labels, label2id=label2id, id2label=id2label
... )Tới bước này, chỉ còn ba bước nữa:
- Định nghĩa các siêu tham số huấn luyện của bạn trong TrainingArguments. Tham số bắt buộc duy nhất là
output_dir, chỉ định nơi lưu trữ mô hình của bạn. Bạn sẽ đẩy mô hình này lên Hub bằng cách đặtpush_to_hub=True(bạn cần đăng nhập vào Hugging Face để tải lên mô hình của mình). Vào cuối mỗi epoch, Trainer sẽ đánh giá độ chính xác và lưu checkpoint huấn luyện. - Truyền các đối số huấn luyện vào Trainer cùng với mô hình, tập dữ liệu, tokenizer, data collator và hàm
compute_metrics. - Gọi train() để tinh chỉnh mô hình của bạn.
>>> training_args = TrainingArguments(
... output_dir="my_awesome_mind_model",
... eval_strategy="epoch",
... save_strategy="epoch",
... learning_rate=3e-5,
... per_device_train_batch_size=32,
... gradient_accumulation_steps=4,
... per_device_eval_batch_size=32,
... num_train_epochs=10,
... warmup_steps=0.1,
... logging_steps=10,
... load_best_model_at_end=True,
... metric_for_best_model="accuracy",
... push_to_hub=True,
... report_to="trackio",
... )
>>> trainer = Trainer(
... model=model,
... args=training_args,
... train_dataset=encoded_minds["train"],
... eval_dataset=encoded_minds["test"],
... processing_class=feature_extractor,
... compute_metrics=compute_metrics,
... )
>>> trainer.train()Khi quá trình huấn luyện hoàn tất, hãy chia sẻ mô hình của bạn lên Hub bằng phương thức push_to_hub() để mọi người có thể sử dụng mô hình của bạn:
>>> trainer.push_to_hub()Để xem một ví dụ chi tiết hơn về cách tinh chỉnh mô hình cho phân loại âm thanh, hãy xem notebook PyTorch tương ứng.
Suy luận
Tuyệt, giờ đây bạn đã tinh chỉnh xong một mô hình, bạn có thể sử dụng nó để suy luận!
Tải tệp âm thanh để suy luận. Hãy nhớ lấy mẫu lại tần số lấy mẫu của tệp âm thanh cho khớp với tần số lấy mẫu của mô hình, nếu cần.
>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("PolyAI/minds14", name="en-US", split="train")
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
>>> sampling_rate = dataset.features["audio"].sampling_rate
>>> audio_file = dataset[0]["audio"]["path"]Cách đơn giản nhất để thử nghiệm mô hình đã tinh chỉnh của bạn cho suy luận là sử dụng nó trong một pipeline(). Khởi tạo một pipeline cho phân loại âm thanh với mô hình của bạn, và truyền tệp âm thanh của bạn vào đó:
>>> from transformers import pipeline
>>> classifier = pipeline("audio-classification", model="stevhliu/my_awesome_minds_model")
>>> classifier(audio_file)
[
{'score': 0.09766869246959686, 'label': 'cash_deposit'},
{'score': 0.07998877018690109, 'label': 'app_error'},
{'score': 0.0781070664525032, 'label': 'joint_account'},
{'score': 0.07667109370231628, 'label': 'pay_bill'},
{'score': 0.0755252093076706, 'label': 'balance'}
]Bạn cũng có thể tự động tái tạo kết quả của pipeline nếu muốn:
Tải bộ trích xuất đặc trưng để tiền xử lý tệp âm thanh và trả về input dưới dạng tensor PyTorch:
>>> from transformers import AutoFeatureExtractor
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("stevhliu/my_awesome_minds_model")
>>> inputs = feature_extractor(dataset[0]["audio"]["array"], sampling_rate=sampling_rate, return_tensors="pt")Truyền các đầu vào của bạn vào mô hình và trả về logits:
>>> from transformers import AutoModelForAudioClassification
>>> model = AutoModelForAudioClassification.from_pretrained("stevhliu/my_awesome_minds_model")
>>> with torch.no_grad():
... logits = model(**inputs).logitsLấy lớp có xác suất cao nhất và sử dụng ánh xạ id2label của mô hình để chuyển đổi nó thành nhãn:
>>> import torch
>>> predicted_class_ids = torch.argmax(logits).item()
>>> predicted_label = model.config.id2label[predicted_class_ids]
>>> predicted_label
'cash_deposit'