A blog about data, information and IT, by Mario Alberich

Mar 04
2009

Del blog al podcast con síntesis de voz


Paso 1: Festival con voces en Español y codificador LAME

Hace tres o cuatro años que descubrí el programa Festival Speech Synthesis System, desarrollado por la Universidad de Edimburgo.  Este software diferencia sus licencias de uso en relación al propio código fuente y a las voces que contiene.  En esencia el software es totalmente libre (con una licencia de tipo BSD), pero en el caso de las voces existen restricciones.  Por ejemplo, las voces británicas están basadas en el Oxford Advanced Learners' Dictionary of Current English, por lo que su uso se restringe a aplicaciones no comerciales.  Algo similar sucede con la voz en castellano.

Buscando información sobre el tema, encontré dos proyectos de creación de voces para Festival en catalán y castellano:

Para la realización de estas voces se ha utilizado el conjunto de herramientas Festvox, desarrolladas por el grupo de tecnologías de la pronunciación de la Universidad Carnegie Mellon y dirigida específicamente a la creación de voces para Festival.

En ambos sitios se puede encontrar información sobre el proceso de creación del corpus de sonidos, que es diferente en cada caso.  Cabe comentar brevemente las dos versiones presentadas en el proyecto de la UPC: HTS y Clunits.

HTS se basa en la aplicación de modelos derivados de las Cadenas Ocultas de Markov (Hidden Markov Models - HMM) a los sistemas de síntesis de voz, como se puede leer en el sitio HMM-based Speech Synthesis System (HTS).  Las cadenas de Markov (y por extensión las cadenas ocultas) son una herramienta de uso muy extendido, no sólo en síntesis o en reconocimiento de voz, sino también en procesamiento del lenguaje natural, o en el algoritmo del PageRank. No voy a entrar en detalles, trataré de dedicarle un artículo a este tema.

Para entender cómo funciona el modelo Clunits (Cluster Units Algoritmo de clusterización de unidades de sonido), hay un documento de Alan W. Black y Paul Taylor (1997) sobre la descripción del Algoritmo.

Después de escuchar varias versiones de ambos modelos, creo que el resultado más interesante está en el modelo Clunits, aunque las inflexiones de voz parecen más artificiales (no sabría decir si debido al modelo de creación del corpus).

El proceso de instalación y configuración de las voces en catalán puede leerse respectivamente en el sitio del equipo catalán de Ubuntu.  Para las voces en castellano, recomiendo la lectura del artículo Cómo instalar e integrar Festival en Asterisk, un caso de uso muy interesante. La cuestión clave es configurar festival para que utilice las voces correspondientes.

Respecto a la instalación de LAME Mp3, sólo cabe decir que en Debian no existe un paquete específico, debido a las restricciones de codificación del formato MP3.  En cualquier caso es posible descargarse el paquete y compilarlo sin problemas aparentes.


Paso 2: Script de recuperación y limpieza de los contenidos

Festival no está pensado como lector de páginas web en crudo, por lo que es necesario eliminar las etiquetas y las entidades HTML antes de realizar el proceso.  Puede ser necesario convertir el texto a codificación Latin-1 porque según la documentación del proyecto, es la codificación correcta. De todos modos es una cuestión que yo no he necesitado, desconozco si las mejoras en festival han incluído soporte para UTF8.

Antes de empezar hay que tener en cuenta un detalle importante: al eliminar las etiquetas HTML, todo el texto se desestructura.  Es decir, que un título no tiene una énfasis especial, ni siquiera se reconoce como frase (porque no es costumbre poner puntos al final del título).  Tampoco he entrado a fondo en las posibilidades de Festival para personalizar el énfasis en ciertos términos o frases.

Así que el resultado final puede ser mejorado si existen opciones en Festival que yo no estoy utilizando y quizá remarquen puntos clave (por ejemplo, en el caso de texto en negrita).  Además, en el proceso de conversión a texto normal, la entidad HTML "nbsp" se convierte en un "espacio raro", algo que Festival no tolera demasiado bien (de hecho parece que trague saliva).  También los puntos seguidos deben contener un solo espacio en blanco posterior, y ninguno entre éste y la última palabra de la frase.

Resumiendo el proceso, los pasos a realizar antes de eliminar las etiquetas HTML son:

  • Introducir saltos de línea antes de las etiquetas de títulos (H1..H5)
  • Introducir puntos al cierre de las etiquetas de títulos (H1..H5)
  • Introducir saltos de línea antes y después de los tags de párrafo (P)
  • Eliminar la entidad "nbsp".
  • Introducir un espacio posterior a los puntos seguidos(.), y eliminar el doble espacio posterior (".").
  • Mantener unidos los puntos suspensivos (excepción al caso anterior).
  • Cambiar los paréntesis de apertura y cierre por comas.

Una vez realizados estos cambios, hay que eliminar las etiquetas HTML (en PHP, strip_tags ), y luego eliminar las entidades HTML (en PHP, html_entity_decode ). En caso que sea necesario, también hay que recodificar el texto (en PHP, mb_convert_encoding ).

Después de esto, el proceso ya llega a su fin: Hay que volcar el contenido generado a un archivo de texto, y ejecutar las dos llamadas para convertir de texto a WAV y luego a MP3 (primero text2wave, luego lame).


Paso 3: Definición de los scripts de Ejecución text2wave y lame

En Festival existe la utilidad text2wave, que puede ejecutarse (después de indicarse el cambio de voz en la configuración) con la siguiente llamada:

# text2wave archivo_texto -o archivo_wav

Con esto se recogerán el texto de archivo_texto, lo convertirá en sonido y lo volcará en formato WAV en archivo_wav.

Una vez conseguido el archivo de sonido, es necesario convertirlo a formato MP3.  Para ello se puede ejecutar el siguiente comando:

# lame -h -m m -b 92 --resample 22.05 --scale .61 --replaygain-accurate --clipdetect archivo_wav archivo_mp3

Con esta instrucción se genera el sonido , con las siguientes características:

  • Codificación con calidad alta (-h). Evita algunos clicks/pops en la conversión a MP3.
  • Sonido de un canal (-m m = modo Mono).
  • Calidad de 92 kbps (-b 92): esta calidad es más que suficiente para la voz.
  • frecuencia de muestreo de 22050 Hertzios (--resample 22.05). Festival varía el ratio de muestreo según la calidad de la voz, por lo que esta opción normaliza el resultado.  Se podría indicar 44100 hertzios (44.1) para aplicar el mismo ratio de muestreo que un CD a costa de aumentar el tamaño del archivo.
  • escalado del valor al 61% respecto a la señal recibida del archivo WAV (--scale .61). En esencia reduce el volumen, pero lo que trata de evitar esta opción es el "cliqueo" (clipping) que se produce si el volumen es alto.
  • Identificar los picos de sonido para evitar el clipping (--replaygain-accurate).
  • Avisar si existe clipping (--clipdetect)

Las últimas tres opciones se incluyen para conseguir un resultado más agradable a los oídos y para recibir información sobre el resultado final. Esto es debido a que, al menos en el caso de las voces en castellano, el volumen original genera muchos clicks, probablemente debido a la concatenación de los sonidos que representan cada fonema/difonema. Dado que el tono y volumen de la voz están normalizados (y no sufren alteraciones en cada locución), se pueden establecer estos parámetros como fijos, algo que no podríamos hacer en caso de una locución humana real.


Paso 4: Disponibilidad de la audición en la interfaz web

Para el último paso me he valido del programa Flash MP3 Player , que permite incrustar un reproductor MP3 personalizable en una página web.  El proceso en relación a lo anterior es bastante sencillo: incluir un código HTML en la página que incruste el archivo SWF del reproductor, incluyendo como parámetro la URL.

En la propia página existe un generador de código para el reproductor, para cada uno de los reproductores.  El código permite la personalización de colores.

Con esto ya está incrustado el reproductor en la página, que referencia al archivo MP3 que previamente hemos generado y que permite escucharlo sin más problemas.


Conclusiones, otros recursos y cuestiones de accesibilidad

El resultado final tiene unas cuantas ineficiencias manifiestas (pero tampoco tan críticas: se nota que ambos proyectos de creación de voz han hecho un esfuerzo notable).  Por un lado, la pronunciación de siglas y direcciones web no siempre se acerca a unos resultados deseables.  Aunque en el caso de las voces de la Junta de Andalucía se ha trabajado en el análisis de tokens para procesar direcciones de correo y direcciones web (URL), el resultado final es mejorable.

Otro tanto sucede al escribir fragmentos de texto en otros idiomas, o instrucciones de código fuente.  La solución a este tema pasa por utilizar tags de HTML concretos (por ejemplo en el caso del código fuente, utilizar el tag "code").  Antes de procesar el contenido, estos tags pueden ser tratados como textos separados (para utilizar voces en el idioma original) o bien eliminados, y luego concatenar los pequeños archivos de voz generados.  De todos modos, esta mejora va mucho más allá de mis objetivos por ahora.  Por no decir que el resultado es a veces tan divertido que vale la pena escucharlo para echarse unas risas Riendo.

El reproductor MP3 de Flash no soluciona una cuestión importante: la accesibilidad.  Por eso considero oportuno añadir un enlace directo al archivo MP3.  De este modo se ofrece una opción de disponibilidad del contenido para personas con discapacidades visuales que no tengan screenreaders en el ordenador de consulta y que tampoco tendrían asegurado el uso del reproductor de Flash.  También descarto la inclusión del reproductor en el contenido de los feeds porque es una funcionalidad susceptible de dar problemas en algunos programas lectores de feeds.

Otras aplicaciones de un servicio como éste serían convertir a voz los artículos recogidos de otras fuentes de información.  Es decir, capturar nuestros feeds habituales y convertirlos a voz sintetizada para luego escucharlos como cualquier otro podcast.  Este caso presenta un pequeño añadido en complejidad, ya que debemos controlar el idioma de la fuente y también el marcado HTML. Lo primero es fácil, pero lo segundo puede complicarse.

Como ejemplo de este caso encontré este enlace en PHPied: conversión de feeds a podcast con ffmpeg, otra opción interesante. El uso de ffmpeg o de lame es una cuestión opcional, ya que ffmpeg requiere de un codec (que puede ser perfectamente el proporcionado por LAME). En su caso utiliza un sintetizador de Mac. Vale decir que si la fuente original está en inglés, las cosas se simplifican mucho por la disponibilidad general de sintetizadores en este idioma.

La introducción del enlace al archivo MP3 en el RSS del blog difiere conscientemente de las especificaciones de iTunes y Yahoo! Media RSS Module. Este archivo no es un podcast por sí mismo, sino una versión sintetizada, y por lo tanto no es una alternativa sino una herramienta de soporte al texto.  Con esto quiero aclarar algo: si quieres entenderlo todo, mejor acaba leyendo el artículo original.

Tags

gestión documental 10     Recuperación información 11     Linux 7     Usabilidad 5     open source 3     Tagging 12     lógica borrosa 2     fuentes de información 12     Google 6     off-topic 6     spam 2     grafos 6     Web social 11     modelización 12     Productividad 11     buscadores 2     utilidades 17     Profesionales 9     SEO 5     estándares 3     veracidad 3     relevancia 2     lingüística 2     PLN 2     lenguajes documentales 2     apis-mashups 3     reseñas 7     Flash 7     Gráficos estadísticos 13     Publicidad 3     Innovación 5     muestreo estadístico 9     PHP 14     internet 2     testeo 12     desarrollo 3     visualizacion 36     javascript 16     datos abiertos 9     elecciones 2     simulación 5     html5 7     phing 9     ssh 2     seguridad 3     indicadores 2     demografía 3     media 2     algoritmos 7     shell 4     mysql 2     backup 2     big data 6     twitter 2     d3js 11     revealjs 2     metodología 6     data-journalism 6     smartcities 2     NYT 2     privacidad 3     benchmarking 4     recopilaciones 21     magento 5     formacion 2     github 2     HHVM 3     psicología 2     angularjs 3     grep 2     nodejs 5     promises 2     mapreduce 3     crossfilter 2     exploración de datos 2     machine learning 2    

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.