Это сопутствующее руководство по работе с wav2vec2. Часть 1. Точная настройка XLS-R для автоматического распознавания речи («Руководство по части 1»). Я написал руководство Части 1 о том, как точно настроить модель Meta AI wav2vec2 XLS-R («XLS-R») на чилийском испанском языке. Предполагается, что вы выполнили это руководство и создали собственную настроенную модель XLS-R. В этом руководстве будут описаны шаги по выполнению вывода на вашей точно настроенной модели XLS-R с помощью Kaggle Notebook .
Для завершения руководства вам потребуется:
spanish-asr-inference
.В этом руководстве в качестве источника тестовых данных используется набор данных перуанской испанской речи . Как и набор данных о чилийской испанской речи , набор данных о говорящих на перуанском языке также состоит из двух поднаборов данных: 2918 записей мужчин, говорящих на перуанском языке, и 2529 записей женщин, говорящих на перуанском языке.
Этот набор данных был загружен в Kaggle как два отдельных набора данных:
Добавьте оба этих набора данных в свой блокнот Kaggle, нажав « Добавить ввод» .
Вы должны были сохранить свою точно настроенную модель на шаге 4 руководства «Работа с wav2vec2, часть 1 — точная настройка XLS-R для автоматического распознавания речи» как модель Kaggle .
Добавьте свою настроенную модель в свой блокнот Kaggle, нажав « Добавить входные данные» .
Следующие 16 подэтапов строят каждую из 16 ячеек блокнота вывода по порядку. Вы заметите, что здесь используются многие из тех же служебных методов из руководства, часть 1.
Первая ячейка блокнота вывода устанавливает зависимости. Установите первую ячейку:
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
Вторая ячейка импортирует необходимые пакеты Python. Установите вторую ячейку:
### 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
Третья ячейка импортирует метрику оценки HuggingFace WER. Установите третью ячейку на:
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
Четвертая ячейка задает константы, которые будут использоваться во всем блокноте. Установите четвертую ячейку:
### 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
Пятая ячейка определяет служебные методы для чтения индексных файлов набора данных, а также для очистки текста транскрипции и генерации случайного набора выборок из тестовых данных. Установите пятую ячейку на:
### 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
Метод read_index_file_data
считывает индексный файл набора данных line_index.tsv
и создает список списков с именем аудиофайла и данными транскрипции, например:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
clean_text
используется для удаления каждой текстовой транскрипции символов, указанных в регулярном выражении, присвоенном SPECIAL_CHARS
на шаге 2.4 . Эти символы, включая знаки препинания, можно исключить, поскольку они не несут никакой семантической ценности при обучении модели изучению сопоставлений между звуковыми функциями и транскрипцией текста.get_random_samples
возвращает набор случайных тестовых выборок с количеством, заданным константой NUM_LOAD_FROM_EACH_SET
на шаге 2.4 . Шестая ячейка определяет служебные методы, использующие torchaudio
для загрузки и повторной выборки аудиоданных. Установите шестую ячейку на:
### 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
загружает указанный аудиофайл и возвращает многомерную матрицу torch.Tensor
аудиоданных вместе с частотой дискретизации аудио. Все аудиофайлы в обучающих данных имеют частоту дискретизации 48000
Гц. Эта «исходная» частота дискретизации фиксируется константой ORIG_SAMPLING_RATE
на шаге 2.4 .resample
используется для понижения частоты дискретизации аудиоданных с частоты дискретизации 48000
до целевой частоты дискретизации 16000
. Седьмая ячейка считывает индексные файлы тестовых данных для записей выступающих мужчин и записей говорящих женщин с использованием метода read_index_file_data
определенного на шаге 2.5 . Установите седьмую ячейку:
### 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")
Восьмая ячейка генерирует наборы случайных тестовых выборок с использованием метода get_random_samples
определенного на шаге 2.5 . Установите восьмую ячейку:
### 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)
Девятая ячейка объединяет тестовые образцы мужского и женского пола в единый список. Установите девятую ячейку на:
### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female
Десятая ячейка перебирает каждый образец тестовых данных и очищает связанный текст транскрипции с помощью метода clean_text
определенного на шаге 2.5 . Установите десятую ячейку:
### 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])
Одиннадцатая ячейка загружает каждый аудиофайл, указанный в списке all_test_samples
. Установите одиннадцатую ячейку на:
### 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
и сохраняются в all_test_data
в виде списка словарей. Каждый словарь содержит аудиоданные для определенного семпла, частоту дискретизации и текстовую транскрипцию аудио. Двенадцатая ячейка выполняет повторную дискретизацию аудиоданных до целевой частоты дискретизации 16000
. Установите двенадцатую ячейку на:
### 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]
Тринадцатая ячейка инициализирует экземпляр класса pipeline
библиотеки transformer
HuggingFace. Установите тринадцатую ячейку на:
### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")
В качестве параметра model
необходимо указать путь к вашей настроенной модели, добавленной в блокнот Kaggle на шаге 1.3 , например:
transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")
Четырнадцатая ячейка вызывает transcriber
, инициализированный на предыдущем этапе на тестовых данных, для генерации текстовых прогнозов. Установите четырнадцатую ячейку на:
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
Пятнадцатая ячейка вычисляет баллы WER для каждого прогноза, а также общий балл WER для всех прогнозов. Установите пятнадцатую ячейку на:
### 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)
В шестнадцатой и последней ячейке просто печатаются расчеты WER, полученные на предыдущем шаге. Установите шестнадцатую ячейку на:
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
Поскольку блокнот генерирует прогнозы на основе случайных выборок тестовых данных, выходные данные будут меняться при каждом запуске блокнота. Следующие выходные данные были созданы при запуске блокнота с NUM_LOAD_FROM_EACH_SET
, установленным на 3
, всего для 6 тестовых образцов:
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
Как видно, модель справилась со своей задачей на отлично! Он допустил только одну ошибку в шестом образце (индекс 5
), неправильно написав слово septiembre
как setiembre
. Конечно, повторный запуск ноутбука с другими тестовыми образцами и, что более важно, с большим количеством тестовых образцов даст другие и более информативные результаты. Тем не менее, эти ограниченные данные позволяют предположить, что модель может хорошо работать на разных диалектах испанского языка — то есть она была обучена на чилийском испанском языке, но, похоже, хорошо работает на перуанском испанском языке.
Если вы только учитесь работать с моделями wav2vec2, я надеюсь, что руководство «Работа с wav2vec2, часть 1 — точная настройка XLS-R для автоматического распознавания речи» и это руководство были для вас полезны. Как уже упоминалось, уточненная модель, созданная в руководстве Части 1, не совсем современна, но все же должна оказаться полезной для многих приложений. Приятного строительства!