Nuestros comentarios sobre el Whisper Fine-Tuning Event

02/02/2023

Una guía detallada para mejorar el rendimiento del modelo Whisper con tus propios datos.
Según OpenAI, la robustez y precisión del reconocimiento del habla inglesa nunca ha sido tan cercana a la humana como con su nuevo modelo Whisper. En esta entrada de blog, explicamos nuestro enfoque para ajustar el modelo Whisper y alcanzar este nivel de rendimiento en otros idiomas.

Bofeng Huang

Ingeniero de Aprendizaje Automático en Zaion trabajando en reconocimiento del habla (ASR) y procesamiento automático del lenguaje natural (NLP).

TL;DR

Según OpenAI, la robustez y precisión del reconocimiento del habla inglesa nunca ha sido tan cercana a la humana como con su nuevo modelo Whisper. En esta entrada del blog, explicamos nuestro enfoque para perfeccionar el modelo Whisper con el fin de alcanzar este nivel de rendimiento en otros idiomas. Este trabajo nos valió el primer premio en el Whisper Fine-Tuning Eventorganizado por HuggingFace 🤗 y Lambda Labs, tanto en francés como en alemán. Los modelos modelos y las demos de este evento están disponibles en Hugging Face Hub. 

POR GEORGE MARKS/RETROFILE/GETTY IMAGES.

Prólogo

Soy ingeniero de aprendizaje automático en Zaion, líder del mercado europeo en soluciones de IA para las relaciones con los clientes. Uno de los objetivos de Zaion es ofrecer una transcripción exacta y precisa de las conversaciones de atención al cliente. Por eso es crucial para nosotros contar con un sistema de reconocimiento de voz de reconocimiento que sea fiable, robusto y esté preparado para su uso en condiciones reales.

En Zaion Lab, el equipo de investigación de Zaion, estamos siempre atentos a las últimas tendencias y avances en reconocimiento de voz. Así que tuve la oportunidad de participar en el Whisper Fine-Tuning Event organizado por Hugging Face 🤗 y Lambda Labs, cuyo objetivo es democratizar el uso del modelo Whisper y hacerlo robusto para el mayor número de idiomas posible. Participé en el reto de los idiomas francés y alemán, y gané el primer premio en ambos(tabla de clasificación).

Introducción

En septiembre de 2022, OpenAI lanzó un modelo de reconocimiento automático del habla (ASR) preentrenado llamado Whisper. Los modelos de aprendizaje autosupervisado, como wav2vec 2.0, suelen preentrenarse en tareas de predicción enmascarada con datos de audio sin etiquetar y, a continuación, se perfeccionan con datos etiquetados para diversas tareas posteriores, como el reconocimiento automático del habla. Los modelos de susurro, en cambio, se entrenan directamente con una gran cantidad de datos poco etiquetados recogidos de la web. 

Este corpus consta de 680.000 horas de datos multilingües y multitarea que incluyen la transcripción en varios idiomas, la traducción de estos idiomas al inglés y la predicción de marcas de tiempo. A esta escala, el modelo es muy resistente a los acentos, el ruido de fondo y el lenguaje técnico. 

Whisper es un modelo de secuencia a secuencia, un codificador-decodificador basado en Transformer, que asigna la representación del espectrograma de una grabación a la correspondiente secuencia de unidades subléxicas. Esta representación acústica se calcula mediante una transformación matemática a partir de las formas de onda de la señal en bruto y, a continuación, es analizada por el codificador Transformer. A continuación, el descodificador predice de forma autorregresiva la siguiente salida (o unidad subléxica) en función de las salidas anteriores y los estados ocultos del codificador. La figura siguiente resume la arquitectura del modelo.

La arquitectura del modelo Whisper. Fuente:OpenAI Whisper Blog

En este blog, mostraremos cómo afinar la versión del modelo Whisper medium en lengua francesa. Esta versión del modelo tiene 24 capas de codificación y descodificación y 769 millones de parámetros. El código completo puede consultarse aquí.

Preparación de datos y modelos

Cargar el modelo

Empecemos cargando la versión media del modelo preentrenado Whisper:

Preparación de datos

Encontrará ciertos argumentos definidos en el modelo Whisper, como "forced_decoder_ids" y "suppress_tokens". Estos argumentos se definen en GenerationConfig para la tarea de generación; sin embargo, no se utilizan durante el entrenamiento para dejar que el modelo los aprenda por sí mismo.

También desactivamos la función use_cache en el descodificador Whisper. Esto nos permite reutilizar la clave y los valores calculados de los bloques de autoatención y atención cruzada para acelerar la etapa de descodificación actual. Sin embargo, es incompatible con el gradient checkpointing, que se aplicará en una etapa posterior para reducir la huella de memoria.

Carga de conjuntos de datos

Carga de conjuntos de datos

Utilizaremos la biblioteca 🤗 Datasets para descargar y preparar los conjuntos de datos. Mezclamos datos de entrenamiento de Common Voice 11.0y Multilingual LibriSpeech para formar un conjunto de entrenamiento mayor, y utilizamos solo datos de prueba de Common Voice 11.0 para la evaluación.
Siempre se recomienda recopilar tantos datos de entrenamiento como sea posible. Hay otros conjuntos de datos de reconocimiento del habla disponibles en Hugging Face Hub, como Voxpopuli y Fleurs. Si quieres cargar tu corpus local, echa un vistazo a esta página.

La frecuencia de muestreo de la señal de audio es de 48 kHz en Common Voice y de 16 kHz en Multilingual LibriSpeech. Nos aseguramos de que las muestras de audio se remuestreen a 16kHz, no sólo para unificar la frecuencia de muestreo de los distintos conjuntos de datos, sino también porque ésta es la frecuencia de muestreo de 680.000 horas del corpus de preentrenamiento Whisper. El remuestreo puede realizarse fácilmente sobre la marcha utilizando el método 'cast_column' y el objeto Datasets 'Audio'.

Para mezclar conjuntos de datos diferentes, también es necesario asegurarse de que todos los conjuntos de datos tienen los mismos campos de datos. En este caso, sólo conservamos la columna de audio y la frase de dos conjuntos de datos.

Datos de mezcla

Si tienes limitaciones de espacio en disco, puedes cargar conjuntos de datos sobre la marcha utilizando el modo streaming.

Más datos

Hemos comprobado que las muestras de audio del conjunto de datos LibriSpeech Multilingual son bastante inteligibles. Para garantizar que el modelo es robusto en entornos ruidosos y puede generalizarse a distintos hablantes, aumentamos los datos utilizando la biblioteca Audiomentations. Se aplican varios aumentos a las muestras de audio, como TimeStretch,Gain,PitchShift y una de las opciones AddBackgroundNoiseo AddGaussianNoise.

Este método de aumento se lleva a cabo de la siguiente manera:

Más datos

A continuación, aplicamos el incremento a todos los ejemplos de aprendizaje mediante el método del "mapa":

aprender

Nota: El aumento de datos sólo se realiza en el conjunto de entrenamiento. También conservamos una versión original del conjunto de entrenamiento y la combinamos con el conjunto de entrenamiento aumentado.

Normalización de textos

"Mientras que la diversidad en la calidad del audio puede ayudar a que un modelo sea robusto, la diversidad en la calidad de la transcripción no es tan beneficiosa".

La diversidad en este caso se refleja en el formato de transcripción, es decir, las mayúsculas y minúsculas y los signos de puntuación existen en el conjunto de datos Common Voice, pero no en el conjunto de datos Multilingual LibriSpeech. Debemos asegurarnos de que las transcripciones estén en minúsculas y eliminar los signos de puntuación cuando las utilicemos juntas. Esto simplificará la tarea, ya que el modelo no tendrá que distinguir entre mayúsculas y minúsculas ni predecir los signos de puntuación entre caracteres.

Sin embargo, si desea transcripciones fáciles de leer o que requieran mayúsculas y minúsculas o signos de puntuación, es mejor conservarlas y utilizar únicamente conjuntos de datos de mayúsculas y minúsculas y signos de puntuación como Common VoiceyFleurs.

Conjuntos de datos

Nota: El modelo se evalúa siempre con transcripciones normalizadas, es decir, sin mayúsculas y sin signos de puntuación.
Encontrará la normalización utilizada para el inglés y otras lenguas en el Apéndice C del artículo Whisper.

Preprocesamiento de datos

Encontrará la normalización utilizada para el inglés y otras lenguas en el Apéndice C del artículo sobre Whisper.

Como mostramos en la introducción, el modelo Whisper toma el espectrograma log-Mel como entrada y produce tokens BPE. Por lo tanto, tenemos que preparar nuestros datos en el formato adecuado. Esto puede hacerse mediante dos clases de utilidad: WhisperFeatureExtractor y WhisperTokenizer, utilizadas respectivamente en las entradas de audio y en las transcripciones o predicciones del modelo. La librería Transformer combina estas dos clases en una única clase WhisperProcessor, que puede cargarse como se muestra a continuación:

biblioteca de datos

Todo lo que tenemos que hacer es especificar el idioma de destino y la tarea, y WhisperTokenizer antepondrá los tokens de idioma y tarea correspondientes al codificar las transcripciones en ID de etiqueta.

Veamos qué hay en nuestra función de preparación de datos:

preparación de datos

A continuación, aplicamos la función de preparación de datos a todos los ejemplos del conjunto de datos mediante el método "map":

Métodos de tarjeta

Borrar audio largo

En el paso anterior, el WhisperFeatureExtractor truncó los ejemplos cuyo audio duraba más de 30 segundos. Si el audio está truncado, la transcripción no lo está, lo que desestabiliza gravemente el proceso de aprendizaje. Aquí definimos una función para filtrar cualquier audio de más de 30 segundos:

Supresión audio larga

A continuación, aplicamos nuestra función de filtro a todos los ejemplos mediante el método "filtro":

Método de filtrado

Borrar textos largos

El descodificador Whisper utiliza una representación de posición aprendida con una longitud máxima de 448 tokens. Por tanto, no puede descodificar una transcripción de más de 448 identificadores de token. Aquí definimos una función de filtro sobre los identificadores de etiqueta:

Borrar textos largos

A continuación, aplícalo a todos los ejemplos mediante el método "filtro":

Método de filtrado

Aprendizaje y evaluación

Compaginador de datos

El cotejador de datos toma una lista de muestras preprocesadas y las ensambla en un lote de tensores Pytorch. Debemos asegurarnos de que todas las características de audio del lote tengan la misma longitud, y esta regla también se aplica a todas las etiquetas del lote.

Las características de audio ya están rellenadas o truncadas a una dimensión fija por el "WhisperFeatureExtractor", por lo que sólo tenemos que convertirlas a tensores Pytorch utilizando el método "pad". En cambio, los identificadores de etiqueta no se rellenan. Primero tenemos que paginarlos hasta la longitud máxima del lote utilizando el método "pad", y después sustituir los tokens de paginación por "-100" para que estos tokens no se tengan en cuenta en el cálculo de pérdidas.

Definamos nuestro recopilador de datos del siguiente modo:

Compaginador de datos

A continuación, podemos inicializar el recopilador de datos que acabamos de definir:

Medidas de evaluación

Utilizamos la métrica de tasa de error de palabra(WER) para evaluar el rendimiento del modelo. La métrica WER puede cargarse de forma sencilla mediante 🤗 Evaluar :

Evalúe

A continuación, tenemos que definir una función que tome los identificadores reales de los tokens y las predicciones del modelo y devuelva la métrica WER. En esta función, tenemos que sustituir "-100" por "pad_token_id" (anulando el paso en el recopilador de datos para ignorar los tokens rellenados) para que los identificadores de etiqueta se puedan destokenizar correctamente en cadenas.

De-tokened

Configuración de aprendizaje

En este paso definimos todos los parámetros relacionados con el entrenamiento. Para más detalles sobre los demás argumentos de entrenamiento, consulte la documentación "Seq2SeqTrainingArguments".

Definición de parámetros

Aprender

En el último paso, inicializamos el entrenador pasando como argumentos el modelo, el conjunto de datos, el recopilador de datos, los argumentos de entrenamiento y la función de cálculo de métricas.

Cálculo de métricas

¡Pongamos en marcha el aprendizaje!

¡Pongamos en marcha el aprendizaje!

No olvides guardar tu modelo y procesador una vez que hayas terminado el entrenamiento:

Aprendizaje realizado

¡Recapitulemos!

En este blog, presentamos una guía paso a paso para ajustar Whisper para ASR en datos franceses. La WER de la versión mediade Whisper se redujo del 16,00% al 9,03% en Common Voice. Con la versión Whisper grande, se redujo del 13,90% al 8,15%.
Puede encontrar una demostración de ASR en francés utilizando modelos Whisper ajustados aquí.

También puede ajustar Whisper en otros idiomas: sólo tiene que recopilar y limpiar conjuntos de datos en ese idioma y, a continuación, especificar el código del idioma correspondiente cuando se cargue "WhisperProcessor".

Referencias

  1. Reconocimiento robusto del habla mediante una supervisión débil a gran escala 
  2. Ajuste fino de Whisper para ASR multilingüe con transformadores 🤗. 
  3. Evento de puesta a punto de Whisper 

Por último, me gustaría dar las gracias a mis colegas de Zaion Lab por su inestimable ayuda y sus constructivos comentarios: Mohamed Bouaziz, Tiphaine Fievet,Imed Laaridh,Lorraine Vanel,Yingzhi Wang yAlya Yacoubi.

SABER MÁS 

Noticias Zaion

Manténgase al día de las últimas noticias, tendencias y análisis
en el campo de las relaciones con los clientes aumentadas por la IA conversacional, generativa y de voz.

Descubra las soluciones Zaion

* son necesarios