En una entrada anterior hemos visto como capturar voz en el navegador y convertirla en mensajes de texto. Ahora nos toca tratar esos mensajes para poder lanzar el comando adecuado. Cómo realmente lo único que necesitamos entender son comandos muy simples y predefinidos el sistema va a ser relativamente sencillo. Para procesar textos más complejos exiten sistemas más avanzados que requiren procesamiento del lenguaje natural. Estos sistemas requieren un conocimiento previo del lenguaje que van a procesar tanto por parte de la libreria como por parte del programador. Las expresiones regulares son sencillas de definir por el programador y para un sistema tan simple funcionan perfectamente.
En esta entrada usaremos la librería jsBotVoice que ayuda a usar expresiones regulares para interpretar los comandos.
Por lo general los bots habitualmente funcionan definiendo varias combinaciones de frases por cada comando precedidas del nombre del bot, «chispas» en nuestro caso. Por ejemplo las frases para preguntarnos la hora pueden ser:
«¿Qué hora es?»
«Dime la hora»
«Di la hora»
«¿Me dices la hora?»
«Hora»
Sin contar que puede ir precedida de cosas como. «Por favor».
Para facilitar el trabajo la mayoría de las librerías llevan herramientas para reducir el número de reglas necesarias permitiendo agrupar varias expresiones bajo una misma regla. En este caso vamos a usar expresiones regulares. Para ello dividiremos cada expresión en tokens que van asociados a expresiones regulares que describen su parte de la frase.
En nuestro caso el modelo sería:
bot please# tell time any
Cada token se traduciría en las siguientes expresiones regulares:
bot: chispa|chispas
please:por favor|porfa
tell: que|di[a-z]|me dices
time: la hora|hora
any: .
El problema es que al usar expresiones regulares tan poco concretas reconoceremos como válidas expresiones incorrectas como:
«chispas divaga hora y media»
En este caso podriamos añadir di|dim|dinos en lugar de di[a-z]*.
Hay que buscar un equilibrio entre flexibilidad de las expresiones y concretar los resultados.
Hemos logrado traducir todas las maneras de decirlo en una sola expresión pero si necesitáramos más no habría problema. Por ejemplo supongamos que queremos añadir:
«¿En que punto de la corriente temporal me encuentro?»
Podemos añadirla directamente por ejemplo:
bot: chispa|chispas|chispita
please:por favor|porfa
tell: en que|que|di[a-z]|me dices
time: la hora|hora
any: .
temporalPoint: punto de la corriente temporal
Que se traduciría en un nuevo comando de voz:
bot please# tell temporalPoint any
Vamos a ponernos con el código, primero definir los tokens:
var tokens = { 'bot': 'chispa|chispas|chispita', 'please': 'por favor|porfa', 'tell': 'que|di[a-z]*|me dices', 'time': 'la hora|hora', 'any': '.*', 'temporalPoint': 'punto de la corriente temporal' }
Ahora con esos tokens podemos definir las expresiones que el bot va a entender
var vc1 = new VoiceCommand(); vc1.name="tell me time"; vc1.expressions[0] = "bot please# tell time any"; vc1.expressions[1] = "bot please# tell TemporalPoint any"; vc1.execute = function(exp, m, voice) { sayTime(); };
Cuando nuestro bot oiga un comando de voz que encaje con las expresiones definidas ejecutara el comando definido en execute al que se le pasa como parámetros:
- exp: el indice de la expresión que ha coincidido
- m: array con la coincidencia de texto de cada token de la expresión. m[0] incluye todo el texto
- voice: referencia al al objeto Voice
Para iniciar el bot a escuchar basta con ejecutar init.
voice.init();
Pero si se quiere probar como reconoce las frases sin iniciar la parte de reconocer el audio puede usarse la función analyze pasando el texto a analizar.
voice.analyze(text);
Hay que tener en cuenta que hay que realizar pruebas reales para detectar errores habituales en el reconocimiento del habla. Por ejemplo en el caso del nombre del bot (bot: chispa|chispas) en se ha incluido chispa porque una gran cantidad de veces se reconocia la palabra «chispas» como si fuera «chispa».
En la web de la librería se puede encontrar más información.
Pingback: Síntesis de voz y lenguaje natural en un bot | Construyendo a Chispas
Pingback: Arquitectura de un bot que interactúa por voz | Construyendo a Chispas