Proyecto de Lectura y Reproducción de Texto con Boca Animada en Español
2ª Parte del Proceso de Desarrollo del Proyecto
Esta segunda parte de desarrollo del proyecto parte de un sintetizador hecho para linux , con lo que el objetivo es conseguir añadir a la arquitectura del sintetizador un nuevo módulo para poder apreciar el aspecto visual del habla.
El primer paso que hicimos fue mirar los fonemas que distinguía el sintetizador , y y tratarlos de adaptar a los parámetros visuales faciales obtenidos con el estudio del IBM ViaVoice 98. Estos parámetros han sido tomados de forma temporal hasta un próximo estudio. Así podemos apreciar el resultado del estudio de los visemas temporales
Tomamos, como ejemplo, los fonemas devueltos por el sintetizador para una frase:
El siguiente paso fue el estudio de las librerías gráficas del programa Microsoft Mouth. Para cada elemento gráfico(labios, dientes, piel, lengua..), se pudo observar que el programa calculaba una serie de puntos en función del tamaño de la ventana y de los parámetros de los visemas almacenados, y después unía estos puntos con líneas y los llenaba de color. Nuestro primer paso fue conseguir que en Linux dados los visemas de la frase de ejemplo consiguieramos crear una serie de ficheros temporales que incluían la información de los puntos. Una vez creados estos ficheros, pudimos utilizar el programa GNUPLOT, incluido en Linux, para representar los ficheros de puntos en una gráfica y apreciar su forma.

Hay que hacer notar que aparece invertido verticalmente, ya que mientras en GNUPLOT el eje positivo tiene dirección hacia arriba, en una ventana X-Windows el eje positivo se encuentra hacia abajo.
El siguiente paso fue el de pasar los puntos de los diferentes ficheros temporales a librerías gráficas con el objetivo de representar el modelo visual en una ventana. Primeramente lo hicimos uniendo únicamente las líneas (sin color).Además esta parte nos ha facilitado una mayor comprensión de los elementos que componen el sistema y su forma:![]() |
Primeramente el programa dibuja un rectángulo que ocupa todo y que al pintarlo borra todo el dibujo anterior. Además este cuadro da el color de la "garganta". Lo siguiente es dibujar la lengua como aquí se muestra y pintarla. |
| Despues viene el dibujo de los dientes. Esto los dibuja de dos veces (primero los superiores y despues los inferiores). El resultado es como aquí se muestra: | ![]() |
![]() |
Lo siguiente es dibujar la piel. Esta envuelve todo el dibujo y toda la ventana, dándole el color adecuado a la piel. |
| Lo último que se dibuja son los labios. Al igual que los dientes, se hace en dos veces: primero el superior y después el inferior. | ![]() |
Ahora se puede ver como queda todo el dibujo despues de añadirle todos los elementos y después de darle color:
![]() |
![]() |
Una vez dado el color lo que hemos hecho es que cada vez que se pulse el ratón en la ventana se representara el siguiente fonema de la frase de ejemplo (hemos conseguido una "animación").
Esta animación funciona bien. Ahora viene el siguiente paso: este sintetizador no envía notificaciones al "pronunciar" un fonema, como hace el de Windows, sino que su funcionamiento es distinto: sintetiza el texto, crea un fichero wav y llama a el programa wavplay de Linux para que lo reproduzca. Por suerte, también genera un fichero de texto con todos los fonemas que pronuncia y su duración. Lo que nosotros hacemos es dividir el programa en dos procesos: uno de ellos se encarga de reproducir el fichero wav y el otro de coger ese fichero de texto e ir visualizando los visemas uno a uno, durante el tiempo especificado. Este mecanismo conlleva un problema: y es la sincronización entre el que reproduce y el que representa, ya que son procesos que se ejecutan de forma totalmente independiente y no se pueden relacionar entre sí por el propio funcionamiento del sintetizador.
Al probar el programa tal como está hasta aquí, descubrimo un problema que en windows no pasa: se produce un parpadeo en la animación. Al realizar un borrado en negro de todo el dibujo antes de representar el siguiente fonema, se produce un parpadeo en la imagen. Esto en windows no pasaba (posiblemente debido a su mejor optimización de las tarjetas gráficas y rutinas de dibujo, que provocan una mayor rapidez de redibujado). Para solucionar esto usamos una aproximación a una técnica muy utilizada en animación: el doble buffer. Este consiste en tener en un buffer el siguiente fotograma de la animación preparado, para que en el momento de tener que dibujarlo sólo haya que hacer un reemplazamiento entre las imagenes, y no un redibujado, lo cual es más rápido y le da mucha más suavidad. En nuestro caso tenemos un tiempo muy grande entre fonema y fonema, tiempo que aprovechamos para dibujar la siguiente imagen en un pixmap (zona de memoria en la que se puede dibujar como si fuera una ventana), y en el momento del cambio utilizamos la función XCopyArea() de las Xlib para reemplazarlo. Además esto mejora la sincronización, ya que el tiempo invertido en dibujar el nuevo fonema no repercute en una alteración del tiempo predestinado a su representación. Además hemos medido el tiempo destinado a dibujar en el pixmap y es bastante inferior al tiempo que debe permanecer un fonema representado.
Una vez conseguido evitar el parpadeo, nos hemos ocupado de la sincronización. Para establecer el tiempo de cada fonema usamos un temporizador (timer), que se inicializa con la duración de este y al llegar a 0 envia un mensaje, momento en el cual reiniciamos el temporizador y cambiamos el visema representado. El tiempo en el cual está esperando esta señal es el que aprovechamos para dibujar en el pixmap. Después de varias optimizaciones conseguimos no introducir ninguna línea de código entre el momento en que esperamos la señal del temporizador y el momento en el cual activamos el siguiente temporizador (con esto conseguimos una desincronización mínima entre fonemas). Ahora la mayor desincronización está en la diferencia de tiempo que tardan en empezar cada uno de los procesos independientes: el programa que visualiza la boca y el que reproduce el sonido. Nuestros próximos pasos están destinados a hacer que este lapso sea mínimo.
Otro dato importante es el poco parecido de los visemas obtenidos con el Via Voice de IBM y la realidad, por lo cual decidimos sacar también los fonemas del sintetizador en inglés de Microsoft, los cuales nos parecieron bastante más reales y expresivos. Se puede apreciar la diferencia en la página de visemas, a falta de ver si estos son los definitivos o los alteramos todavía después de consultar con gente especializada en la materia.
Retroceder hacia: Introducción a Linux y las Xlib
Avanzar hacia: Visualización de los Visemas
Universidad de Valladolid
Ingeniería Técnica en Informática de Gestión