Reconocimiento de voz con Google ASR en Asterisk y TTS con Festival. Parte 4

Esta entrada ha quedado obsoleta con respecto a la configuracion de Google ASR, dirigete a la siguiente entrada donde he configurado Google ASR en Asterisk 15 sobre CentOS.

Buenas! hoy vamos hacer una de las dos cosas más entretenidas de Asterisk, desde mi punto de vista, claro. Para realizar el reconocimiento de voz utilizaremos un script en Perl creado por Zaf, y para pasar de texto a voz utilizaremos el software Festival.

Lo que realizaremos será un menú al que se entrará a través de la extensión 666, una voz te dirá que digas el numero al que deseas llamar (Festival) y después de unos segundos, se te responderá repitiendo la extensión que has dicho y avisándote de que se esta estableciendo la comunicación (Google ASR).

. Si no se te llegase a entender, te pediría que lo repitieses, y si dijeses otra cosa que no fuese un numero de extensión válido también te lo haría saber.

Lo que realiza el script es tomar la información en audio y pasarla a los servidores de Google, transcribirla y volver a traer el texto devuelta. El script que realiza esta acción trabajará con dos variables:

  • utterance: Lo que has dicho transcrito.
  • confidence: La posibilidad de 0 a 1 que tiene de ser correcto, normalmente cuando el valor es inferior a 0.8 la grabación no es muy buena, y lo que se ha dicho puede distar mucho de lo que se devuelve transcrito.

Sabiendo esto, podemos empezar con la descarga del script e instalación y configuración de Festival.

Antes que nada, para poder utilizar el script necesitaremos una Key especial, esta nos será proporcionada por Google, y como veremos más adelante, el Script la solicitará. Para conseguirla debemos realizar los siguientes pasos:

NOTA: La API de Google Speech Recognition ha quedado obsoleta, por lo tanto ha dejado de funcionar, ahora Google esta haciendo uso de la API: Google Cloud Speech Recognition, dirigite al final de la entrada para ver como activar la API y los cambios que se deben hacer.

  1. Primero acceder aquí y hacernos miembros del foro de desarrolladores de Chromium.
  2. Segundo, debemos ir aquí  y una vez dentro crear un ‘Nuevo proyecto‘.
  3. Después, en la parte izquierda haremos clic en ‘Apis & Auth‘ y después en ‘API’
  4. En la parte derecha buscaremos Speech API y la habilitaremos.
  5. Con la API de reconocimiento de voz activada, debemos ir a la pestaña ‘Crendentials/Credenciales‘ del panel izquierdo.
  6. Una vez allí haremos clic en ‘Añadir credenciales‘ –> ‘Clave de API‘ –> ‘Clave de Servidor’ –> ‘Crear
  7. Y nos saldrá una clave que empezará por: AIzaSyB*
  8. La guardamos como oro en paño

Nota: tener en cuenta que si no os hacéis miembros del foro, no encontrareis la API de reconocimiento de voz. Utilizar la misma cuenta con la que os registráis en el foro para acceder a console.developers.google.com.

Una vez tengamos la key vamos a descargar el  susodicho script desde la siguiente página https://github.com/zaf/asterisk-speech-recog/tarball/master y a continuación haremos lo siguiente:

david@linux:/home/david/Descargas $ tar xvfz zaf*
david@linux:/home/david/Descargas $ cd zaf*
root@linux:/home/david/Descargas # mv speech-recog.agi /var/lib/asterisk/agi-bin

Yo muevo el Script a ese directorio ya que por defecto es en el que Asterisk busca los ficheros .agi. Si el vuestro no fuese el mismo, tendríais que mirar el fichero asterisk.conf como bien comente en la primera entrada, o si no ejecutar:

david@linux:/home/david/Descargas # mv speech-recog.agi `cat /etc/asterisk/asterisk.conf | egrep -i agidir | awk '{print $3}'`

Ahora debemos editar el fichero y añadir nuestra Key a la variable $key, lo haremos con nuestro editor preferido:

my $key = ""; debería quedar my $key = "AIzaSyB**todo lo demás"

A continuación, debemos instalar las dependencias que necesita el script para trabajar, así que ejecutaremos:

root@linux:/# apt-get update && apt-get upgrade && apt-get install perl libwww-perl libjson-perl flac

Acto seguido instalaremos Festival, y descargaremos un paquete para voz en Español, que será utilizado por Festival:

root@linux:/root# apt-get install festival festival-dev
 root@linux:/root# wget http://forja.guadalinex.org/frs/download.php/153/festvox-palpc16k_1.0-1_all.deb
 root@linux:/root# dpkg -i festvox*

El paquete festvox, como comenté, es para activar el soporte en Español de Festival, si queréis, antes de instalarlo, podéis hacer una prueba ejecutando:

root@linux:/root# cat > fichero-tts
 Hola, esto es una prueba.
 ^C
 root@linux:/root# festival --tts fichero-tts

Y luego probar a hacer lo mismo, pero una vez instalado el paquete Festvox, para detallar la notoria diferencia entre una voz y otra.

Con esto ya podemos empezar a crear el menú/extensión en extensions.conf, así que empezamos:

[internas]
 ... Contenido anterior ...
 include => google-asr; Incluimos la extensión Google-asr en Internas para que cuando llamemos con Usario/SIP que tenga asociada la extensión internas también pueda utilizar la extensión Google-asr.

[google-asr]

exten => 666,1,Answer(); contestamos automáticamente la llamada.
 same => n,Festival(Diga el numero de extensión con la que desea comunicarse); Utilizamos la aplicación Festival para pasar de Texto a voz, y por parámetro pasamos lo que queremos que diga.
 same => n(grabacion),agi(speech-recog.agi,es,2,#); Le asignamos el nombre grabación a esta prioridad de la extensión para luego poder volver a ella con un Goto, utilizamos el Script de Perl , idioma español, 2 segundos de timeout , y # tecla de interrupción/finalización.
 same => n,Verbose(1,Lo que dijiste fue: ${utterance}); Verbose muestra un mensaje solo en la consola de Asterisk, es decir que nos enseña el contenido de la variable utterance.
 same => n,Verbose(1,La probabilidad de ser correcto es: ${confidence}); Más de lo mismo pero con la variable confidence.
 same => n(comprob),GotoIf($["${confidence}" < "0.9"]?667,1); Le asignamos el nombre comprob a esta prioridad para volver a ella con un Goto, creamos una condición: Si el valor de confidence es menor que 0.9, vamos a la extensión 667 prioridad 1.
 same => n,Verbose(1,La cantidad de caracteres que tiene utterance es: ${LEN(${utterance})}); Mostramos en la terminal la cantidad de caracteres que tiene utterance.
 same => n(comprob-sip),GotoIf($[${LEN(${utterance})} > 3]?668,1); Si la cantidad de caracteres de utterance es mayor que 3, nos vamos a la extension 668 prioridad 1.
 same => n,Festival(Comunicando con la extension ${utterance}. Espere por favor.); Pasamos de texto a voz con Festival y le decimos al interlocutor que numero le hemos entendido y al que estamos marcando.
 same => n,Dial(SIP/${utterance},20); Utilizamos la aplicación Dial para llamar al numero dicho por el interlocutor.
 same => n,Hangup(); Se termina la llamada.

exten => 667,1,Festival(No le hemos entendido. Repita por favor); Si el valor de Confidence era menor a 0.9 llegamos a esta extensión, aqui le pedimos que repita que no le hemos entendido.
 same => n,Goto(666,grabacion); Nos vamos de vuelta a la extensión 666 prioridad con nombre Grabación.
 
exten => 668,1,Festival(Eso no es un numero de extensión valido. Vuelva a intentarlo); Si el numero de extensión tenía más de tres caracteres llegábamos aquí para comunicar que no era valido.
 same => n,Goto(666,grabacion); Nos vamos de vuelta a la grabación

Ahora, debemos ejecutar:

root@linux:/root # festival - -server &

Y con eso tendríamos hecho el reconocimiento de voz con Google ASR y TTS con Festival, solo bastaría realizar una llamada desde el Smartphone con la App Zoiper (o bien desde la aplicación instalada en Linux), a la extensión 666.

Hasta aquí llego con las entradas de Asterisk, de momento, así que a practicar, a hacer pruebas, y cualquier duda, comentadla!

Actualización 04/03/2017

Cuando se hace uso de la antigua API y la correspondiente Key, en la CLI de Asterisk veremos el fallo: Unable to get recognition data, el siguiente procedimiento se realizara para activar y hacer uso de la API de Google Cloud Speech Recognition.

  1. Ir a la consola de Google Cloud: https://console.cloud.google.com/?hl=es
  2. Como ya tendremos un proyecto creado, simplemente iremos a la lupa que esta en la parte superior y escribiremos “Google Cloud Speech API“, seleccionamos la API que nos aparece.
    Sin título2
    Imagen 1. Habilitar Google Cloud Speech API
  3. Sinceramente desconozco si con la Key generada anteriormente para la API antigua nos valdrá, yo por si acaso he generado una nueva Key, recordar que para generarla, en la misma pantalla donde estábamos una vez activada la API en el menú de la parte izquierda veremos una llave que pone ‘Credenciales’. Hacemos clic allí y luego ‘Crear credenciales’ –> ‘Clave de API’–>Copiamos la Key/Clave generada y cerramos.
  4. Según lo que he podido entender aquí, para poder hacer uso de la API de Google Cloud Speech debemos asociar un Perfil de facturación al proyecto donde hemos activado la API, esto es básicamente poner tu tarjeta de crédito/débito, ademas si es primera vez que usas Google Cloud, tendrás un año gratis y 300$ para utilizarlos en la plataforma. Google dice: “La tarjeta de crédito/débito no es para cobrarte, es simplemente para saber que no eres un robot”
  5. Descargar el nuevo script en Perl que Zaf ha adaptado para la nueva API, desde: https://github.com/zaf/asterisk-speech-recog/blob/master/speech-recog.agi
  6. Debemos mover el nuevo Script a /var/lib/asterisk/agi-bin
  7. Editar el fichero y añadir la Key generada en el paso 4. Al principio del fichero veréis la variable $Key.
  8. Probar de nuevo.

Dentro del Github de Zaf (aquí) hay un fork en Python (este) creado por Invitecomm, por si no os funcionase el de Zaf, aunque este ultimo requiere de más pasos, está muy bien documentada la instalación en el mismo enlace.

16 comentarios sobre “Reconocimiento de voz con Google ASR en Asterisk y TTS con Festival. Parte 4

  1. Muchas gracias por tu respuesta Deivid, tu has probado realizar la prueba de Google ASR en Asterisk y TTS en alguna distro basada en Centos?
    ¿O Podrías compartirme un ova, ovf o alguna plantilla donde tu ya lo tengas funcionando? es para un proyecto universitario, ya lo intenté de varias formas y no me funciona.
    saludos

    1. Buenas de nuevo Elucas.

      No, las pruebas las he hecho con Ubuntu en su tiempo y en la última actualización del post, lo probe con Debian.

      Las pruebas en Ubuntu las hice hace mucho tiempo y no tengo ningún .ova, y la última prueba está en mi máquina local.

      ¿Que problema tienes exactamente?

  2. Donde consigo la versión basada en debian de asterisk? ya que elastix y freepbx están para descarga en version basada en centos.

  3. speech-recog.agi,es,2,#: Unable to get recognition data.
    Parace que muchas gentes tienen mismo problema.
    cuando activa este servicio, la aplicacion speech-recog.agi no es capaz de captura la voz.

    1. Buenas Angel, ya he detectado lo que ocurre, por lo visto Google ha dejado ‘obsoleta’ la API de Speech Recognition, y ahora está usando la API Google Cloud Speech Recognition.

      He visto que Zaf ha modificado el Script en Perl para que funcione con la nueva API, mañana lo probaré y actualizaré la entrada.

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. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s