Le he enseñado el avatar funcionando a la profesora que me lleva el trabajo de la línea de investigación. Hasta ahora solo había visto algún vídeo del avatar en corriendo en el emulador, pero no en una PDA real ni con la síntesis de voz.
Antes he mejorado un poco el aspecto y usabilidad del programa. He programado que para cada botón de la PDA diga una frase diferente, y he añadido un menú flotante con varias opciones, entre las que están habilitar o deshabilitar la iluminación del modelo, ídem con el renderizado de polígonos ocultos, o elegir entre varios juegos de frases de demostración.
La demo en sí creo que le ha gustado bastante. Después hemos estado hablando sobre mejoras que podrían hacérsele, aplicaciones (p.e. como interfaz de usuario para un sistema de control domótico mediante teléfono móvil), posibilidades de publicar algo en alguna revista o congreso, y completar el report que le entregué en julio con lo último que había hecho con el programa del avatar.
miércoles, 10 de octubre de 2007
martes, 2 de octubre de 2007
Sincronización solucionada
Finalmente creo que he conseguido solucionar el tema de la sincronización. Para ello he utilizado la forma de reproducción tipo polling en el que se consulta en un bucle el estado de la reproducción del sonido, y se continúa con ella mediante la llamada a una función de lectura si no hubiera finalizado. Tras hacer varias ejecuciones de prueba se observa que en cada vuelta del bucle la función que hay que llamar para reproducir el siguiente sonido lee un fonema cada vez. Combinándolo con la función de callback antes mencionada que indicaba el código del fonema, se obtiene una forma precisa de controlar el momento en que se reproduce el sonido para poder intercalar la representación del gráfico del avatar correspondiente.
Al ejecutar el programa sobre el dispositivo real de pruebas la reproducción del sonido se oía entrecortada, debido con toda seguridad a que su CPU no tenía capacidad de proceso suficiente para renderizar el modelo en pantalla (recuérdese que no hay aceleración hardware) y generar la síntesis de voz con la velocidad suficiente como para que se oiga de forma fluida. La forma de solucionarlo fue simple: pintar el avatar en la pantalla una vez por cada N fonemas reproducidos. Si el valor de esta N es demasiado bajo la animación será más fluida pero el sonido se oirá entrecortado, y si es demasiado alto sucederá lo contrario, el sonido se oirá bien pero habrá menos frames por segundo para la animación y será menos fluida. Tras algunas pruebas en el dispositivo utilizado para el desarrollo este valor resultó ser de 3 o 4, es decir, de cada 3 o 4 fonemas generados se refresca la pantalla una vez, dando como resultado una animación que sin ser perfecta, es bastante decente.
Después de hacer estos ajustes en el programa y sus parámetros, el aspecto del log es como este (ver entrada anterior para saber qué es cada columna):

Como puede observarse, ahora las llamadas a la función pintarMalla están espaciadas más regularmente que antes y siempre después de que se han generado 3 o 4 fonemas indicados por sus códigos IPA.
Al ejecutar el programa sobre el dispositivo real de pruebas la reproducción del sonido se oía entrecortada, debido con toda seguridad a que su CPU no tenía capacidad de proceso suficiente para renderizar el modelo en pantalla (recuérdese que no hay aceleración hardware) y generar la síntesis de voz con la velocidad suficiente como para que se oiga de forma fluida. La forma de solucionarlo fue simple: pintar el avatar en la pantalla una vez por cada N fonemas reproducidos. Si el valor de esta N es demasiado bajo la animación será más fluida pero el sonido se oirá entrecortado, y si es demasiado alto sucederá lo contrario, el sonido se oirá bien pero habrá menos frames por segundo para la animación y será menos fluida. Tras algunas pruebas en el dispositivo utilizado para el desarrollo este valor resultó ser de 3 o 4, es decir, de cada 3 o 4 fonemas generados se refresca la pantalla una vez, dando como resultado una animación que sin ser perfecta, es bastante decente.
Después de hacer estos ajustes en el programa y sus parámetros, el aspecto del log es como este (ver entrada anterior para saber qué es cada columna):

Como puede observarse, ahora las llamadas a la función pintarMalla están espaciadas más regularmente que antes y siempre después de que se han generado 3 o 4 fonemas indicados por sus códigos IPA.
Etiquetas:
Animación,
Desarrollo,
Loquendo,
Síntesis de voz
jueves, 27 de septiembre de 2007
Probando otra forma de sincronización
Vuelvo a retomar el avatar donde me había quedado. Antes de probar nada con lo threads (que me dan algo de respeto por haber trabajado poco con ellos, y menos en un entorno tan limitado) voy a probar otra cosa que se me ha ocurrido.
En una entrada anterior comentaba que con la librería de Loquendo hay dos formas no bloqueantes de reproducción del sonido. Una es la que ya había probado (TTSNONBLOCKING). El otro que voy a probar ahora es el TTSSLICE y consiste en que la reproducción se hace en un bucle. Mediante una función se sabe si ha terminado o no, y en el primer caso se continúa con ella llamando a otra función.
En una entrada anterior comentaba que con la librería de Loquendo hay dos formas no bloqueantes de reproducción del sonido. Una es la que ya había probado (TTSNONBLOCKING). El otro que voy a probar ahora es el TTSSLICE y consiste en que la reproducción se hace en un bucle. Mediante una función se sabe si ha terminado o no, y en el primer caso se continúa con ella llamando a otra función.
miércoles, 19 de septiembre de 2007
Reunión con David
Hoy he estado hablando con David, que pertence al Grupo de Informática Gráfica Avanzada donde estoy haciendo el trabajo. Él está trabajando en algo parecido a lo mío, un avatar que habla y mueve la boca de forma sincronizada, aunque sobre plataforma PC y haciendo por detrás más cosas que el mio, que solo habla y nada más.
Él también estaba teniendo problemas con la sincronización y hemos estado hablando sobre ello. En principio lo que le pasa a él y a mi son cosas diferentes. Él parece que tiene problemas con el interface de SAPI con la librería, y que se le retarda el sonido respecto a la animación. Lo mío, no es nada de SAPI (por que no existe para el Windows Mobile que yo uso) y más que retrasarse o adelantarse el sonido lo que me pasa es que no se muestran los frames en el momento que deberían.
Me ha dado alguna idea de cosas que podría probar, como usar buffers y threads de forma explícita (actualmente no lo hago, "confío" de alguna forma en los que maneja por debajo OpenGL y Loquendo).
Lo probaré a ver si mejora el comportamiento... pero antes me voy a tomar unos días de descanso, que después de lo del D.E.A y los días previos me vendrá bien desconectar un poco.
Él también estaba teniendo problemas con la sincronización y hemos estado hablando sobre ello. En principio lo que le pasa a él y a mi son cosas diferentes. Él parece que tiene problemas con el interface de SAPI con la librería, y que se le retarda el sonido respecto a la animación. Lo mío, no es nada de SAPI (por que no existe para el Windows Mobile que yo uso) y más que retrasarse o adelantarse el sonido lo que me pasa es que no se muestran los frames en el momento que deberían.
Me ha dado alguna idea de cosas que podría probar, como usar buffers y threads de forma explícita (actualmente no lo hago, "confío" de alguna forma en los que maneja por debajo OpenGL y Loquendo).
Lo probaré a ver si mejora el comportamiento... pero antes me voy a tomar unos días de descanso, que después de lo del D.E.A y los días previos me vendrá bien desconectar un poco.
Etiquetas:
Animación,
Avatares,
Loquendo,
Síntesis de voz
martes, 18 de septiembre de 2007
Prueba del D.E.A
Hoy al mediodía he tenido la prueba del D.E.A., que dado que estábamos mucha gente se ha hecho en dos días (ayer y hoy).
La impresión que me ha quedado no ha sido muy buena, aunque tampoco mala del todo. He explicado lo que había hecho durante el curso, y por las preguntas que me ha hecho después el tribunal me he quedado con la impresión de que quizás me haya centrado en mi exposición demasiado en el proceso de desarrollo y demasiado poco en el de investigación. O lo he transmitido así porque no he sabido hacerlo de otra forma, o realmente quizás el trabajo haya sido más de desarrollo que de investigación.
Luego además al final no he hecho ningún artículo para publicar sobre los trabajos, ni he ido a ningún congreso, ni "otros méritos", así que aunque no me de puntos negativos me dejará de dar positivos.
Pero bueno, ya está hecho, y de la mejor forma que he sabido hacerlo, así que por ese lado estoy tranquilo y satisfecho, alea iacta est. No creo que me suspendan, porque algo he hecho, aunque tampoco voy a tener una nota precisamente brillante.
La impresión que me ha quedado no ha sido muy buena, aunque tampoco mala del todo. He explicado lo que había hecho durante el curso, y por las preguntas que me ha hecho después el tribunal me he quedado con la impresión de que quizás me haya centrado en mi exposición demasiado en el proceso de desarrollo y demasiado poco en el de investigación. O lo he transmitido así porque no he sabido hacerlo de otra forma, o realmente quizás el trabajo haya sido más de desarrollo que de investigación.
Luego además al final no he hecho ningún artículo para publicar sobre los trabajos, ni he ido a ningún congreso, ni "otros méritos", así que aunque no me de puntos negativos me dejará de dar positivos.
Pero bueno, ya está hecho, y de la mejor forma que he sabido hacerlo, así que por ese lado estoy tranquilo y satisfecho, alea iacta est. No creo que me suspendan, porque algo he hecho, aunque tampoco voy a tener una nota precisamente brillante.
lunes, 10 de septiembre de 2007
A preparar el D.E.A
El problema de la sincronización sigue ahí, he hecho alguna prueba para intentar resolverlo pero no lo he conseguido (estas pruebas no tenían nada que ver con lo de los threads que comentaba el otro día).
Ahora dejaré el tema aparcado por un tiempo. El próximo lunes 17 es la prueba para el D.E.A. (Diploma de Estudios Avanzados). Hay que hacer una exposición oral de unos 10 a 15 minutos sobre los trabajos de investigación realizados en el curso. Toca preparar la presentación con el PowerPoint (o en mi caso con el OpenOffice Impress) y ensayarla de viva voz unas cuantas veces para asegurarse de que no queda muy corta ni muy larga, y de que se dice todo lo que se quiere decir sin hacer pausas ni que se trabe la lengua.
Ahora dejaré el tema aparcado por un tiempo. El próximo lunes 17 es la prueba para el D.E.A. (Diploma de Estudios Avanzados). Hay que hacer una exposición oral de unos 10 a 15 minutos sobre los trabajos de investigación realizados en el curso. Toca preparar la presentación con el PowerPoint (o en mi caso con el OpenOffice Impress) y ensayarla de viva voz unas cuantas veces para asegurarse de que no queda muy corta ni muy larga, y de que se dice todo lo que se quiere decir sin hacer pausas ni que se trabe la lengua.
martes, 4 de septiembre de 2007
Problema de sincronización
He estado investigando el problema que tengo con la sincronización de la voz y la animación. Para comprenderlo mejor estoy guardando en el fichero de log de la aplicación la mayor cantidad de información posible, y para este caso concreto he añadido los milisegundos que lleva en ejecución el programa para ver los tiempos en los que se reproduce el sonido y se pinta la imagen.
Después de algunas pruebas he averiguado que es lo que pasa, pero todavía no se la razón. No es que la voz y la imagen estén desincronizadas, pasan dos cosas:

La relación entre el número de fonemas y las veces que se pinta la malla no es equitativa ni constante, y es por eso que la animación no va fluida ni sincronizada. Por ejemplo, entre el ms. 6184 y el 6640 se generan 15 fonemas, y el último de ellos (correspondiente a la malla 6) se representa en pantalla 3 veces seguidas. Lo contrario ocurre en entre el ms. 6472 y el 7577. En este caso se pronuncian solo tres fonemas, pero solo se pinta el último de ellos 4 veces. Lo ideal sería que los refrescos de pantalla sucediesen aproximadamente a intervalos regulares con respecto a los fonemas generados.
La solución que se me ocurre puede ser bastante complicada y no es seguro que funcione, pasaría por ajustar de alguna forma la prioridad de ejecución de los threads que se encargan del OpenGL-ES y de la librería de Loquendo. Cosa complicada a priori por dos razones: Desconozco cómo está ese tema en Windows CE y en eVC, y también desconozco si ambas librerías los utilizan y si es posible acceder a ellos.
Después de algunas pruebas he averiguado que es lo que pasa, pero todavía no se la razón. No es que la voz y la imagen estén desincronizadas, pasan dos cosas:
- Se generan más fonemas de los que se representan. Esto no es problemático, ya comentaba en una entrada anterior que solo se representaban seis visemas (las vocales y la eme).
- Por lo anterior, solo uno de cada dos o tres (pongamos tres) fonemas se pintan en pantalla.
- Observando el log y lo que se ve en la pantalla, parece que se reparte mal el tiempo dedicado a cada una de las dos cosas, y así, a veces se pinta cuatro veces seguidas un mismo visema y no se pronuncia niguno nuevo (dando lugar a un chasquido o microcorte en la reproducción del sonido), y otras veces pasa justo lo contrario, el sonido se oye con fluidez pero la animación queda paralizada.

La relación entre el número de fonemas y las veces que se pinta la malla no es equitativa ni constante, y es por eso que la animación no va fluida ni sincronizada. Por ejemplo, entre el ms. 6184 y el 6640 se generan 15 fonemas, y el último de ellos (correspondiente a la malla 6) se representa en pantalla 3 veces seguidas. Lo contrario ocurre en entre el ms. 6472 y el 7577. En este caso se pronuncian solo tres fonemas, pero solo se pinta el último de ellos 4 veces. Lo ideal sería que los refrescos de pantalla sucediesen aproximadamente a intervalos regulares con respecto a los fonemas generados.
La solución que se me ocurre puede ser bastante complicada y no es seguro que funcione, pasaría por ajustar de alguna forma la prioridad de ejecución de los threads que se encargan del OpenGL-ES y de la librería de Loquendo. Cosa complicada a priori por dos razones: Desconozco cómo está ese tema en Windows CE y en eVC, y también desconozco si ambas librerías los utilizan y si es posible acceder a ellos.
