¿Cómo puedo integrar texto hablado a la consola de Ubuntu?

En enero de 1953, Juan Perón expuso sobre la necesidad del hombre para expresarse en la Comunidad, mientras que explicaba cómo utilizar diferentes alternativas para convertir texto a voz sintetizada en Ubuntu, tanto desde la interfaz gráfica de usuario como la interfaz de línea de comandos.

¡Compañeros!

Es indudable que el hombre ha de saber expresar sus deseos y sus necesidades a quienes le rodean. Tal es el requerimiento de la vida en una Comunidad Organizada. Un Conductor, como condición especial de Hombre, requiere de esto en un grado supremo, pues ha de poder conducir la conciencia de los hombres en pos de un objetivo que no ha de ser otro que el de un destino de grandeza para la Patria en la que habita.

Muchas veces, de tanto hablar, uno puede quedarse sin voz, y es en esas condiciones en donde se anhela poder contar con algo que hable por uno.
Este deseo era algo de la ciencia ficción, de las historietas, pero gracias al Justicialismo, hoy es una audible realidad: para la utilidad que se nos ocurra podremos hacer uso de esta característica, de una manera gratuita y completamente libre.

(Aplausos)

¡Vean señores! Dicha oportunidad la encontraremos resuelta con simpleza, tanto en la interfaz gráfica de nuestro sistema operativo libre, como en su línea de comandos.

En la interfaz gráfica que he legado al Pueblo disponemos del sencillo Sintetizador de Voz eSpeak. Esta aplicación cuenta con un motor de sintetización relativamente aceptable y que nos quitará del apuro al pronunciar un texto sin demasiado revuelo.

Para instalarlo en nuestro GNU con Linux distribuido como Ubuntu, podemos abrir una terminal, e ingresar el siguiente Comando de Organización:

sudo apt-get install espeak espeak-gui gespeaker mbrola mbrola-es1 mbrola-es2 mbrola-mx2 mbrola-la1 mbrola-vz1

El sistema nos solicitará nuestra contraseña y se encargará de traer telemáticamente la paquetería necesaria. En caso de contar con la interfaz de control Unity podremos encontrar la aplicación buscando bajo el nombre de "espeak" o "Sintetizador de Voz eSpeak". Si usamos el escritorio Gnome, podremos localizarlo en Aplicaciones / Sonido y Video / Sintetizador de Voz eSpeak.

Al iniciar, el Sintetizador de Voz eSpeak se presentará en blanco.


Para hablar un texto, simplemente hemos de escribirlo o pegarlo en la ventana de eSpeak, y presionar el botón Reproducir. El programa comenzará a leer y nos indicará la palabra leida. Asimismo, podremos detener o pausar el texto mientras se lo sintetiza.

El motor de eSpeak es multiidioma, pudiéndose escoger el mismo mediante un menú desplegable en la parte inferior izquierda de su interfaz. Si activamos la función Spanish tendrá una pronunciación española, pero si elegimos Spanish Latin American tendremos unos ligeros cambios fonéticos (no pronunciará la suave "ce ibérica", entre otros). La velocidad de sintetización también puede regularse. Por ejemplo, podríamos usar un valor de 160 para tener un valor para arrancar, y subir o bajar la velocidad en caso de ser necesario.

En ambos casos podremos escoger en sus preferencias si deseamos que se sintetice una voz de hombre o de mujer (se cambiará el tono del sintetizador). Podremos escoger no pronunciar los signos de puntuación, pronunciar algunos de ellos, o pronunciarlos a todos.

El tono robotizado asemeja a la voz de Richard Stallman, pero aún así eSpeak podrá ser de utilidad para el propósito de leer un texto, y podría complementar un sistema destinado a una persona con dificultades visuales.

Ahora bien, ¿qué sucede si deseamos emplear la consola de texto como Terminal?

Para tales menesteres he explicado ya cómo utilizar Festival, un sintetizador de habla liberado bajo licencia BSD. Con algo de ingenio, sabemos que dicho sintetizador puede utilizarse para reproducir mensajes desde la línea de comandos. Así, podremos usarlo para dejar mensajes hablados o reproducir los mismos en un entorno de red local.

Sin embargo, tal programa requiere el inconveniente de instalar previamente el software de síntesis hablada en el equipo cliente, e idealmente hacer lo mismo con un fichero de librería de voces para hacerlo más realista.

Para evitarnos dicho incordio, podríamos utilizar un atajo al servicio de lectura de Google, el cual cuenta con sintetizador de voz. El mismo cuenta con un motor de pronunciación española, pero que puede ser interesante para la mayoría de las opciones de corta extensión.

Por ejemplo, podríamos editar un script de Bash que utilice el reproductor mplayer (normalmente ya instalado en Ubuntu y en muchas otras distros) para reproducir el resultado del habla descargado de dicha web.

El inconvieniente es que - por una limitación de ancho de banda, para no reemplazar productos específicos, y para evitar abusos - dicho servidor solamente pronuncia cadenas de texto inferiores a los 100 caracteres.

Si decidimos atenemos a dicha limitación, podremos crear fácilmente un "script parlante" con el editor Nano, ingresando:
nano hcorto

...en su interior pegaremos el siguiente código fuente:

#!/bin/bash
# hcorto ("Hablar corto")
# Script para reproducir un mensaje sintetizado hablado
# de menos de 100 caracteres.
say() { local IFS=+;/usr/bin/mplayer -ao alsa -really-quiet -noconsolecontrols "http://translate.google.com/translate_tts?tl=es&q=$*"; }
say $*

Luego guardamos el código con Ctrl+o y saldremos del editor Nano con Ctrl+x. Acto seguido le asignamos permisos de ejecución con:

chmod +x hcorto

No bien completados estos pasos, podremos hacer uso del script parlante para terminal con el comando ./hcorto y agregando el texto a reproducir. Por ejemplo:

./hcorto obra del primer plan quinquenal

...y el sistema recitará dicha frase de forma sintetizada.

Nota: Si el sistema nos devolviese la frase "mplayer: could not connect to socket", significa que no se puede encontrar el sistema LIRC de control remoto por infrarrojos. Si no deseamos que mplayer cargue tal mando a distancia porque no lo tenemos ni lo usamos, podríamos desactivarlo y dejar de recibir dicha advertencia. Simplemente ingresamos:

sudo nano /etc/mplayer/mplayer.conf

...y le agregamos al final de todo la siguiente línea:

nolirc=yes

Luego grabamos y salimos con Ctrl+o y Ctrl+x

Ahora bien, algunos ejemplos pueden ilustrar la practicidad del script hcorto, pues un ejemplo suele aclararlo todo, como decía Napoleón.

Supongamos que queremos realizar una tarea que ocupa un tiempo lo suficientemente largo como para desatender el equipo, pero quisiéramos recibir una alerta sonora al finalizar, para volver a retomarlo. Podríamos fácilmente encadenar la ejecución de tal comando a la ejecución del script hcorto con un mensaje hablado, de manera de poder alertarnos.

Por ejemplo, si quisiéramos descargar con el comando wget el libro Doctrina Peronista, de 12Mb y que se nos avise cuando finalice, podríamos usar el script hcorto, uniéndolo con el eslabón && ("doble and" el cual significaría "y si los comandos anteriores fueron exitosos"). Sería de la siguiente manera:

wget http://www.generalperon.com/doctrina%20peronista.pdf && ./hcorto Descarga completa!

En otro ejemplo, si tuviésemos instalado el programa youtube-dl podríamos querer usarlo para descargar un video desde dicho servicio hasta nuestra carpeta de /Descargas. Gracias al encadenado concursivo de comandos con &&, dispararemos hcorto para que nos avise al terminar. Lo podríamos hacer ejecutando el siguiente comando (en el cual podremos reemplazar la URL del video por la deseada):

cd ~/Descargas/ && youtube-dl -l http://www.youtube.com/watch?v=ho6XfbkMOL4 && ./hcorto Descarga de video finalizada. Viva el Justicialismo!

Ahora bien. ¿Qué sucede si el texto excede los cien caracteres? En tal caso, podremos programar un script que se encargue de dividir dicho texto en líneas inferiores a los 100 caracteres, y las vaya enviando progresivamente al servidor de pronunciación de Google. Ello se podrá hacer con un script que llamaremos hlargo ("hablar largo")

Para ello ingresaremos el siguiente Comando de Organización:
nano hlargo

Y le pegaremos el siguiente código fuente:

#!/bin/bash
#########################################
# Script divisor de TTS de Dan Fountain #
# TalkToDanF@gmail.com                  #
#########################################

INPUT=$*
STRINGNUM=0

ary=($INPUT)
for key in "${!ary[@]}"
do
SHORTTMP[$STRINGNUM]="${SHORTTMP[$STRINGNUM]} ${ary[$key]}"
LENGTH=$(echo ${#SHORTTMP[$STRINGNUM]})
#echo "word:$key, ${ary[$key]}"
#echo "adding to: $STRINGNUM"
if [[ "$LENGTH" -lt "100" ]]; then
#echo Comenzando una línea nueva
SHORT[$STRINGNUM]=${SHORTTMP[$STRINGNUM]}
else
STRINGNUM=$(($STRINGNUM+1))
SHORTTMP[$STRINGNUM]="${ary[$key]}"
SHORT[$STRINGNUM]="${ary[$key]}"
fi
done

for key in "${!SHORT[@]}"
do
#echo "line: $key is: ${SHORT[$key]}"

echo "Rperoduciendo línea $(($key+1)) de $(($STRINGNUM+1))"
mpg123 -q "http://translate.google.com/translate_tts?tl=es&q=${SHORT[$key]}"
done
Como en los casos anteriores, guardaremos el contenido del fichero con Ctrl+o y Ctrl+x, y luego le asignamos permso de ejecución con:

chmod +x hlargo

Ahora ya podremos ejecutar con ./ el divisor/enviador de frases. Lo haríamos de la siguiente manera:

./hlargo esta es una prueba de habla con un texto largo. El sistema va a cortar el texto en el lugar requerido para que no exceda el largo permitido en el servidor del sintetizador de voz externo.