Proyecto de Lectura y Reproducción de Texto con Boca Animada en Español
Primera Parte del Proceso de Desarrollo del Proyecto
Empezamos por el estudio del código fuente del programa en inglés (Microsoft Mouth), para descubrir su funcionamiento. Después de su estudio llegamos a las siguientes conclusiones (estas son las explicaciones del proceso básico, sin entrar en las múltiples opciones seleccionables y demás):
- Primero viene una inicialización de las variables globales e inicia la parte del OLE.
- El siguiente paso es llamar al engine (motor) para renderizar el texto introducido. Esto se hace a partir de los valores almacenados en el registro de Windows, que nos dan datos como velocidad de habla, tono,... que la propia aplicación almacena al finalizar para que estén disponibles en la siguiente sesión.
- El programa está preparado. Se puede enviar cualquier cadena de texto al motor, que este la reproducirá por la salida estándar (altavoces).
- El motor tiene una representación fonética propia. Cada fonema que pronuncia lo va introduciendo en una cola junto con otros datos (como por ejemplo la posición de la boca para la pronunciación de ese fonema).
- Cada vez que hay un dato en la cola, se produce una notificación del propio motor, que indica la presencia del dato. El programa usa esa notificación para ver la posición en que debe estar la boca y dibujarla. Dependiendo de la velocidad del ordenador el retraso entre la reproducción del sonido (fonema dispuesto en la cola) y su representación gráfica es mayor o menor.
- Al finalizar, libera el motor y guarda los datos que deben ser recordados en la próxima ejecución en el registro de Windows.
Como uno de los objetivos del proyecto es intentar conseguir el mayor sincronismo (para acercarnos a la realidad) entre sonido y movimiento de la boca, intentamos buscar cómo se envía la notificación, para estudiar otras posibilidad que sincronicen los dos actos (como pueden ser semáforos, esperas, ...), pero entre el código fuente suministrado no viene la implementación de las funciones, sólo su definición, en el fichero speech.h. Falta el fichero speech.cpp, y sólo se suministra el fichero compilado speech.dll.
El siguiente paso ha sido coger diferentes frases y hacer que el programa escriba en un fichero el fónema que está reproduciendo junto con los parámetros que le pasa a la boca, para estudiar estos datos y como inciden después en la representación final de la boca. Estos valores son de tipo BYTE, es decir, de 0 a 255. A modo de ejemplo incluimos los resultados obtenidos para la palabra:
| Engine Phoneme | Mouth Height | Mouth Width | Mouth Upturn | Jaw Open | Teeth Upper | Teeth Lower | Tongue Position | Lips Tension |
| 0 | 117 | 153 | 0 | 0 | 0 | 0 | 0 | |
| W | 179 | 0 | 140 | 48 | 0 | 0 | 0 | 222 |
| e | 48 | 160 | 160 | 96 | 96 | 176 | 0 | 0 |
| L | 53 | 117 | 153 | 48 | 0 | 0 | 179 | 0 |
| K | 16 | 176 | 160 | 48 | 32 | 80 | 0 | 0 |
| v | 48 | 208 | 160 | 96 | 48 | 112 | 0 | 0 |
| M | 0 | 64 | 128 | 0 | 0 | 0 | 0 | 166 |
| 0 | 117 | 153 | 0 | 0 | 0 | 0 | 0 |
El primer fonema y el último son los que corresponden a la boca cerrada (posición inicial y final).
Después hemos intentado controlar la imagen de la boca, para lo cual hemos hecho un programa que leyera los valores de los parámetros desde teclado o desde un fichero y a partir de estos mostrase el visema, para ver su semajanza con el fonema intentado imitar sin sonido (sólo los visemas), para a partir de estos datos y los obtenidos anteriormente comprender mejor el fichero que se encarga de dibujar la boca a ver si conseguimos obtener como a partir de estos representa la boca. Si quieres descargarlo pulsa aquí (48 Kb).
Para ver como afectan los distintos parámetros a la visualización de la boca, primero definimos todos los parámetros a 123, que es el punto medio. La imagen resultante fue:

Esta imagen (como las posteriores) depende también del hablante que tengamos seleccionado. Cada hablante viene identificado por valores como velocidad de habla, anchura de labios, tono... que el programa almacena en una constante a la que llama GUID del motor, aunque el cambio producido en todas ellas al cambiar los parámetros es el mismo.
El siguiente paso fue ir cambiando sólo uno de los parámetros, al nivel mínimo y máximo para ver el cambio producido:
![]() |
Height |
![]() |
![]() |
Width |
![]() |
![]() |
Upturn |
![]() |
![]() |
Open |
![]() |
![]() |
Upper Visible |
![]() |
![]() |
Lower Visible |
![]() |
![]() |
Position |
![]() |
![]() |
Tension |
![]() |
Como conclusión de esto sacamos que:
Empezamos el segundo estudio, para sacar conclusiones sobre los parámetros anteriores que no han quedado suficientemente claros:
Para el estudio sobre la visibilidad de los dientes inferiores, hemos intentado encontrar unos parámetros que nos permitan ver si se pueden apreciar los dientes inferiores o no. Esos parámetros han sido:
| Mouth Height | Mouth Width | Mouth Upturn | Jaw Open | Teeth Upper | Tongue Position | Lips Tension |
| 100 | 192 | 128 | 0 | 0 | 0 | 0 |
Las imágenes obtenidas han sido:
![]() |
Lower Visible |
![]() |
En conclusión, si que se pueden apreciar los dientes inferiores, siempre que la posición de los labios lo permita.
Ahora pasamos al estudio del Jaw Open. Despues de probar no hemos encontrado ninguna posición en la que se aprecien cambios al variar este parámetro. Entonces, mirando el código fuente del fichero paint.h de Microsoft, vemos que este parámetro no se utiliza para nada, por lo que sólo se suministra por si empleas otro modelo visual en el que se aprecien más detalles de la cara.
Resumiendo gráficamente los parámetros visuales:

Para la finalización de esta parte y aprovechando que teníamos instalado el programa IBM ViaVoice 98, que utiliza la Speech API 3.0 y que instala un motor en español, utilizamos el programa que nos da los valores de los fonemas para ver una aproximación a los parámetros de los fonemas en español. Esto es temporal, ya que nuestra intención es constrastar estos valores con los que nos ofrezca un estudio más pormenorizado con la ayuda de un foniatra. Estos valores no son incluidos en esta página ya que son de carácter temporal.
Retroceder hacia: Introducción al Microsoft Speech API SDK 4.0
Avanzar hacia: Introducción a Linux y las Xlib
Universidad de Valladolid
Ingeniería Técnica en Informática de Gestión