Voz artificial para la máquina
Leyendo información en otro idioma en estos días empecé a encontrar varias palabras que no recordaba o que no sabía cómo pronunciar y se me ocurrió que sería muy bueno poder simplemente:
- Seleccionar la palabra.
- Pulsar una combinación de teclas (ej.
Ctrl+Alt+P
). - Escuchar su pronunciación.
Antier terminé de prototipar un programa que me permite hacer esto (o casi) usando voces sintéticas relativamente naturales (ver video). Lo llamé Voz y está disponible en un repositorio público (se puede instalar con GNU Guix).
El programa no es nada del otro mundo: básicamente es un cliente de un servicio de TTS (texto a voz). Pero es una herramienta que ahora me permite usar la máquina como si realmente estuviera en el siglo XXI.
¿Por qué no usar un lector de pantalla?
Hay varias razones por las cuales decidí escribir el programa en vez de usar el lector de pantalla de mi sistema (Orca):
- De usos anteriores, recordé que Orca usaba una voz robótica cuya pronunciación no sería útil imitar.
- También recordé que Orca no tenía la habilidad de identificar el idioma del texto ni de leer texto multilingüe. O sea, se limitaba a leer en el mismo idioma del entorno.
- Al activar Orca en mi sistema para probarlo otra vez, no funcionó.
Servicios de síntesis de voz
Por conveniencia, este prototipo del programa usa gTTS, que depende de un «servicio» no documentado de Google Translate para convertir el texto en voz.
Idealmente, el programa debería usar un servicio local (para perseguir el ideal de informática doméstica y personal autosuficiente). Desafortunadamente, Festival, el software de síntesis de voz que encontré disponible para mi sistema, tampoco funcionó, aparentemente debido a un problema introducido en la distribución, no en el software mismo (ver reporte del problema).
Adicionalmente, las voces de muestra en el sitio web de Festival no suenan muy naturales, lo que las hace inapropiadas para asistencia en pronunciación.
So you've eagerly downloaded flite, compiled it and run it, now you
are disappointed that it doesn't sound wonderful, sure its fast and
small but what you really hoped for was the dulcit tones of a deep
baritone voice that would make you desperately hang on every phrase it
mellifluously produces. But instead you get an 8Khz diphone voice that
sounds like it came from the last millenium.
— flite, 2021
No sé en qué se diferencian los métodos de síntesis de software como Festival de los que usan los servicios de IBM y Google (cuyas voces son más naturales). Tal vez los que usamos tecnologías libres estamos sujetos a vivir en un atraso tecnológico de una década por siempre, dadas las diferencias en disponibilidad de recursos.
Como último recurso dejé los servicios de conversión de texto a voz de IBM y Google: IBM Cloud Text to Speech y Google Cloud Text to Speech. Los dos con opciones de prueba gratuita con diferentes restricciones, pero aparentemente suficientes para este prototipo y para un posible uso personal. El primero no lo pude usar porque IBM Cloud no me permitió crear una cuenta (Error: No se puede crear su cuenta en este momento). El segundo no lo usé porque exigía información de tarjeta de crédito, dando como razón la necesidad de confirmar que uno no es un robot, aun cuando en un paso previo se pide número de teléfono celular para enviar un código de confirmación.
Mi impresión actual es que es fácil encontrar servicios de síntesis pero no tan fácil acceder a ellos. Tal vez esto cambie un poquito con el trabajo del Grupo de investigación de aprendizaje automático de Mozilla y CommonVoice, también de Mozilla.
Limitaciones actuales
El programa es un prototipo todavía, lo escribí usando la disciplina del caminito alegre. Aparte de eso, estas son algunas limitaciones que encontré en el camino cuya solución parece estar fuera de mi alcance:
La detección del idioma del texto puede fallar cuando se selecciona solamente una palabra o expresión corta. Por ejemplo, estas selecciones no se identifican correctamente:
- Defaults to female voice. (identificada como neerlandés)
- O sea, eliminando pyperclip como dependencia. (identificada como portugués)
En el caso del japonés, la voz no es muy agradable y, dependiendo de la aplicación donde se haga la selección, si el texto tiene furigana, se pronuncian sílabas repetidas. Por ejemplo, al seleccionar la expresión 多くなる en cierta aplicación, la pronunciación podría terminar como おおおおくなる (repetición de la lectura de 多). Es como si la selección en este tipo de aplicaciones pusiera el texto furigana en el portapapeles también, en vez de poner solo el texto principal.
La lectura de textos multilingües no funciona bien del todo. La detección del idioma principal puede fallar y la lectura de palabras en otros idiomas puede omitirse. Tomando como ejemplo la siguiente oración:
En japonés, leer se dice 読む; en inglés se dice «read».
El texto se lee en español, la palabra en japonés no se pronuncia, pero la palabra en inglés sí se pronuncia, en inglés. Si agrego a la misma oración cómo se dice leer en francés, la lectura del texto principal cambia incorrectamente a francés en vez de español.
Por último, pues está el problema de enviar textos a la «nube» de Google o de cualquier otro tercero. Sin embargo, hoy, no veo forma de programar la herramienta sin estos servicios...
Temas relacionados: