paint-brush
Trabajar con wav2vec2 Parte 2: Ejecución de inferencia en modelos ASR ajustadospor@pictureinthenoise
510 lecturas
510 lecturas

Trabajar con wav2vec2 Parte 2: Ejecución de inferencia en modelos ASR ajustados

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

Demasiado Largo; Para Leer

Esta guía complementaria explica los pasos para ejecutar la inferencia en un modelo wav2vec2 XLS-R ajustado. Complementa la guía "Trabajar con wav2vec2 Parte 1 - Ajuste XLS-R para el reconocimiento automático de voz". La guía proporciona instrucciones paso a paso sobre cómo crear un Kaggle Notebook que se puede utilizar para ejecutar inferencias.
featured image - Trabajar con wav2vec2 Parte 2: Ejecución de inferencia en modelos ASR ajustados
Picture in the Noise HackerNoon profile picture
0-item
1-item

Introducción

Esta es una guía complementaria para Trabajar con wav2vec2 Parte 1: Ajuste de XLS-R para el reconocimiento automático de voz (la "guía de la Parte 1"). Escribí la guía de la Parte 1 sobre cómo ajustar el modelo wav2vec2 XLS-R ("XLS-R") de Meta AI en español de Chile. Se supone que ha completado esa guía y ha generado su propio modelo XLS-R ajustado. Esta guía explicará los pasos para ejecutar la inferencia en su modelo XLS-R ajustado a través de una computadora portátil Kaggle .

Requisitos previos y antes de comenzar

Para completar la guía, necesitarás tener:


  • Un modelo XLS-R adaptado al idioma español.
  • Una cuenta de Kaggle existente.
  • Conocimientos intermedios de Python.
  • Conocimiento intermedio de trabajo con Kaggle Notebooks.
  • Conocimiento intermedio de conceptos de ML.
  • Conocimientos básicos de conceptos ASR.

Construyendo el cuaderno de inferencias

Paso 1: configurar su entorno Kaggle

Paso 1.1: Crear un nuevo cuaderno Kaggle

  1. Inicie sesión en Kaggle.
  2. Crea un nuevo cuaderno Kaggle.
  3. El nombre del cuaderno se puede cambiar según se desee. Esta guía utiliza el nombre del cuaderno spanish-asr-inference .

Paso 1.2: Agregar los conjuntos de datos de prueba

Esta guía utiliza el conjunto de datos del habla del español peruano como fuente de datos de prueba. Al igual que el conjunto de datos de habla del español de Chile , el conjunto de datos de hablantes peruanos también consta de dos subconjuntos de datos: 2918 grabaciones de hablantes peruanos varones y 2529 grabaciones de hablantes peruanos mujeres.


Este conjunto de datos se cargó en Kaggle como 2 conjuntos de datos distintos:


Agregue ambos conjuntos de datos a su Kaggle Notebook haciendo clic en Agregar entrada .

Paso 1.3: Agregar el modelo ajustado

Debería haber guardado su modelo ajustado en el Paso 4 de la guía Trabajar con wav2vec2 Parte 1: Ajuste fino de XLS-R para el reconocimiento automático de voz como modelo Kaggle .


Agregue su modelo ajustado a su Kaggle Notebook haciendo clic en Agregar entrada .

Paso 2: construir el cuaderno de inferencias

Los siguientes 16 subpasos construyen en orden cada una de las 16 celdas del cuaderno de inferencia. Notará que aquí se utilizan muchos de los mismos métodos de utilidad de la guía de la Parte 1.

Paso 2.1 - CÉLULA 1: Instalación de paquetes

La primera celda del cuaderno de inferencia instala dependencias. Establezca la primera celda en:


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

Paso 2.2 - CÉLULA 2: Importación de paquetes de Python

La segunda celda importa los paquetes Python requeridos. Establezca la segunda celda en:


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

Paso 2.3 - CELDA 3: Carga de la métrica WER

La tercera celda importa la métrica de evaluación WER de HuggingFace. Establezca la tercera celda en:


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


  • WER se utilizará para medir el rendimiento del modelo ajustado en datos de prueba.

Paso 2.4 - CÉLULA 4: Configuración de constantes

La cuarta celda establece constantes que se utilizarán en todo el cuaderno. Establezca la cuarta celda en:


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

Paso 2.5 - CÉLULA 5: Métodos de utilidad para leer archivos de índice, limpiar texto y crear vocabulario

La quinta celda define métodos de utilidad para leer los archivos de índice del conjunto de datos, así como para limpiar el texto de transcripción y generar un conjunto aleatorio de muestras a partir de datos de prueba. Establezca la quinta celda en:


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


  • El método read_index_file_data lee un archivo de índice del conjunto de datos line_index.tsv y produce una lista de listas con nombres de archivos de audio y datos de transcripción, por ejemplo:


 [ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]


  • El método clean_text se utiliza para eliminar de cada transcripción de texto los caracteres especificados por la expresión regular asignada a SPECIAL_CHARS en el Paso 2.4 . Estos caracteres, incluida la puntuación, se pueden eliminar ya que no proporcionan ningún valor semántico al entrenar el modelo para aprender asignaciones entre funciones de audio y transcripciones de texto.
  • El método get_random_samples devuelve un conjunto de muestras de prueba aleatorias con la cantidad establecida por la constante NUM_LOAD_FROM_EACH_SET en el Paso 2.4 .

Paso 2.6 - CÉLULA 6: Métodos de utilidad para cargar y remuestrear datos de audio

La sexta celda define métodos de utilidad que utilizan torchaudio para cargar y volver a muestrear datos de audio. Establezca la sexta celda en:


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


  • El método read_audio_data carga un archivo de audio específico y devuelve una matriz multidimensional torch.Tensor de los datos de audio junto con la frecuencia de muestreo del audio. Todos los archivos de audio de los datos de entrenamiento tienen una frecuencia de muestreo de 48000 Hz. Esta frecuencia de muestreo "original" es capturada por la constante ORIG_SAMPLING_RATE en el Paso 2.4 .
  • El método resample se utiliza para reducir la resolución de datos de audio desde una frecuencia de muestreo de 48000 a la frecuencia de muestreo objetivo de 16000 .

Paso 2.7 - CÉLULA 7: Lectura de datos de prueba

La séptima celda lee los archivos de índice de datos de prueba para las grabaciones de hablantes masculinos y las grabaciones de hablantes femeninas utilizando el método read_index_file_data definido en el Paso 2.5 . Establezca la séptima celda en:


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

Paso 2.8 - CÉLULA 8: Generación de listas de muestras de prueba aleatorias

La octava celda genera conjuntos de muestras de prueba aleatorias utilizando el método get_random_samples definido en el Paso 2.5 . Establezca la octava celda en:


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

Paso 2.9 - CÉLULA 9: Combinación de datos de prueba

La novena celda combina las muestras de prueba masculinas y las muestras de prueba femeninas en una sola lista. Establezca la novena celda en:


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

Paso 2.10 - CÉLULA 10: Prueba de transcripción de limpieza

La décima celda itera sobre cada muestra de datos de prueba y limpia el texto de transcripción asociado utilizando el método clean_text definido en el Paso 2.5 . Establezca la décima celda en:


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

Paso 2.11 - CÉLULA 11: Cargando datos de audio

La undécima celda carga cada archivo de audio especificado en la lista all_test_samples . Establezca la undécima celda en:


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


  • Los datos de audio se devuelven como un torch.Tensor y se almacenan en all_test_data como una lista de diccionarios. Cada diccionario contiene los datos de audio para una muestra particular, la frecuencia de muestreo y la transcripción de texto del audio.

Paso 2.12 - CÉLULA 12: Remuestreo de datos de audio

La duodécima celda vuelve a muestrear los datos de audio a la frecuencia de muestreo objetivo de 16000 . Establezca la duodécima celda en:


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

Paso 2.13 - CÉLULA 13: Inicialización de la instancia de canalización de reconocimiento automático de voz

La decimotercera celda inicializa una instancia de la clase pipeline de la biblioteca transformer HuggingFace. Establezca la decimotercera celda en:


 ### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")


  • El parámetro model debe establecerse en la ruta a su modelo ajustado agregado al Kaggle Notebook en el Paso 1.3 , por ejemplo:


 transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")

Paso 2.14 - CÉLULA 14: Generación de predicciones

La decimocuarta celda llama al transcriber inicializado en el paso anterior con los datos de prueba para generar predicciones de texto. Establezca la decimocuarta celda en:


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

Paso 2.15 - CÉLULA 15: Calcular métricas WER

La decimoquinta celda calcula las puntuaciones WER para cada predicción, así como una puntuación WER general para todas las predicciones. Establezca la decimoquinta celda en:


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

Paso 2.16 - CELDA 16: Impresión de métricas WER

La decimosexta y última celda simplemente imprime los cálculos de WER del paso anterior. Establezca la decimosexta celda en:


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

Análisis WER

Dado que el cuaderno genera predicciones sobre muestras aleatorias de datos de prueba, el resultado variará cada vez que se ejecute el cuaderno. El siguiente resultado se generó en una ejecución del portátil con NUM_LOAD_FROM_EACH_SET establecido en 3 para un total de 6 muestras de prueba:


 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


Como puede verse, ¡el modelo hizo un excelente trabajo! Sólo cometió un error con la sexta muestra (índice 5 ), al escribir mal la palabra septiembre como setiembre . Por supuesto, volver a ejecutar el portátil con diferentes muestras de prueba y, lo que es más importante, con una mayor cantidad de muestras de prueba, producirá resultados diferentes y más informativos. No obstante, estos datos limitados sugieren que el modelo puede funcionar bien en diferentes dialectos del español; es decir, fue entrenado en español chileno, pero parece funcionar bien en español peruano.

Conclusión

Si recién está aprendiendo a trabajar con modelos wav2vec2, espero que la guía Trabajar con wav2vec2 Parte 1 - Ajuste de XLS-R para el reconocimiento automático de voz y esta guía le hayan resultado útiles. Como se mencionó, el modelo ajustado generado por la guía de la Parte 1 no es del todo avanzado, pero aún así debería resultar útil para muchas aplicaciones. ¡Feliz edificio!