Đây là hướng dẫn đồng hành với Làm việc với wav2vec2 Phần 1 - Tinh chỉnh XLS-R để nhận dạng giọng nói tự động ("hướng dẫn Phần 1"). Tôi đã viết hướng dẫn Phần 1 về cách tinh chỉnh mô hình wav2vec2 XLS-R ("XLS-R") của Meta AI bằng tiếng Tây Ban Nha ở Chile. Giả định rằng bạn đã hoàn thành hướng dẫn đó và đã tạo mô hình XLS-R được tinh chỉnh của riêng mình. Hướng dẫn này sẽ giải thích các bước để chạy suy luận trên mô hình XLS-R đã được tinh chỉnh của bạn thông qua Kaggle Notebook .
Để hoàn thành hướng dẫn, bạn sẽ cần phải có:
spanish-asr-inference
.Hướng dẫn này sử dụng Tập dữ liệu giọng nói tiếng Tây Ban Nha Peru làm nguồn dữ liệu thử nghiệm. Giống như Tập dữ liệu giọng nói tiếng Tây Ban Nha ở Chile , tập dữ liệu của người nói tiếng Peru cũng bao gồm hai tập dữ liệu phụ: 2.918 bản ghi âm của nam giới nói tiếng Peru và 2.529 bản ghi âm của nữ giới nói tiếng Peru.
Tập dữ liệu này đã được tải lên Kaggle dưới dạng 2 tập dữ liệu riêng biệt:
Thêm cả hai bộ dữ liệu này vào Sổ tay Kaggle của bạn bằng cách nhấp vào Thêm đầu vào .
Bạn nên lưu mô hình đã tinh chỉnh của mình trong Bước 4 của Hướng dẫn Làm việc với wav2vec2 Phần 1 - Tinh chỉnh XLS-R cho Nhận dạng giọng nói tự động dưới dạng Mô hình Kaggle .
Thêm mô hình đã được tinh chỉnh vào Kaggle Notebook của bạn bằng cách nhấp vào Thêm đầu vào .
16 bước phụ sau đây sẽ sắp xếp từng ô trong số 16 ô của sổ ghi chép suy luận theo thứ tự. Bạn sẽ nhận thấy rằng nhiều phương pháp hữu ích tương tự trong hướng dẫn Phần 1 cũng được sử dụng ở đây.
Ô đầu tiên của sổ ghi chép suy luận sẽ cài đặt các phần phụ thuộc. Đặt ô đầu tiên thành:
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
Việc nhập ô thứ hai yêu cầu các gói Python. Đặt ô thứ hai thành:
### CELL 2: Import Python packages ### import re import math import random import pandas as pd import torchaudio from datasets import load_metric from transformers import pipeline
Ô thứ ba nhập số liệu đánh giá HuggingFace WER. Đặt ô thứ ba thành:
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
Ô thứ tư đặt các hằng số sẽ được sử dụng trong toàn bộ sổ ghi chép. Đặt ô thứ tư thành:
### CELL 4: Constants ### # Testing data TEST_DATA_PATH_MALE = "/kaggle/input/google-spanish-speakers-peru-male/" TEST_DATA_PATH_FEMALE = "/kaggle/input/google-spanish-speakers-peru-female/" EXT = ".wav" NUM_LOAD_FROM_EACH_SET = 3 # Special characters SPECIAL_CHARS = r"[\d\,\-\;\!\¡\?\¿\।\'\'\"\–\'\:\/\.\“\”\৷\…\‚\॥\\]" # Sampling rates ORIG_SAMPLING_RATE = 48000 TGT_SAMPLING_RATE = 16000
Ô thứ năm xác định các phương thức tiện ích để đọc các tệp chỉ mục tập dữ liệu, cũng như để làm sạch văn bản phiên âm và tạo một tập hợp mẫu ngẫu nhiên từ dữ liệu thử nghiệm. Đặt ô thứ năm thành:
### CELL 5: Utility methods for reading index files, cleaning text, random indices generator ### def read_index_file_data(path: str, filename: str): data = [] with open(path + filename, "r", encoding = "utf8") as f: lines = f.readlines() for line in lines: file_and_text = line.split("\t") data.append([path + file_and_text[0] + EXT, file_and_text[1].replace("\n", "")]) return data def clean_text(text: str) -> str: cleaned_text = re.sub(SPECIAL_CHARS, "", text) cleaned_text = cleaned_text.lower() return cleaned_text def get_random_samples(dataset: list, num: int) -> list: used = [] samples = [] for i in range(num): a = -1 while a == -1 or a in used: a = math.floor(len(dataset) * random.random()) samples.append(dataset[a]) used.append(a) return samples
Phương thức read_index_file_data
đọc tệp chỉ mục tập dữ liệu line_index.tsv
và tạo danh sách các danh sách có tên tệp âm thanh và dữ liệu phiên âm, ví dụ:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
clean_text
được sử dụng để loại bỏ từng phiên âm văn bản của các ký tự được chỉ định bởi biểu thức chính quy được gán cho SPECIAL_CHARS
trong Bước 2.4 . Những ký tự này, bao gồm cả dấu câu, có thể bị loại bỏ vì chúng không cung cấp bất kỳ giá trị ngữ nghĩa nào khi đào tạo mô hình để tìm hiểu ánh xạ giữa các tính năng âm thanh và bản chép lời văn bản.get_random_samples
trả về một tập hợp các mẫu thử nghiệm ngẫu nhiên với số lượng được đặt theo hằng số NUM_LOAD_FROM_EACH_SET
trong Bước 2.4 . Ô thứ sáu xác định các phương thức tiện ích sử dụng torchaudio
để tải và lấy mẫu lại dữ liệu âm thanh. Đặt ô thứ sáu thành:
### CELL 7: Utility methods for loading and resampling audio data ### def read_audio_data(file): speech_array, sampling_rate = torchaudio.load(file, normalize = True) return speech_array, sampling_rate def resample(waveform): transform = torchaudio.transforms.Resample(ORIG_SAMPLING_RATE, TGT_SAMPLING_RATE) waveform = transform(waveform) return waveform[0]
read_audio_data
tải một tệp âm thanh được chỉ định và trả về một ma trận đa chiều torch.Tensor
của dữ liệu âm thanh cùng với tốc độ lấy mẫu của âm thanh. Tất cả các tệp âm thanh trong dữ liệu huấn luyện đều có tốc độ lấy mẫu là 48000
Hz. Tốc độ lấy mẫu "gốc" này được ghi lại bằng hằng số ORIG_SAMPLING_RATE
trong Bước 2.4 .resample
được sử dụng để giảm tốc độ lấy mẫu dữ liệu âm thanh từ tốc độ lấy mẫu là 48000
xuống tốc độ lấy mẫu mục tiêu là 16000
. Ô thứ bảy đọc các tệp chỉ mục dữ liệu thử nghiệm cho bản ghi âm của loa nam và bản ghi âm của loa nữ bằng phương pháp read_index_file_data
được xác định trong Bước 2.5 . Đặt ô thứ bảy thành:
### CELL 7: Read test data ### test_data_male = read_index_file_data(TEST_DATA_PATH_MALE, "line_index.tsv") test_data_female = read_index_file_data(TEST_DATA_PATH_FEMALE, "line_index.tsv")
Ô thứ tám tạo các tập hợp mẫu thử nghiệm ngẫu nhiên bằng phương pháp get_random_samples
được xác định ở Bước 2.5 . Đặt ô thứ tám thành:
### CELL 8: Generate lists of random test samples ### random_test_samples_male = get_random_samples(test_data_male, NUM_LOAD_FROM_EACH_SET) random_test_samples_female = get_random_samples(test_data_female, NUM_LOAD_FROM_EACH_SET)
Ô thứ chín kết hợp các mẫu thử nghiệm nam và mẫu thử nghiệm nữ thành một danh sách duy nhất. Đặt ô thứ chín thành:
### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female
Ô thứ mười lặp lại từng mẫu dữ liệu thử nghiệm và xóa văn bản phiên mã liên quan bằng phương pháp clean_text
được xác định trong Bước 2.5 . Đặt ô thứ mười thành:
### CELL 10: Clean text transcriptions ### for index in range(len(all_test_samples)): all_test_samples[index][1] = clean_text(all_test_samples[index][1])
Ô thứ 11 tải từng tệp âm thanh được chỉ định trong danh sách all_test_samples
. Đặt ô thứ mười một thành:
### CELL 11: Load audio data ### all_test_data = [] for index in range(len(all_test_samples)): speech_array, sampling_rate = read_audio_data(all_test_samples[index][0]) all_test_data.append({ "raw": speech_array, "sampling_rate": sampling_rate, "target_text": all_test_samples[index][1] })
torch.Tensor
và được lưu trữ trong all_test_data
dưới dạng danh sách từ điển. Mỗi từ điển chứa dữ liệu âm thanh cho một mẫu cụ thể, tốc độ lấy mẫu và bản phiên âm văn bản của âm thanh. Ô thứ mười hai lấy mẫu lại dữ liệu âm thanh theo tốc độ lấy mẫu mục tiêu là 16000
. Đặt ô thứ mười hai thành:
### CELL 12: Resample audio data and cast to NumPy arrays ### all_test_data = [{"raw": resample(sample["raw"]).numpy(), "sampling_rate": TGT_SAMPLING_RATE, "target_text": sample["target_text"]} for sample in all_test_data]
Ô thứ mười ba khởi tạo một phiên bản của lớp pipeline
thư viện transformer
HuggingFace. Đặt ô thứ mười ba thành:
### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")
Tham số model
phải được đặt thành đường dẫn đến mô hình đã tinh chỉnh của bạn được thêm vào Sổ tay Kaggle ở Bước 1.3 , ví dụ:
transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")
Ô thứ mười bốn gọi trình transcriber
được khởi tạo ở bước trước trên dữ liệu thử nghiệm để tạo dự đoán văn bản. Đặt ô thứ mười bốn thành:
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
Ô thứ mười lăm tính điểm WER cho mỗi dự đoán cũng như điểm WER tổng thể cho tất cả các dự đoán. Đặt ô thứ mười lăm thành:
### CELL 15: Calculate WER metrics ### predictions = [transcription["text"] for transcription in transcriptions] references = [transcription["target_text"][0] for transcription in transcriptions] wers = [] for p in range(len(predictions)): wer = wer_metric.compute(predictions = [predictions[p]], references = [references[p]]) wers.append(wer) zipped = list(zip(predictions, references, wers)) df = pd.DataFrame(zipped, columns=["Prediction", "Reference", "WER"]) wer = wer_metric.compute(predictions = predictions, references = references)
Ô thứ mười sáu và ô cuối cùng chỉ in các phép tính WER từ bước trước. Đặt ô thứ mười sáu thành:
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
Vì sổ ghi chép tạo ra các dự đoán trên các mẫu dữ liệu thử nghiệm ngẫu nhiên nên kết quả đầu ra sẽ thay đổi mỗi lần sổ ghi chép được chạy. Kết quả đầu ra sau đây được tạo khi chạy sổ ghi chép với NUM_LOAD_FROM_EACH_SET
được đặt thành 3
cho tổng số 6 mẫu thử nghiệm:
Overall WER: 0.013888888888888888 Prediction \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de setiembre Reference \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de septiembre WER 0 0.000000 1 0.000000 2 0.000000 3 0.000000 4 0.000000 5 0.090909
Có thể thấy, người mẫu đã làm rất tốt! Nó chỉ mắc một lỗi với mẫu thứ sáu (chỉ số 5
), viết sai chính tả từ septiembre
thành setiembre
. Tất nhiên, việc chạy lại sổ ghi chép với các mẫu thử nghiệm khác nhau và quan trọng hơn là số lượng mẫu thử nghiệm lớn hơn sẽ tạo ra các kết quả khác nhau và nhiều thông tin hơn. Tuy nhiên, dữ liệu hạn chế này cho thấy mô hình có thể hoạt động tốt trên các phương ngữ khác nhau của tiếng Tây Ban Nha - tức là nó được đào tạo bằng tiếng Tây Ban Nha ở Chile nhưng dường như hoạt động tốt bằng tiếng Tây Ban Nha ở Peru.
Nếu bạn mới học cách làm việc với các mô hình wav2vec2, tôi hy vọng rằng hướng dẫn Làm việc với wav2vec2 Phần 1 - Tinh chỉnh XLS-R để nhận dạng giọng nói tự động và hướng dẫn này hữu ích cho bạn. Như đã đề cập, mô hình tinh chỉnh do hướng dẫn Phần 1 tạo ra không hoàn toàn hiện đại nhưng vẫn tỏ ra hữu ích cho nhiều ứng dụng. Chúc tòa nhà vui vẻ!