Notxor tiene un blog

Defenestrando la vida


Prueba de concepto para crear un asistente de voz

Llevo un tiempo dándole vueltas al tema de los asistentes de voz. Veo a algunos dándole órdenes a sus ordenadores de bolsillo muy contentos con la reacción de sus chismáticos. No voy a entrar en si son conscientes de lo barato que venden su alma, sino en si merece la pena uno de esos asistentes.

La manera de saber cómo funcionan y de probar uno es hacerlo yo mismo. Por eso estoy en este berenjenal. De primeras pensé en hacerlo para emacs, me he acostumbrado tanto al elisp y me encuentro tan cómodo que me puse a investigar paquetes que me pudieran ser útiles para mi prueba de concepto.

Mi primera idea

De primeras pensé que no debería ser muy complicado: no tiene que hacer muchas cosas. En principio lo pensé hacer en emacs como he dicho y como mucho había pensado en que entendiera comandos del tipo: ir al párrafo anterior, atrás, ir a línea 27 y cuatro cosas más.

Básicamente me planteaba hacer tres módulos que dependieran de un modo menor de emacs: el primero convertiría la voz en texto para pasárselo al segundo, el parser que analizaría ese texto para convertirlo en un comando o realizar alguna acción; el tercero convertiría el texto en sonido para llamar la atención sobre algún punto o responder a alguna posible pregunta.

La conversación no tiene que ser excesivamente compleja, no se trata de crear una inteligencia artificial (IA) que pase por humana. Incluso sistemas conversacionales básicos, como puede ser Eliza o un derivado cumplirían de sobra con la tarea. Realmente, ese asistente sería algo tan básico como un interfaz de voz para algunos comandos.

¿Para qué me serviría en emacs? Pues básicamente para nada: tardo menos tiempo en pulsar una tecla que en decir su nombre o su función y además limitaría el posible uso de mi asistente. Como mucho podría emplearse para que me lea un buffer de texto. Para esto, encontré un paquete de emacs que lo hace de forma eficiente.

El paquete de Emacs greader

En mi búsqueda de interfaces voz-texto y texto-voz encontré un paquete de emacs que es capaz de leerte un buffer y lo probé. La instalación, como siempre, no puede ser más sencilla:

M-x install-package RET greader RET

Depende de que tengas instalado algún paquete de conversión de texto a sonido (me duele llamar a lo que sale por los altavoces habla o voz), para funcionar. Dos son los que se pueden configurar por defecto: speech-dispatcher y espeak. El primero es en realidad una interface que puede utilizar varios motores de conversión. En mi caso, y como sólo tengo instalado espeak utilicé éste en la configuración del paquete para emacs:

;; Configuración para greader
(add-to-list 'load-path "~/.emacs.d/elpa/greader-0.1")
(require 'greader)
(setq greader-actual-backend 'greader-espeak)
(setq greader-espeak-language "es")

Después de esa simple configuración en nuestro init.el podemos cargar el modo greader-mode en cualquier buffer de texto y al pulsar C-r ESP para iniciar y parar la lectura. También podemos utilizar los comandos greader-read y greader-stop para hacer lo mismo.

Estas pruebas no me sirvieron para avanzar demasiado en mi proyecto pero no deja de ser una curiosidad. A estas alturas y con la cantidad de paquetes que tiene emacs siempre encuentro algo relacionado con lo que busco o lo que quiero hacer que, al menos, sirva como inspiración.

El estado del proyecto

Visto que el chismático no lo iba a hacer como modo de emacs elegir lenguaje también me ha supuesto un poco de reflexión. Hace un tiempo hubiera elegido Python sin pensarlo mucho. Alguna vez programé otra prueba de concepto tipo Eliza, para destriparlo en una charla-conferencia sobre IA y lo hice con Python. Sin embargo, últimamente me está resultando más cómoda la programación con lisp y scheme. Al final he decidido, que como es una prueba de concepto y se trata de hacer algo sencillo y facilón, sintiéndome cómodo al hacerlo, voy a utilizar Guile, que es lo que más a mano tengo.

Conversión de voz a texto

En este apartado encontré algunas herramientas que pueden ayudar a la conversión de voz a texto. La más prometedora es PocketSphinx, con la que estoy haciendo pruebas aún, comprobando cómo funciona y las distintas opciones de configuración. La instalación en OpenSuse Tumbleweed es sencilla:

zypper install pocketsphinx pocketsphinx-devel

Básicamente funciona, parece, empaquetando el sonido entre dos silencios, lo que sería una frase, en un fichero wav temporal que luego analiza para convertirlo en texto.

De momento lo encuentro algo impreciso, aunque no estoy seguro de si es algún problema de configuración o del mismo chismático. Viendo la documentación, hay un Sphinx más preciso, pero más lento. Seguiré con las pruebas a ver si consigo un poco más de precisión, no necesito mucha más.

Salida de texto a voz

Como ya he hablado de las dos opciones principales en este apartado para GNU/Linux antes hablando del paquete para emacs, no abundaré mucho más. Creo que lo que me falta por decir en este aparatado es sólo el porqué utilizaré espeak. Alternativas hay, pero he encontrado que éste tiene salida para las distintas lenguas que me interesan; principalmente, el español y el esperanto, además del inglés que soportan todas.

El meollo

La parte del meollo, el parser aún está todo en el aire. El objetivo principal es aprender a escribir un módulo para enganchar el Guile con la librería libpocketsphinx escrita en C, y otro para conectar con otra llamada libspeak-ng para hacer la salida. Aunque lo más sea realizar la salida mediante el habitual stdout.

Lo demás debería ser bastante fácil. Recibir entrada, procesarla y producir una salida (respuesta hablada) o una acción (respuesta a un comando).

Todo está en mantillas y empezando.

Conclusión

No hay mucho que concluir, está todo en una fase tan temprana que lo más probable es que termine en vapor, pero bueno, por lo menos me hace preguntarme cómo funcionan, o podrían funcionar, estas cosas.

¿Para qué podría servirme? Pues no para mucho, estoy tan acostumbrado a la interface teclado-pantalla, que la interface de voz se me presenta un poco engorrosa para manejar un ordenador... justo lo contrario de que en los móviles. Es posible que el uso más normal es para las ocasiones en que se tiene que manejar el ordenador a distancia; por ejemplo, el momento en que estás en una charla y te encuentras cerca de la pantalla y quieres buscar una diapositiva en concreto o avanzar y retroceder. Hasta ahora tengo un par de chismáticos que me ayudan: uno es un mando a distancia que alguna vez me ha dejado tirado por agotarse las pilas (o que me se ha quedado olvidado en casa); el otro es utilizar el KDE Connet desde el móvil.

Y como hay que ponerle un nombre y Jarvis está ya cogido, pues lo llamaré Fermín: Funcionalidad de Escaso Raciocinio, Memoria o Inteligencia Natural... que ha sido el primer nombre que me ha venido a la cabeza.


Comentarios