Reconocmiento de voz en asterisk con Lumenvox

Hoy toca ración de reconocimiento de voz :). Hace tiempo compré una licencia de evaluación (50$) para hacer pruebillas e impresionar al personal. En su día solo tenían el modelo de voz Inglés Americano, y para reconocer palabras en español tenías que hablar como un expresidente del gobierno ;). Pero han estado trabajando en ello, y ya tienen modelos específicos para español de Mejico y de Colombia.

Os voy a poner una ejemplo muy simple: el dialplan, la gramática, y un softphone web para que lo probéis de viva voz.

Paso 1: Instalar Lumenvox

Como he comentado antes, es un programa de pago,a sí que tendréis que adquirir al menos el Speech Starter Kit. La instalación y validación es algo cansina, pero que se le va a hacer. Seguid al pie de la letra las instrucciones que os llegarán por email. Básicamente se reduce a:

  1. Descargar e instalar el License Server.
  2. Generar el fichero de instalación (Info.bts), enviarlo a Lumenvox mediante el formulario web, y descargar el fichero con la licencia (License.bts). Estará asociado a la MAC de la tarjeta de red.
  3. Descargar e instalar el SRE (Speech Recognition Engine)
  4. Instalar el “Asterisk Connector Bridge”, que enlaza los servicios de voz de asterisk con el SRE de lumenvox.

Paso 2: Gramática

El sistema tiene que saber las frases que queremos detectar. Ejemplo:

root $frase
$sujeto = Pedro | Juan
$verbo = programa | estudia | sueña
$predicado = [ en ] C | PHP | AEL
$frase = $sujeto $verbo $predicado

Esta gramática reconocería frases como “Juan sueña en PHP”, “Pedro estudia C”, etc

Aquí es donde gana importancia el modelo de voz. Si usasemos el model Inglés, en vez de Pedro, habría que pronunciar algo como “Pedrou” ;), para que el sistema lo reconociese mejor.

Las gramáticas pueden ser muy complejas. Hay un ejemplo en la web de Lumenvox que simula la atención al cliente de una Pizzería, donde puedes realizar un pedido hablándole a la máquina (que miedo), aunque para el ejemplo que voy a mostraros, simplemente reconocerá una serie de nombres.

Paso 3: El Dialplan

Asterisk 1.4 ya incorpora funciones de reconocmiento de voz. Solo necesita de un motor que haga el reconocimiento y devuelva la información. Ejemplo:

exten => s,1,Answer
exten => s,n,Wait(1)
exten => s,n,SpeechCreate
exten => s,n,SpeechActivateGrammar(migramatica)
exten => s,n,SpeechStart
exten => s,n(otravez),SpeechBackground(beep)
exten => s,n,NoOp(${SPEECH_TEXT(0)})
exten => s,n,Goto(otravez)

Paso 4: El Ejemplo

Será un directorio de blogs con temática voip ;). El sistema reconocerá una serie de nombres, y contestará con la dirección del blog/página web. Para finalizar, se podrá decir “hasta luego” o “ya es suficiente”. Después de cada reconocimiento, se escuchará la calidad del resultado (de 0 a 1000).

No se por qué, pero he tenido que utilizar fonemas para que me reconociese bien todos los nombres. Debería bastar con el nombre directamente, pero bueno. Con frases más largas funciona mejor.

Descarga la gramática asteriskes.gram

Prueba el sistema en vivo y en directo: Abrir jiaxclient (a ver si no se satura la ADSL)

También podeis llamar desde asterisk:

exten => 123,1,Dial(IAX2/jiaxclient@voip.julianmenendez.es/demo)

Escrito por julianjm el 19/10/2007. | Comments (10)
Tags: , , , ,

Bug en manejo de eventos rfc2833 en asterisk

Desde que migré a Asterisk 1.4 no he podido usar mi cuenta de Azulcom para hacer llamadas salientes. No ha sido hasta hoy, después de confirmar que el problema era Asterisk 1.4, que he encontrado la causa del problema.

Todo viene por el tratamiento de eventos RFC2833. Cuando tenemos dtmfmode=rfc2833, cuando asterisk recibe uno de estos paquetes RTP, lo “decodifica”, y se lo reenvía a la otra parte. Es en este momento cuando asterisk interpreta que todo lo que sea RFC2833 debe ser un dígito multifrecuencia (0123456789*#ABCDX, la X es un hook flash), cuando la realidad es que hay muchísimos más eventos que estos 16, y no deben ser interpretados como DTMF.

En el caso concreto que comento, llegaba un evento 0×8f (143), que según el RFC, corresponde a “MF S3″. No sé para qué sirve, pero esta claro que no puede dejarme sin comunicación.

He notificado el bug (#10877) , donde está el parche para descargar, por si alguno está en la misma situación.

Mola el Software Libre, o no? ;)

Actualización 4-10-2007: Ya está arreglado en el trunk, y en la rama 1.4.

Escrito por julianjm el 3/10/2007. | Comments (0)
Tags: , , , , ,