Text To Speech con Festival, Google ASR y Translation en Asterisk 15, sobre CentOS

1280px-Asterisk_Logo.svg
Imagen 1. Asterisk y Google Translate

En esta entrada vamos a combinar Text To Speech usando Festival y Speech Recognition+Translation usando la API Translate de Google Cloud. Para empezar vamos a instalar Festival, para ello ejecutamos:

# yum install festival festival-devel

Festival esta muy bien, pero por defecto vendrá con voces en Ingles, puede que tengamos alguna voz en Español por defecto dependiendo de la instalación, pero en esta caso vamos a usar una voz en Español mejorada. Cuando se prepararon estas voces se hicieron sobre Debian, es por ello que los paquetes serán .deb, así que necesitaremos pasarlas a .rpm de CentOS, esto lo haremos con Alien, pero antes tendremos que descargar los siguientes paquetes:

# yum install epel-release.noarch rpm-build

Descargamos e instalamos el repositorio Nux con el cual podremos instalar Alien:

# rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

Ahora podremos instalar Alien:

# yum install alien

A continuación procedemos a descargar los paquetes de voz mejorados desde aquí y los convertiremos de .deb a .rpm con Alien

# alien -rv --scripts festvox-palpc16k_1.0-1_all.deb

Instalamos el paquete con rpm:

# rpm -ivh festvox-palpc16k-1.0-2.noarch.rpm

Si al ejecutar el comando anterior ocasiona algún conflicto con otro paquete, intentad ejecutarlo de nuevo pero agregando la opción –replacefiles, debería solucionarlo. Entonces nos movemos a /usr/share/festival/voices/spanish y allí debería existir un directorio de nombre JuntaDeAndalucia*.

Puede que la ruta donde se ha instalado esta estructura de directorios no sea la correcta, para saber cual es la ruta correcta, podemos ejecutar el comando festival, y entraremos en la CLI, y ejecutamos el comando voice-path:

festival> voice-path
("/usr/share/festival/lib/voices/"
"/usr/local/share/festival/lib/voices/")

Ese comando nos dará la ruta correcta donde debe ser ubicada la carpeta Spanish, que estaría dentro de JuntaDeAndalucia* que nos ha generado el instalar el paquete festvox-palpc16.

Si ejecutamos el comando voice_default  veremos la voz que se esta usando por defecto. Como ultimo tip, con el comando voice-locations veremos si nos ha encontrado nuestro paquete de voz en español correctamente.

festival> voice-locations
((JuntaDeAndalucia_es_sf_diphone
. "/usr/share/festival/lib/voices/spanish/JuntaDeAndalucia_es_sf_diphone/")
(JuntaDeAndalucia_es_pa_diphone
. "/usr/share/festival/lib/voices/spanish/JuntaDeAndalucia_es_pa_diphone/")
(nitech_us_slt_arctic_hts
. "/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts/"))

A continuación debemos descargar el script en Perl del gran Zaf desde aquí: https://github.com/zaf/asterisk-googletranslate/zipball/master  y al igual que en la entrada anterior debemos ubicarlo en la ruta /var/lib/asterisk/agi-bin. Para este fichero, al igual que para el fichero de reconocimiento de voz con la API de Google Cloud debemos generar una clave de API, o reusar la misma que ya teníamos, el procedimiento para esto está descrito en éste post.

3
Imagen 2. Fichero googletranslate.agi – Clave de API

Una vez tengamos nuestra clave de API correctamente situada en el fichero, como se ve en la foto superior nos vamos al fichero extensions.conf y vamos a crear un nuevo contexto al que llamaremos gtranslate y le asignaremos la extensión 777:

4.JPG
Imagen 3. Nuevo contexto gtranslate.

Paso a explicar que hace cada linea:

[gtranslate]

exten => 777,1,Answer(); respondemos automáticamente

same => n(inicio),Festival(A continuación diga el texto a traducir); le damos el nombre inicio a esta prioridad. Ejecutamos festival.

same => n,agi(speech-recog.agi,es,2,#);Usamos el script para el reconocimiento de voz, decimos algo, en este caso en Ingles.

same => n,agi(googletranslate.agi,”${utterance}”,es); Usamos el script para llevar a Google la variable $utterance que contiene lo que hemos dicho en Ingles, lo traducimos a Español.

same => n,Festival(${gtranslation}); usamos festival para que mediante TTS diga lo que le ha devuelto Google Translate en Español.

same => n,Goto(777,inicio); volvemos a la prioridad inicio

He estado jugando un rato con esto y la verdad que queda bastante interesante, dejo una captura de como queda funcionando:

Capture
Imagen 4. Resultado

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s