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