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:

"Welcome"
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:

Valor 000
Parámetro
Valor 255
Mouth
Height
Mouth
Width
Mouth
Upturn
Jaw
Open
Teeth
Upper
Visible
Teeth
Lower
Visible
Tongue
Position
Lip
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:

Valor 000
Parámetro
Valor 255
Teeth
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

Volver al Menú

Avanzar hacia: Introducción a Linux y las Xlib



Universidad de Valladolid

Ingeniería Técnica en Informática de Gestión