TTS y ASR

De Asterisk Wiki
Ir a la navegación Ir a la búsqueda

Los sistemas Text-To-Speech (TTS) y Automatic Speech Recognition (ASR) están basados en la idea de crear una relación entre las personas y los ordenadores a través de medios de audio. Podrían considerarse dos los medios de entrada y salida más comunes en un entorno de telefonía más avanzada.


Introducción

Es posible profundizar en la intención de estos conceptos, si tenemos en mente presente, la idea de crear un sistema de Interacción por Voz (IVR).

Partiendo por base que Automatic Speech Recognition, es la traducción de Reconocimiento de Voz Automático, recuerda al concepto que introducir en el sistema una secuencia de audio, que este la procese, y la transforme en un tipo de dato que sea más manejable por el mismo, como un mecanismo de entrada de información. Esta "traducción" suele realizarse con mecanismos bastante complejos, y por regla general suelen ser soluciones muy costosas a nivel económico, dado la complejidad que acarrean.

En contrapartida, Text to Speech, traducción de Texto a Voz, sería justo lo opuesto, pasando de un medio escrito, por regla general, más controlable por los ordenadores hoy en día dado que la mayoría de los entornos informáticos se encuentran basados en este medio, realizar una conversión a Audio, basándose en un sistema de voces pregrabadas, pronunciación y entonación capaz de vocalizar cualquier combinación de letras en forma de palabra, y también considerando otros aspectos más específicos como la fonética y acento de cada tipo de lenguaje. Existen soluciones libres, ya que la complejidad no es tanta, si lo equiparamos a los sistemas ASR, pero es cierto, que en este caso, al requerirse una voz humana real, los costes principalmente recaen sobre esta labor.

Text to Speech

El funcionamiento de los sistemas Text-To-Speech, radica en la idea, de recibir una cadena de Texto, considerar algunas variables adicionales como el idioma (cara a la fonética específica), y reproducir una pista de audio que suene tal y como una persona lo diría, intentando que sea de la forma más natural posible.

Para conseguir esta naturalidad, hay que considerar que aunque grabáramos un sonido para cada letra del abecedario tal como suena, hay algunos idiomas como el inglés que no son "fonéticamente directos", por tanto es necesario utilizar técnicas adicionales, como diccionarios de fonética, múltigrabaciones por cada letras (en función de las posibles variantes), etc. También intervienen los acentos ortográficos, que pueden hacer que varíe la entonación, y esto quiere decir, quizá hacer énfasis en una vocalización, u otros aspectos específicos de la fonética. Podríamos decir, que este, llamémosle, algoritmo, es el sistema que distingue la calidad de los diferentes sistemas de "Texto a Voz", también llamados Synthesis, (Síntesis de Voz).

Estos sistemas ya se utilizaban hace muchos años, de hecho existen registros de Bell Labs casi desde los inicios de la telefonía, aunque realmente la Síntesis de Voz basada en sistemas de Ordenador, surgió a partir de los años 60, y con la proliferación de la "telefonía 2.0" su avance ha sido acelerador hasta niveles bastante sofisticados.

En cuanto a lo que se refiere a TTS en Asterisk existen múltiples sistemas, libres, y con licencia, citamos los más conocidos:

  • Integración Festival, que viene incorporado dentro de Asterisk como un modulo específico
  • Cepstral , TTS Oficial de Digium es el TTS que recomienda Digium al ser Partner con Cepstral LLC
  • Google TTS, es un sistema On-Demand de Google, que realmente no cumple el propósito como tal, sino que originalmente se ofreció como servicio para ofrecer fonética en el sistema de Traducción de Google [1] para Google Chrome

Festival

Centre for Speech Technology Research

El sistema Festival TTS fue desarrollado originalmente por Alan W. Black, en la Universidad de Edimburgo, y distribuido con una licencia BSD como un programa Open Source. Prácticamente de los inicios de Asterisk, fue integrado ya que incorporaba las ventajas de un TTS sin coste ninguno, y desde entonces se ha convertido en el TTS de Asterisk por excelencia. Pero en contrapartida, dado que la calidad de los TTS, no tanto radica en sus algoritmos como también en las voces, quizá Festival sea de los menos sofisticados en este ámbito, aunque se han realizado varios intentos, con voces profesionales, la calidad de los resultados todavía deja mucho que desear.

En Asterisk esta basado en un módulo de tipo aplicación específica, app_festival.so como Festival realmente es una integración con Asterisk, los módulos hay que instalarlos aparte.

Instalación

Festival no esta instalado por defecto en nuestro sistema [2], y es muy probable que la aplicación Asterisk tampoco, así que seguramente necesitemos recompilar para introducirlo.

Para lo primero simplemente lanzamos:

# sudo aptitude install festival


Por otro lado, hay que instalar el modulo, dentro del directorio que descargamos las fuentes de Asterisk (posiblemente /usr/src), procedemos a ejecutar make menuselect, se encuentra dentro de Applications -> Extended el módulo en si. Marcandolo, seguimos la guía de instalación de Asterisk de nuevo, para recompilar. Aunque simplemente podemos compilar con

# make


Y luego copiar el modulo que nos interesa (<directorio_fuentes_asterisk/app/app_festival.so) al directorio de módulos por defecto, por ejemplo:

# cp /usr/src/asterisk-src/app/app_festival.so /usr/lib/asterisk/modules/


Y ya supuestamente quedaría cargado:

CLI> module show like app_festival.so
Module Description Use Count
app_festival.so Simple Festival Interface 0
1 modules loaded


Ahora necesitamos voces en Español para Asterisk. Tenemos disponibles dos opciones:

  • Voces para la Junta de Andalucía en la forja de Guadalinex, en este caso son descargables de http://forja.guadalinex.org/frs/?group_id=21
  • Voces "oficiales" para Festival, se pueden descargar de los repositorios de Linux:
# sudo aptitude install festvox-ellpc11k


Para un ejemplo, vamos a descargar las de Silvia:

# wget http://forja.guadalinex.org/frs/download.php/154/festvox-sflpc16k_1.0-1_all.deb


# sudo dpkg -i festvox-sflpc16k_1.0-1_all.deb


Y borramos el fichero de configuracion de festival que crea automaticamente, para poder utilizar mejor, el generico de Festival.

# rm /etc/festival.scm


Hay que considerar que al instalar el paquete DEB con la voz, esta queda automaticamente instalada en la ruta /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_sf_diphone

Ahora necesitamos modificar el archivo de configuracion de Festival, festival.scm por defecto ubicado en /usr/share/festival/ al final del fichero agregamos:

Archivo: /usr/share/festival/festival.scm
(set! voice_default ‘voice_JuntaDeAndalucia_es_sf_diphone)
(define (tts_textasterisk string mode)

(let ((wholeutt (utt.synth (eval (list ‘Utterance ‘Text string)))))
(utt.wave.resample wholeutt 8000)
(utt.wave.rescale wholeutt 5)
(utt.send.wave.client wholeutt)))

(set! server_access_list ‘(“localhost\\.localdomain” “localhost”))


Como parámetros más significativos:

  • voice_default: Es el nombre del paquete de voces que queremos utilizar
  • El resto de los parámetros son específicos de Festival[3]

Así nos permitirá por un lado utilizar la voz de Silvia y por otro lado arrancar el servidor Festival. También necesitamos configurar el servidor Festival, bajamos los ficheros de desarrollo de festival:

# sudo aptitude install festival-dev


Y copiamos el fichero de autoarranque de festival a nuestro /etc/init.d para que arranque automáticamente el servidor cada vez que iniciemos nuestra maquina Asterisk:

# sudo cp /usr/share/doc/festival/examples/festival.init /etc/init.d/festival


# chmod +x /etc/init.d/festival


Antes de arrancar el servidor de Festival para Asterisk, necesitamos añadir una linea en /etc/default/festival:

Archivo: /etc/default/festival
RUN_FESTIVAL = yes


Y ahora si podemos arrancar el servidor Festival para Asterisk con éxito:

# sudo /etc/init.d/festival start


Y para que arranque cada vez que iniciamos el sistema:

# ln -s /etc/init.d/festival /etc/rcS.d/S99festival


Consideración:: La version 1.0-1 de Guadalinex para Pedro parece que esta mal empaquetada. Instala sobre la versión de Silvia (es_sf) en vez de (es_pa):

Se puede resolver de varias formas, una es, bajando las fuentes (Archivos de desarrollo de la voz de Pedro) en el directorio correspondiente /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone

Necesitamos desempaquetar tambien el .deb de Pedro con el comando “ar”:

# ar x festvox-palpc16k_1.0-1_all.deb


Y luego descomprimir data.tar.gz y a través de la estructura de directorios llegar a …/usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group, cambiamos el nombre al fichero que hay y lo copiamos a un nuevo directorio group dentro de nuestro directorio de Pedro antes creado

# sudo mkdir /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group


# sudo mv sflpc16k.group /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group/palpc16k.group


Aplicación Festival

La aplicación que ofrece el módulo app_festival, simplemente se encarga de conectar al servidor Festival, lanzar el texto que queremos convertir a voz, y recoger la misma para pasarsela al canal activo.

La sintaxis de esta aplicación es la siguiente: Festival(<texto_a_reproducir>,<teclas_interrupción>)

  • Por un lado como es evidente podemos poner el Texto que queremos reproducir
  • Por otro lado, podemos definir que teclas podría interrumpir la reproducción, si ponemos 'any', cualquier tecla lo haría

Google TTS

Logo Google

Hay que considerar que Google, ofrece un sistema Text-To-Speech, cuando utilizamos su servicio Translate. Aunque Google no ofrezca un API oficial para poder trabajar con esta "aplicación" es posible utilizarla con medios no demasiado ortodoxos a priori, dado que no esta confirmado que su uso por desconocimiento de Google pueda traer repercusiones legales.

A través de la URL, http://translate.google.com/translate_tts?tl=es&ie=UTF-8&q= podemos pasar una linea de texto, y esta creara un fichero de audio, que será reproducida en este caso, utilizando una voz adaptada al idioma Español.

La "sintaxis" de la URL sería: http://translate.google.com/translate_tts?tl=<idioma>&q=<texto_a_reproducir>.

  • El idioma, esta compuesto de dos letras, por el código de idiomas estándar
  • El texto puede introducirse entre comillas y contener varios tipos de carácteres, en codificación ascii

Aplicación AGI

Realmente no podríamos considerarlo una instalación, ni existe una aplicación propia de Asterisk para utilizar este medio, aunque puedan haberse desarrollado aplicaciones no oficiales. Una de las alternativas válidas más interesante sería crear un algoritmo basado en un lenguaje de programación y ejecutarlo gracias a la interfaz AGI

La idea del mismo sería: utilizando al URL antes descrita, hacer creer a Google, que nos conectamos a través de un navegador estándar, y descargarnos el fichero de audio, que será el que reproduzcamos a continuación en nuestro sistema

Para la descarga podemos utilizar el comando:

# wget --header='User-Agent:Mozilla/4.0' 'http://translate.google.com/translate_tts?tl=es&q ="Texto a Reproducir"' -O /tmp/google-tts.mp3


Y luego convertirlo a un formato fácilmente reproducible por Asterisk, directamente al directorio de sonidos de Asterisk:

# sox /tmp/google-tts.mp3 -r 8000 -c 1 -t raw -s /var/lib/asterisk/sounds/google-tts.sln


Y con aplicaciones como Playback, ya podríamos reproducirlo sin problemas.

Un ejemplo de este Algoritmo, si tenemos PHP-AGI en nuestra máquina, dentro del directorio /var/lib/asterisk/agi-bin podemos crear el siguiente script:

Archivo: /var/lib/asterisk/agi-bin/asterisk-tts.php
#!/usr/bin/php -q
<?php
require_once(‘phpagi/phpagi.php’);
$agi = new AGI();
$traduccion = $argv[1];

// Aqui descargamos el fichero Mp3 haciendo pensar a Google que somos un Navegador
shell_exec("wget –header='User-Agent:Mozilla/4.0' 'http://translate.google.com/translate_tts?tl=es&ie=UTF-8&q =".$traduccion."' -O /tmp/google-tts.mp3″);
// Y convertimos el fichero con “lame” a wav que es reconocible por Asterisk
shell_exec("sox /tmp/google-tts.mp3 -r 8000 -c 1 -t raw -s /var/lib/asterisk/sounds/google-tts.sln");

$retString = "Fin de la conversion";
$agi->verbose($retString);
?>


# chmod +x /var/lib/asterisk/agi-bin/asterisk-tts.php


Con esta aplicación AGI, ejecutando la aplicación AGI, con un argumento (el texto que queremos reproducir), tendriamos el resultado esperado:

Archivo: /etc/asterisk/extensions.conf
exten => 200,1,Answer()
same => n,Set(TTSVAR="Texto de Prueba")
same => n,AGI(asterisk-tts.php,${TTSVAR})
same => n,Playback(google-tts)
same => n,Hangup()


Automatic Speech Recognition

Este sistema, podría considerarse el más complejo, dado que debe procesar un frase en forma de sonido, e interpretando su onda, utilizar un algoritmo para intentar asociarla a distintos sonidos, fonéticas, y pronunciaciones para conseguir convertirla en un texto.

Hay que considerar que antiguamente, se utilizaban sistemas "de entrenamiento" en los cuales, existían unos parámetros por defecto y un sistema de reconocimiento estándar, y tras la lectura repetida por un usuario de determinado texto, se conseguía ajustar el volumen y el tono de la voz, para que el reconocimiento fuera eficiente.

El problema es que con el surgimiento de la telefonía 2.0, no podríamos realizar "entrenamientos" de voz, debido a que en el caso de un llamante que se pudiera en contacto con un sistema que implementara una solución ASR, tendría que tener resultados "a la primera". Por ello los algoritmos se desarrollaron más allá, y ahora se han conseguido soluciones de bastante calidad. Las dos más populares y destacados en este momento son Siri [4] (desarrollado por SRI Venture Group) y Google Voice Actions [5]

Pero a parte de estos, también existen sistemas ASR adaptados para Asterisk exclusivamente, aunque en su inmensa mayoría, en la actualidad son soluciones licenciadas, entre las siguientes, aquellas que soportan integración con el idioma Español:

  • [Verbio], es un ASR Español, popular en Asterisk, y con licencia, propiedad de Verbio Technologies S.L.
  • [CMU Sphinx] es un proyecto Open Source para crear un sistema ASR [6], muy difícil de integrar con Asterisk y que funcione aceptablemente.
  • [Audimus], ofrece también integración directa con Asterisk, propiedad de Tecnologias de Processamento da Fala, SA
  • [LumenVox] es el ASR que recomienda Digium al ser Partner con LumenVox, LLC
  • Google ofrece también una solución online ASR, para su servicio Google Translate.

Google ASR

Considerando el ASR que ofrece Google, para su sistema Google Translate, vamos a llamarlo así, por ponerle un nombre. Quizá sea una extensión de Google Voice Actions, y muy probablemente, ambas aplicaciones (Android y Translate), utilicen el mismo servicio, para convertir los comandos de voz, en mensajes de texto.

De igual forma, es curioso observar, como ocurre con Google TTS, que sería posible utilizar este servicio de forma extraoficial, dado que tampoco existe una API que ofrezca Google expresamente para ello.

Toda la base radica en la siguiente URL: http://www.google.com/speech-api/v1/recognize?lang=es_ES

Podemos observar que solo recibe un parámetro, lang, el cual se conforma siguiendo el esquema de nombres de Unix Locale.

A esta URL es posible pasarle un fichero de audio en formato flac y devolvería una cadena de texto, en formato Java Script Object Notation (JSON). Evidentemente, uno de los parametros de esta secuencia, es el texto resultante de la interpretación de la pista de audio.

Aplicación AGI

Exactamente como ocurre con Google TTS, no puede considerarse una aplicación como tal, pero si conseguimos sintetizar un sencillo algoritmo para reproducir el concepto por el cual, podemos pasar un mensaje de Audio (por ejemplo una o varias palabras que dice un usuario), la grabación de las mismas en un formato de audio, pasarla al sistema Google ASR y luego recoger el texto que este nos devuelve.

Consideremos que tenemos en el directorio de sonidos de Asterisk, un fichero resultante de una grabación de audio llamado 'grabacion-asr.wav.

Ahora tenemos que convertir esta grabación a formato flac ejecutando el comando:

# sox /var/lib/asterisk/sounds/grabacion-asr.wav /tmp/grabacion-asr.flac


Y podemos lanzar este fichero flac a la dirección para recibir la secuencia JSON:

# wget --post-file /tmp/grabacion-asr.flac --header='Content-Type: audio/x-flac; rate=8000' -O - 'http://www.google.com/speech-api/v1/recognize?lang=es_ES' > grabacion-asr.txt


Podemos observar el resultado dentro del fichero grabación-asr.txt como lo siguiente:

{"status":0,"id":"1e22c2ddf17f9875486168df20ddb8a7-1","hypotheses":[{"utterance":"sonido grabado","confidence":0.8575129}]}

La estructura sería algo como:

  • status: un código de estado, no tenemos información al respecto
  • id: un identificador único
  • hypotheses: parámetros específicos del ASR
    • utterance: el texto convertido de la pista de audio
    • confidence: el grado de confianza según la calidad del audio y el parecido a sus registros

Interpretando esta linea JSON, podríamos quedarnos en esencia principalmente con utterance y confidence. Con este último, ya que por ejemplo, si establecemos un umbral pongamos en 0.8, si este valor es inferior a este umbral, podemos especificar a nuestro sistema Asterisk, que obligue al llamante, repetir el comando para su grabación y asegurarnos un poco más que el texto recibido (uterance), casi siempre va a ser correcto.

Todo esto podría sintetizarse en un script PHP, utilizando la interfaz AGI con la adaptación PHP-AGI. Una instancía sencilla de este ejemplo podría ser:

Archivo: /var/lib/asterisk/agi-bin/asterisk-asr.php
#!/usr/bin/php -q
<?php
require_once(‘phpagi/phpagi.php’);
$agi = new AGI();
$agi->answer();
// Primero convertimos el fichero que generamos desde Asterisk a formato FLAC (que es el que admite Google)
shell_exec(“sox /var/lib/asterisk/sounds/grabacion-asr.wav /tmp/grabacion-asr.flac”);

// Despues lanzamos una peticion a Google para que nos convierta el fichero FLAC en texto, nos devuelve una cadena de texto formato JSON
$linea = shell_exec(“wget –post-file /tmp/grabacion-asr.flac –header=’Content-Type: audio/x-flac; rate=8000′ -O – ‘http://www.google.com/speech-api/v1/recognize?lang=es_ES’”);
// Convertimos esa cadena JSON gracias a PHP en un objeto directamente
$obj = json_decode($linea);
// Sacamos el valor utterance
$valorasr = $obj->{“hypotheses”}[0]->{“utterance”};

// Pasamos el texto a Asterisk en forma de variable de canal
$agi->set_variable("TEXTOASR", $valorasr);
$agi->verbose($retString);
?>


# chmod +x /var/lib/asterisk/agi-bin/asterisk-asr.php


En este caso, realizaría el algoritmo anteriormente explicado, y guardaría el resultado en una variable de canal llamada TEXTOASR.

Aplicación AGI mejorada

Existe una aplicación AGI [7] más elaborada que realiza toda la gestión centralizada, y devuelve variables de canal llamadas uterance y confidence.

La explicación del uso de dicha aplicación puede verse en la página del autor

La sintaxis de esta aplicación es la siguiente: AGI(speech-recog.agi,<idioma>,<tiempo_de_espera>,<tecla_interrupcion>,<sin_beep>)

El procedimiento de la aplicación ejecutada sería, graba una pista de audio con lo dicho, y espera hasta que haya 3 segundos de silencio, en ese caso, intenta hacer la conversión y según hemos visto antes guarda la información en dos variables de canal uterance y confidence:

  • idioma: podemos definir el idiomade la conversión
  • tiempo_de_espera: cambia el tiempo de espera de silencio de 3 segundos a los segundos aquí especificados
  • tecla_interrupcion: si queremos parar la grabación. por defecto es la tecla #
  • sin_beep: si queremos evitar que suene un sonido "beep" antes de empezar la grabación.

Referencias

  1. Google Translate Google Inc.
  2. Instalación Festival Asterisk en 10000 Horas, Manuel Camargo (2011)
  3. Manual de Festival, Alan W. Black, Paul Taylor y Richard Caley 1999
  4. Siri, Apple Inc (2011)
  5. Google Voice Actions Google Inc (2009)
  6. Integración Sphinx en Asterisk, Lia Wagner, VoipInfo (2006)
  7. Asterisk Google ASR, Lefteris Zafiris (2012)

Véase también

Enlaces Externos