paint-brush
Работа с wav2vec2. Часть 2. Выполнение вывода на точно настроенных моделях ASRк@pictureinthenoise
469 чтения
469 чтения

Работа с wav2vec2. Часть 2. Выполнение вывода на точно настроенных моделях ASR

к Picture in the Noise11m2024/05/07
Read on Terminal Reader

Слишком долго; Читать

В этом сопутствующем руководстве объясняются шаги по выполнению вывода на точно настроенной модели wav2vec2 XLS-R. Он дополняет руководство «Работа с wav2vec2. Часть 1. Точная настройка XLS-R для автоматического распознавания речи». В руководстве представлены пошаговые инструкции по созданию блокнота Kaggle, который можно использовать для выполнения логических выводов.
featured image - Работа с wav2vec2. Часть 2. Выполнение вывода на точно настроенных моделях ASR
Picture in the Noise HackerNoon profile picture
0-item
1-item

Введение

Это сопутствующее руководство по работе с wav2vec2. Часть 1. Точная настройка XLS-R для автоматического распознавания речи («Руководство по части 1»). Я написал руководство Части 1 о том, как точно настроить модель Meta AI wav2vec2 XLS-R («XLS-R») на чилийском испанском языке. Предполагается, что вы выполнили это руководство и создали собственную настроенную модель XLS-R. В этом руководстве будут описаны шаги по выполнению вывода на вашей точно настроенной модели XLS-R с помощью Kaggle Notebook .

Предварительные условия и перед началом работы

Для завершения руководства вам потребуется:


  • Точно настроенная модель XLS-R для испанского языка.
  • Существующая учетная запись Kaggle .
  • Среднее знание Python.
  • Умение работать с Kaggle Notebooks на среднем уровне.
  • Среднее знание концепций ML.
  • Базовые знания концепций ASR.

Создание блокнота для вывода

Шаг 1. Настройка среды Kaggle

Шаг 1.1 — Создание нового блокнота Kaggle

  1. Войдите в Каггл.
  2. Создайте новый блокнот Kaggle.
  3. Название блокнота можно изменить по желанию. В этом руководстве используется имя записной книжки spanish-asr-inference .

Шаг 1.2. Добавление наборов тестовых данных

В этом руководстве в качестве источника тестовых данных используется набор данных перуанской испанской речи . Как и набор данных о чилийской испанской речи , набор данных о говорящих на перуанском языке также состоит из двух поднаборов данных: 2918 записей мужчин, говорящих на перуанском языке, и 2529 записей женщин, говорящих на перуанском языке.


Этот набор данных был загружен в Kaggle как два отдельных набора данных:


Добавьте оба этих набора данных в свой блокнот Kaggle, нажав « Добавить ввод» .

Шаг 1.3 — Добавление точно настроенной модели

Вы должны были сохранить свою точно настроенную модель на шаге 4 руководства «Работа с wav2vec2, часть 1 — точная настройка XLS-R для автоматического распознавания речи» как модель Kaggle .


Добавьте свою настроенную модель в свой блокнот Kaggle, нажав « Добавить входные данные» .

Шаг 2. Создание блокнота для вывода

Следующие 16 подэтапов строят каждую из 16 ячеек блокнота вывода по порядку. Вы заметите, что здесь используются многие из тех же служебных методов из руководства, часть 1.

Шаг 2.1. ЯЧЕЙКА 1. Установка пакетов.

Первая ячейка блокнота вывода устанавливает зависимости. Установите первую ячейку:


 ### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer

Шаг 2.2. ЯЧЕЙКА 2. Импорт пакетов Python

Вторая ячейка импортирует необходимые пакеты 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

Шаг 2.3. ЯЧЕЙКА 3. Загрузка метрики WER

Третья ячейка импортирует метрику оценки HuggingFace WER. Установите третью ячейку на:


 ### CELL 3: Load WER metric ### wer_metric = load_metric("wer")


  • WER будет использоваться для измерения производительности точно настроенной модели на тестовых данных.

Шаг 2.4 — ЯЧЕЙКА 4: Установка констант

Четвертая ячейка задает константы, которые будут использоваться во всем блокноте. Установите четвертую ячейку:


 ### 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

Шаг 2.5. ЯЧЕЙКА 5. Служебные методы для чтения индексных файлов, очистки текста и создания словаря

Пятая ячейка определяет служебные методы для чтения индексных файлов набора данных, а также для очистки текста транскрипции и генерации случайного набора выборок из тестовых данных. Установите пятую ячейку на:


 ### 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 .

Шаг 2.6 — CELL 6: Служебные методы для загрузки и повторной выборки аудиоданных

Шестая ячейка определяет служебные методы, использующие 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 .

Шаг 2.7 — ЯЧЕЙКА 7: Чтение тестовых данных

Седьмая ячейка считывает индексные файлы тестовых данных для записей выступающих мужчин и записей говорящих женщин с использованием метода 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")

Шаг 2.8 — ЯЧЕЙКА 8: Создание списков случайных тестовых образцов

Восьмая ячейка генерирует наборы случайных тестовых выборок с использованием метода 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)

Шаг 2.9 — ЯЧЕЙКА 9: Объединение тестовых данных

Девятая ячейка объединяет тестовые образцы мужского и женского пола в единый список. Установите девятую ячейку на:


 ### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female

Шаг 2.10 – ЯЧЕЙКА 10: Тест на очистку транскрипции

Десятая ячейка перебирает каждый образец тестовых данных и очищает связанный текст транскрипции с помощью метода 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])

Шаг 2.11 — ЯЧЕЙКА 11: Загрузка аудиоданных

Одиннадцатая ячейка загружает каждый аудиофайл, указанный в списке 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 в виде списка словарей. Каждый словарь содержит аудиоданные для определенного семпла, частоту дискретизации и текстовую транскрипцию аудио.

Шаг 2.12 — ЯЧЕЙКА 12: Передискретизация аудиоданных

Двенадцатая ячейка выполняет повторную дискретизацию аудиоданных до целевой частоты дискретизации 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]

Шаг 2.13. ЯЧЕЙКА 13: Инициализация экземпляра конвейера автоматического распознавания речи

Тринадцатая ячейка инициализирует экземпляр класса 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")

Шаг 2.14 — ЯЧЕЙКА 14: Создание прогнозов

Четырнадцатая ячейка вызывает transcriber , инициализированный на предыдущем этапе на тестовых данных, для генерации текстовых прогнозов. Установите четырнадцатую ячейку на:


 ### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)

Шаг 2.15. ЯЧЕЙКА 15. Расчет показателей WER

Пятнадцатая ячейка вычисляет баллы 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)

Шаг 2.16 — ЯЧЕЙКА 16: Печать метрик WER

В шестнадцатой и последней ячейке просто печатаются расчеты WER, полученные на предыдущем шаге. Установите шестнадцатую ячейку на:


 ### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)

WER-анализ

Поскольку блокнот генерирует прогнозы на основе случайных выборок тестовых данных, выходные данные будут меняться при каждом запуске блокнота. Следующие выходные данные были созданы при запуске блокнота с 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, не совсем современна, но все же должна оказаться полезной для многих приложений. Приятного строительства!