Speech to Text con Tensorflow (3) – Un modelo made in datahack

Speech to Text con Tensorflow modelo datahack

En los artículos anteriores, introducción y mecanismos de atención, estuvimos hablando de las circunstancias que nos llevaron a embarcarnos en la construcción de este modelo y los principales enfoques que se han venido usando para el entrenamiento de redes neuronales con información secuencial. En este veremos como llevamos a cabo la construcción de nuestro primer modelo de speech to text, ¡¡¡es español!!!

Así, una vez definida la arquitectura que se quería usar, quedaba el último paso, entrenar y construir el modelo de Speech to Text. Proceso que queda reflejado en la siguiente figura:

Speech to Text con Tensorflow modelo datahack

Figura 7 – Esquema general del entrenamiento y construcción del modelo de speech to text

Construyendo el dataset inicial

Lo primero que se hizo fue construir un dataset (conjunto de datos) con el que entrenar al modelo. Este estaría formado por una serie de audiolibros y los ebooks correspondientes. Lo que se buscaba era tener un buen número de ejemplos de personas hablando y la transcripción a texto de lo que iban diciendo. Para esto se usaron tanto audiolibros como ebooks libres de derechos y en español, obtenidos de sitios como LibriVox y Project Gutenberg, entre otros.

Se recopilaron un total de 23 audiolibros, y los 23 ebooks correspondientes, que sumaban un total de 180 horas de audio.

Antes de entrenar el modelo de Speech to text

El siguiente paso fue procesar los audiolibros y ebooks recopilados para adaptarlos al formato LibriSpeech, ampliamente usado para el entrenamiento de modelos de Speech to Text. En este formato hay muchos recursos disponibles en inglés, pero no en español, de ahí que se tomará la decisión de dataset propio que sirviera para cumplir con los objetivos del proyecto.

Paso 1: procesar los audiolibros

El primer paso fue procesar los audiolibros para eliminar todas aquellas cosas que eran dichas por los narradores y que no aparecían en los ebooks. Por ejemplo, comentarios acerca del autor y menciones acerca del proyecto al que pertenecía el audiolibro en cuestión. También se ajustó el sampling rate de los mismos a 16 KHz, por motivos de compatibilidad con el modelo a entrenar. Todas  estas operaciones se hicieron con el programa Audacity.

Paso 2: procesar los ebooks

A continuación, se procesaron los ebooks. Para ello, se dividieron en el mismo número de partes que tenía el audiolibro correspondiente. Por ejemplo, si el audiolibro “La batalla de Trafalgar” estaba compuesto por 17 archivos mp3, el ebook de trafalgar, se dividió en 17 partes, de forma que cada una de ellas coincidiera con el archivo mp3 correspondiente. Además de esto, se hizo una revisión ortográfica, se eliminaron aquellas partes de texto que no aparecían en los audios y se trataron elementos del texto como abreviaturas y números romanos, es decir, donde ponía Sr., se sustituía por Señor y el XIX, se sustituía por 19, por ejemplo. Todo esto se hizo con herramientas de procesamiento de texto y la librería NLTK (Natural Language Toolkit) de Python.

Speech to Text con Tensorflow modelo datahack

Figura 8 – Archivos del audiolibro “La batalla de Trafalgar” y archivos de texto generados a partir del ebook, para conseguir la paridad entre el audio y texto disponible

Paso 3: Alineando audio y texto

Lo siguiente fue hacer el alineamiento de los pares audio-texto con la librería Aeneas. El resultado final fueron 17 directorios, siguiendo con el ejemplo anterior, que contenían: un archivo de texto, con el nombre del directorio, y un número determinado de archivos de audio, uno por cada párrafo existente en el archivo de texto de referencia. Cada uno de los archivos de texto que están dentro de los directorios, serían los índices que indican qué archivo de audio le corresponde a cada uno de los párrafos.

Speech to Text con Tensorflow modelo datahackFigura 9 – Directorios generados, y ejemplo del contenido del primero de ellos, tras alinear los parejas audio-texto correspondientes al audiolibro y ebook de “La batalla de Trafalgar”.

Además de los directorios, la librería Aeneas genera unos archivos json (mapas de sincronización audio-texto), uno por cada pareja de archivos de audio-texto, en los que queda recogida la alineación realizada. Estos se usaron, junto con la herramienta finetuneas, para comprobar si la alineación audio-texto se había hecho bien y aplicar correcciones, si fuera necesario.

Paso 4: división en subconjuntos

Tras alinear todos los audiolibros y ebooks correspondientes, los datos resultantes se distribuyeron los datos en tres subconjuntos: train, dev y test, siguiendo la siguiente proporción 60/20/20: 60% en train, 20% en dev y 20% en test. Los dos primeros, train y dev, se usarían para entrenar el modelo y el subconjunto de test, serviría para evaluar la eficiencia del modelo obtenido. Después de esto, se transformaron en tfrecords, formato nativo de tensorflow.

Speech to Text con Tensorflow modelo datahack

Figura 10 – Distribución de los datos en los tres subconjuntos: train, dev y test

Entrenamiento del modelo de Speech to text

Para el entrenamiento del modelo, se uso una librería de modelos de deep learning de Google, llamada tensor2tensor, que incluye la implementación de la arquitectura descrita del modelo The Transformer.

Lo primero que se hizo, es subir los tfrecords a un bucket de GCP (Google Cloud Platform), para poder entrenar el modelo se pudiera entrenar con una TPU (Tensor Processing Unit), una unidad de procesamiento creada por Google, que está optimizada para el desempeño de tareas de machine learning y deep learning.

Speech to Text con Tensorflow modelo datahack

Figura 11 – Vista de algunos de los tfrecords que se subieron al bucket de GCP

A continuación se creo una instancia de computación con una Cloud TPU, es decir, una máquina virtual con TPU. En la misma se instaló la librería tensor2tensor y se procedió a realizar el entrenamiento del modelo, lanzando una sentencia similar a esta:

Speech to Text con Tensorflow modelo datahack

Figura 12 – Sentencia para iniciar el entrenamiento del modelo, en ella se indica la orden de entrenamiento y los parámetros  asociados a la misma

Los progresos obtenidos durante el entrenamiento se fueron guardando en una carpeta “output”, situada en el mismo bucket donde estaban los datos de entrenamiento. Al finalizar el mismo, se obtuvieron una serie de checkpoints del modelo, versiones de progresión del entrenamiento. El entrenamiento se mantuvo hasta que el valor de pérdida (loss), estuvo por debajo de 0,010. Con esto se aseguraba que la precisión del mismo (accuracy), estuviera cerca del 100%.

Speech to Text con Tensorflow modelo datahack

Figura 13 – Vista de una parte de la carpeta output, donde se fueron guardando los resultados obtenidos durante el entrenamiento del modelo

Probando la eficacia del modelo…

Una vez entrenado el modelo, se llevó  a cabo una prueba de la eficiencia del mismo. Para ello, se hizo una prueba de la capacidad de inferencia (predicción) del mismo, haciendo uso del subconjunto de test, mencionado anteriormente. Los resultados fueron muy prometedores y el modelo lo hizo bien en casi el 100% de los casos.

Con el modelo  entrenado y validado, se procedió a realizar una prueba en real del mismo. Para ello, se les pasaron diferentes mensajes de voz, obtenidos a través de diferentes dispositivos, micrófono de ordenador, móviles, etc. Al hacer esto, se vio que el modelo era bastante sensible al ruido ambiental y, si este era demasiado acentuado, perjudicaba en gran medida a las predicciones realizadas.

Debido a esto, se decidió implementar un proceso de limpieza y normalización del audio entrante, antes de que este se pasara al modelo que hacía la predicción. Para ello, se usó una librería de python, SpeechRecognition, especializada en la detección y tratamiento de la voz humana. Con la limpieza previa del audio, los resultados mejoran bastante, aunque seguía teniendo cierta debilidad al ruido ambiental.

Resultados

El resultado final de todo esto fue la obtención de una primera versión de un modelo de speech to text, capaz de pasar la voz humana (en español) a texto con una eficiencia más que aceptable pero que aún sigue siendo sensible al ruido ambiental. No obstante, como he comentado, esta es una primera versión que esperamos mejorar en el futuro, llevando a cabo una o varias de las siguientes acciones:

  • Usar algoritmos de calibración de micrófonos
  • Crear una Red Neuronal para la supresión del ruido en el audio
  • Intercalando ruido en el dataset existente

Y hasta llega nuestra singladura acerca del desarrollo y puesta en marcha de nuestro primer modelo de speech to text, espero que os haya sido interesante. Por nuestra parte, seguiremos trabajando en ello y os iremos contando nuestros avances, ya sea a través de este canal u otros que tenemos disponibles.

¡Saludos a tod@s y buena semana!


Javier Moralo, Data & AI Creative de datahack


dia4ra cdtiEl proyecto empresarial de DATAHACK CONSULTING SL., denominado “DESARROLLO DE INTELIGENCIA ARTIFICIAL EN ROBOTS APLICADOS AL TRATAMIENTO DEL ALZHEIMER Y LA DEMENCIA” y número de expediente 00104725 / SNEO-20171211 ha sido subvencionado por el CENTRO PARA EL DESARROLLO TECNOLÓGICO INDUSTRIAL (CDTI)

2 comentarios de “Speech to Text con Tensorflow (3) – Un modelo made in datahack

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *