miércoles, 8 de agosto de 2007

Problema extraño compilando para ARM

Mientras me contestan de Loquendo por el problema con la licencia estoy revisando el código de lo que llevo hecho hasta ahora. He probado a compilar el programa generando código para ARMV4, con el fin de ejecutarlo en una PDA real en vez de en el emulador.

Al construirlo, me sale un error del Linker:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

Como es habitual, he dedicado el par de horas siguiente a buscar información sobre el susodicho, y como es habitual no he encontrado ninguna solución clara. Leyendo de aquí y de allá y probando diferentes cosas al final lo he solucionado. No se exactamente cual es el problema, pero lo he arreglado siguiendo los siguientes nada-triviales y nada-intuitivos pasos:

- En Project -> Settings -> Link -> Input, donde dice Ignore libraries, añadir a lo que haya exactamente lo siguiente:

,libcmt.lib,oldnames.lib

Es decir, el nombre de las dos librerías que dan problemas separadas por comas, si se utilizan espacios como en otras opciones que hay en el mismo cuadro de diálogo no funciona.

Después de hacer eso el programa se compila correctamente y se copia por ActiveSync a la PDA, donde se puede ejecutar sin más contratiempos.

martes, 7 de agosto de 2007

Problemillas con Loquendo

Me he encontrado con un par de problemas, aunque más que problemas yo diría que son inconvenientes o features:

- El ruido blanco que decía ayer que sonaba al ejecutar la aplicación de prueba en la PDA no era problema de licencia, sino de que usaba un formato de codificación de voz que no está disponible para la versión embebida del software. Sucede si se copia tal cual el programa de ejemplo que viene en la guía del usuario, en particular, hay que cambiar la línea de código

err = ttsNewVoice(&hVoice, hInstance, "Jorge", 16000, "l");

por

err = ttsNewVoice(&hVoice, hInstance, "Jorge", 16000, "loqmsx");

ya que según indica la guía para Windows CE:

the voice database encoding formats available are loqmsx (8 KHz and 16
KHz) and loq210 (16 KHz); linear, μ-law and a-law encodings are not
supported;


- El otro problema es precisamente el de la licencia. Tras hacer el cambio anterior una clara voz suena en el altavoz diciendo a los cuatro vientos que el producto necesita una licencia para funcionar. Mediante una utilidad obtengo un identificador de la PDA (con aspecto de dirección MAC), lo envío mediante la página del fabricante y me devuelve un txt y un exe. El txt contiene la licencia en formato 'registro de Windows', y el ejecutable al lanzarlo en el PC se conecta por ActiveSync a la PDA y un mensaje dice que lo registra correctamente. A continuación, vuelvo a lanzar el programa de prueba y la voz dice otra cosa diferente, pero sigue sin ser lo que debería. Esta vez dice que la licencia instalada no es válida para ese dispositivo. He mandado un mail al soporte técnico de Loquendo, y ahora estoy a la espera a ver si se puede solucionar.

lunes, 6 de agosto de 2007

Compilación usando Loquendo

He conseguido compilar y ejecutar un programa de prueba que usa la librería de Loquendo y casi-funciona sobre una PDA real.

Cosas que faltaban el último día para funcionar:

- Sobre el lío de arquitecturas ARMV4 y ARMV4i: La buena, la que funciona de verdad en mi PDA es la ARMV4, que según lo que ponía en el post anterior es la que se corresponde con PocketPC 2003 . La ARMV4i es más moderna, y se corresponde con Windows Mobile 5.0. No hay que cambiar a mano ningún parámentro con la arquitectura de salida, tal como se decía erroneamente en el susodicho post (*).

- Además de las voces (por ejemplo 'Jorge'), en la PDA hay que instalar también el SDK. En mi caso concreto, el fichero con extensión .CAB que hay dentro de Loquendo_Embedded_TTS_6-PPC2003_SDK_Distribution_6.6.17.zip

- El anterior instala unos ficheros en el directorio de la PDA \Archivos de Programa\Loquendo\Loquendo TTS. Dentro de él hay varias DLLs y pogramas de prueba. Por ejemplo, el que se llama LTTSDemoMSX permite seleccionar una voz, escribir un texto en la pantalla, y hacerlo sonar por el altavoz de la PDA. Como curiosidad, al no tenerlo licenciado en lugar del texto la voz dice que es necesario instalar la licencia antes de usarlo.

- Sobre el programa de prueba: Tras construirlo para ARMV4 (PocketPC 2003) se copia el ejecutable automáticamente al directorio raiz de la PDA. Si se intenta ejecutar sale un error que dice que no es posible hacerlo porque falta un componente. Mensaje completamente distinto al que decía que no es una aplicación válida PocketPC. Para que encuentre los componentes que le faltan (las DLLs, vamos) se puede copiar el ejecutable en el directorio de instalación de Loquendo mencionado en el punto anterior.

- Tras copiar el ejecutable donde están el resto de componentes, al hacer doble click con el puntero se ejecuta sin dar más errores. En lugar de una voz se oye un ruido blanco, posiblemente por el tema de la licencia que se mencionaba antes. Para conseguirla hay que ejecutar un programa llamado GetID, que devuelve un código que hay que enviar a Loquendo para que a su vez manden la licencia que permite hacerlo funcionar.

- Para averiguar lo anterior me ha venido muy bien una utilidad que tra el Embedded Visual C++ llamada 'Dependency Walker', situada en el subdirectorio Common\Tools de la instalación de eVC. Lo que hace es, a partir de un fichero .EXE, mostrar las librerías dinámicas y estáticas de las que depende. De esa forma, he podido ver que necesitaba una DLL llamada LOQTTS6.DLL que no se encontraba en mi PDA, y a partir de ello me he dado cuenta de que tenía que instalar el SDK.



(*) Entrada de la Wikipedia aclaratoria sobre los nombres de los sistemas embebidos de Microsoft: PocketPC
Diferencia entre ARMV4 y ARMV4i.

jueves, 2 de agosto de 2007

Loquendo y eVC

Llevo toda la semana luchando a brazo partido con la librería de Loquendo y el Embbeded Visual C++ para compilar un ejemplo sencillo que viene en la documentación.

Problemas que me he encontrado:

- Errores del tipo:

main.obj : error LNK2019: unresolved external symbol __imp_ttsDeleteInstance referenced in function main
main.obj : error LNK2019: unresolved external symbol __imp_ttsRead referenced in function main
(...)


Parece que no encuentra la librería para enlazar, a pesar de que está indicado en las propiedades del proyecto el directorio donde residen (Tools -> Options -> Directories). Dejan de producirse incluyendo en el código la siguiente línea:

#pragma comment(lib, "LoqTTS6.lib")

que especifica la librería concreta con la que quiero que se linke.



- Error del tipo:

corelibc.lib(pegwmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function WinMainCRTStartup


Que se soluciona en Project -> Settings -> Link -> Output, y cambiando el Entry-point symbol del valor WinMainCRTStartup a simplemente main



- Error del tipo:

LoqTTS6.lib(LoqTTS6.dll) : fatal error LNK1112: module machine type 'THUMB' conflicts with target machine type 'ARM'


Este ha sido más peliagudo. He encontrado esta página de un foro de Microsoft donde lo aclara un poco, abajo del todo dice esto:
You need to look at all of your compiler and linker inputs and outputs, and figure out whether you are being consistent in your code generation. Keep in mind that:

* PPC 2003 is ARMV4 --> linker switch/machine type = ARM
* PPC 5.0 is ARMV4I --> linker switch/machine type = THUMB

You can't mix and match compiled binaries for each platform. Thanks,


Así que, por probar, he ido de nuevo a Project -> Settings -> Link -> Output y en el cuadro de abajo donde sale la línea de comando del linker (Project Options) he buscado el parámetro /MACHINE y sustituido ARMV4 por THUMB. EDITADO:¡MAL HECHO!.

Después de eso el programa de prueba se puede construir (compilación + linkado) correctamente. La versión de la librería no se puede ejecutar en el emulador, así que copio el ejecutable a una PDA real. Lo lanzo y... error, dice que no es una aplicación para PocketPC válida.

Parece pues que la diferencia entre ARMV4 y ARMV4I es mucha, yo pensaba que no. Eso, o que me he pasado de listo al forzar la compilación. Creo que miraré a ver si hay alguna versión de la librería para ARMV4 "a secas".

martes, 31 de julio de 2007

Vuelta de vacaciones

He estado dos semanas de vacaciones y ya he vuelto. Ahora toca retomar el asunto del avatar, concretamente intentar hacerlo hablar.

Para ello voy a utilizar librerías comerciales de Loquendo, disponibles para varias plataformas. El Dpto. de la Universidad me ha proporcionado la forma de descargar una versión de evaluación.

Por cierto, he mirado en el expediente la nota que me han puesto en la línea de investigación y ha sido un 9'5, así que muy bien :-)

lunes, 9 de julio de 2007

Documentación entregada

Finalmente no pude terminar la documentación para entregarla el viernes y la he acabado de escribir durante el fin de semana. Ya se la he mandado por mail a la profesora en PDF.

Después de dos semanas de documentación intensiva (entre esta Línea y la otra), ahora llega la calma.

martes, 3 de julio de 2007

Documentación de fin de curso

Iba a continuar mirando lo del Text to Speech, bien probando a recompilar la librería Flite o probando una versión de evaluación de Loquendo, pero estamos ya en julio y se aproxima la fecha de entrega de actas (el día 11). Tengo que ir ya redactando el informe de lo que he estado haciendo, y dejar esto de momento para seguir después, si procede.

La extensión en páginas es libre y también el formato, menos mal, porque las plantillas tipo artículo a dos columnas son muy feas. Ya tengo pensada la estructura, que será la típica: Introducción, estado del arte, elección de herramientas, proceso de desarrollo, trabajos similares, conclusiones y bibliografía.

A ver si lo tengo para el final de esta semana o como muy tarde para el lunes 9.