paint-brush
Làm việc với wav2vec2 Phần 2 - Chạy suy luận trên các mô hình ASR đã được tinh chỉnhtừ tác giả@pictureinthenoise
521 lượt đọc
521 lượt đọc

Làm việc với wav2vec2 Phần 2 - Chạy suy luận trên các mô hình ASR đã được tinh chỉnh

từ tác giả Picture in the Noise11m2024/05/07
Read on Terminal Reader

dài quá đọc không nổi

Hướng dẫn đồng hành này giải thích các bước để chạy suy luận trên mô hình wav2vec2 XLS-R đã được tinh chỉnh. Nó bổ sung cho 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". Hướng dẫn này cung cấp hướng dẫn từng bước về cách tạo Sổ tay Kaggle có thể được sử dụng để chạy suy luận.
featured image - Làm việc với wav2vec2 Phần 2 - Chạy suy luận trên các mô hình ASR đã được tinh chỉnh
Picture in the Noise HackerNoon profile picture
0-item
1-item

Giới thiệu

Đâ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 .

Điều kiện tiên quyết và trước khi bạn bắt đầu

Để hoàn thành hướng dẫn, bạn sẽ cần phải có:


  • Mẫu XLS-R đã được tinh chỉnh cho tiếng Tây Ban Nha.
  • Một tài khoản Kaggle hiện có.
  • Kiến thức trung cấp về Python.
  • Kiến thức trung cấp về làm việc với Kaggle Notebooks.
  • Kiến thức trung cấp về các khái niệm ML.
  • Kiến thức cơ bản về các khái niệm ASR.

Xây dựng sổ ghi chép suy luận

Bước 1 - Thiết lập môi trường Kaggle của bạn

Bước 1.1 - Tạo sổ tay Kaggle mới

  1. Đăng nhập vào Kaggle.
  2. Tạo Sổ tay Kaggle mới.
  3. Tên sổ ghi chép có thể thay đổi theo ý muốn. Hướng dẫn này sử dụng tên sổ ghi chép spanish-asr-inference .

Bước 1.2 - Thêm bộ dữ liệu thử nghiệm

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ước 1.3 - Thêm mô hình đã tinh chỉnh

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 .

Bước 2 - Xây dựng sổ ghi chép suy luận

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.

Bước 2.1 - Ô 1: Cài đặt gói

Ô đầ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

Bước 2.2 - Ô 2: Nhập gói Python

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

Bước 2.3 - Ô 3: Đang tải số liệu WER

Ô 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")


  • WER sẽ được sử dụng để đo lường hiệu suất của mô hình được tinh chỉnh trên dữ liệu thử nghiệm.

Bước 2.4 - Ô 4: Đặt hằng số

Ô 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

Bước 2.5 - Ô 5: Các phương pháp tiện ích để đọc tệp chỉ mục, làm sạch văn bản và tạo từ vựng

Ô 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"] ... ]


  • Phương thức 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.
  • Phương thức 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 .

Bước 2.6 - CELL 6: Các phương pháp tiện ích để tải và lấy mẫu lại dữ liệu âm thanh

Ô 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]


  • Phương thức 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 .
  • Phương pháp 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 .

Bước 2.7 - Ô 7: Đọc dữ liệu kiểm tra

Ô 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")

Bước 2.8 - Ô 8: Tạo danh sách các mẫu thử nghiệm ngẫu nhiên

Ô 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)

Bước 2.9 - Ô 9: Kết hợp dữ liệu thử nghiệm

Ô 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

Bước 2.10 - CELL 10: Kiểm tra phiên mã sạch

Ô 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])

Bước 2.11 - Ô 11: Đang tải dữ liệu âm thanh

Ô 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] })


  • Dữ liệu âm thanh được trả về dưới dạng 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.

Bước 2.12 - Ô 12: Lấy mẫu lại dữ liệu â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]

Bước 2.13 - CELL 13: Khởi tạo phiên bản của đường dẫn nhận dạng giọng nói tự động

Ô 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")

Bước 2.14 - Ô 14: Tạo dự đoán

Ô 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)

Bước 2.15 - Ô 15: Tính chỉ số WER

Ô 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)

Bước 2.16 - Ô 16: In số liệu WER

Ô 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)

Phân tích WER

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.

Phần kết luận

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ẻ!