Universitat Oberta de Catalunya

Conociendo a Jarvis, un asistente domótico de película

Asignatura: Diseño de Interacción

Nombre del estudiante: David Otero Verdaguer

Consultor y profesor: Santiago Vilanova / Quelic Berga Carreras

Introducción

A finales de enero del 2017 un compañero me pasó el enlace de lo que acababa de publicar Mark Zuckerberg en su muro de Facebook. En este, se podía ver como Mark se paseaba por su casa hablando con su asistente domótico, Jarvis, en plan IronMan! ¡Qué pasada! ¡Soy un friki, lo reconozco!


Acababa de empezar el cuatrimestre y la casualidad llevó a que estuviera empezando la asignatura de Diseño de Interacción.
Total, que pensé: Arduino, sensores, Linux… Esto… ¿y por qué no lo pruebo?

Y… aquí estoy… Cuatro meses más tarde, redactando las horas metidas en el proyecto en cuatro líneas para Mosaic.

Etapas y retos

Mi idea desde el principio se encaminó a realizar algo productivo que me pudiera ayudar en el taller, así como en algunas zonas de la casa.

Nunca me ha gustado dejar complejos sistemas de cables y jugar con las instalaciones eléctricas; por lo que tenía que ser algo más limpio que estar trasteando con relés.

Así empezó todo. Primero probé con bombillas y dispositivos basados en infrarrojos, pero la corta distancia que ofrecía esta tecnología y las colisiones entre componentes que actuaban en el mismo rango me obligaron a buscar una alternativa mejor.

Googleando, entre web y web, encontré cómo hackear mandos de radio frecuencia y los típicos enchufes remotos de pared. La radio frecuencia tiene un mayor alcance y sus emisores/receptores utilizan códigos cifrados. Por ello, estos no colisionan entre sí, con lo que parecía la solución perfecta para el control de dispositivos de largo alcance, en una casa de varios pisos.

Este es el módulo clonador de códigos de IR y RF con el que podía escuchar los valores alfanuméricos asignados a cada mando a distancia: televisor, aire acondicionado, equipo de música, enchufes…

Con lo códigos capturados pude programar un segundo módulo de Arduino que realizaba la emisión de las secuencias para encender y apagar cosas.

VIDEO 1 (https://vimeo.com/213270002)

El primer objetivo estaba superado, ahora el nuevo reto era conseguir interactuar mediante un entorno web apagando o encendiendo algo al pulsar un botón en el navegador.

El CEREBRO – Node.Js y Johnny-Five

El entorno de programación de Arduino tiene librerías para crear un servidor web. Incluso es posible loggear o realizar consultas php externas a una base de datos para poder realizar registros. Pero sinceramente, si lo comparas con lo que puede hacer Node.JS y su librería para Arduino Johnny-five… no hay color ;).

Node.JS trabaja de forma asíncrona y permite un flujo de datos continuo entre servidor y cliente, sin necesidad de refrescar navegadores ni redireccionar peticiones por AJAX.

Añadí un termómetro y un sensor de luz al módulo y unos cuantos botones con JQuery en un entorno simple HTML. Me quedé alucinando al ver cómo se refrescaban automáticamente y sin latencia los datos, así como lo fácil que era programar funciones basadas en cualquier cosa que controlara la máquina que corría bajo Linux.

En resumen, control total del servidor y consola mediante un entorno basado en JavaScript controlando todos los sensores que me diera la gana. ¡Impresionante!

Arduino 2 controlado por Node.JS (sensor de temperatura/fotoresistencia/movimiento)
Arduino 2 controlado por Node.JS (sensor de temperatura / fotoresistencia / movimiento)

El OÍDO – Voice Recognition Module V3/Elechouse

Jarvis era posible, ya daba sus primeros pasos.

Ahora tenía que ver cómo conseguir que escuchara a su padre.

Probé varios sistemas. Un sistema basado en el módulo de reconocimiento de voz de Android, una librería propia de Arduino que está ligada a un sensor de voz… todas tenían el mismo problema: la latencia.

Pasaban segundos entre que se realizaba la solicitud y la reacción de Jarvis.

Finalmente conseguí una baja latencia, de milisegundos, con un módulo propietario de la empresa Elechouse. Su funcionamiento me permitía gravar hasta 255 comandos en grupos de 7, más que suficiente para lo que buscaba.

Esto supuso tener que utilizar 2 tarjetas Arduino en vez de una ya que Johnny-five no soportaba este módulo. Pero si conseguía comunicar los 2 Arduinos podría disponer de un módulo móvil capaz de escuchar órdenes y al que ligaría el emisor de IR y RF para mejor cobertura y así, los sensores que no soportara Johnny-five, los podía derivar a este módulo (Arduino 1).

Arduino 1, programación nativa basada en Processing (módulo o Voice V3, emisores IR/RF, módulo de red Ethernet)
Arduino 1, programación nativa basada en Processing (módulo o Voice V3, emisores IR/RF, módulo de red Ethernet)

TCP SOCKETS

Muy bien, tenía 2 Arduinos. El primero recogiendo información del sensor de voz y emitiendo señales por IR y RF. El segundo, recogiendo información de sensores de temperatura y luminosidad, ligado completamente al servidor Debian.

¡Pinta bien! Pero… ¿Cómo puedo comunicar los 2 Arduinos?

Primero realicé pruebas emitiendo y recibiendo los datos por RF. Pero el flujo era demasiado denso ya que necesitaba comprobación de recepción para completar la orden y saber que los datos habían llegado correctamente.

Con esta idea me vino a la cabeza el protocolo TCP/IP y sus ACK visto en redes.

Empecé a hacer pruebas con un programa llamado PacketSender que permitía enviar y recibir paquetes UDP y TCP con el PC de una forma fácil. No fue complicado añadir a los módulos este aspecto, y lo podéis ver funcionando en el vídeo “Jarvis en Acción”  cuando en la consola se lee “He enviat/He rebut…” (He enviado/He recibido).

LA VOZ – Festival y bancos de la UPC  (Universitat Politécnica de Catalunya)

Ya tenía a los Arduinos comunicándose, Node escuchando eventos y todo se podía controlar mediante comandos de voz o su entorno web. Ahora Jarvis tenía que hablar. Esa era una de sus cualidades más espectaculares. Poder hablar e interpretar texto.

Para todo ello me encaminé a software externo pero de nuevo las latencias eran muy elevadas con lo que decidí recuperar un viejo proyecto basado en Festival para Linux. Este sistema tenía voces en múltiples idiomas y permitía rebajar la calidad de la voz de un sistema Clunits a HTS. Con esto conseguía rebajar los tiempos sacrificando un poco la calidad final de la voz. Pero para todo ello tuve que actualizar mi servidor. Actualmente tiraba con un viejo P4 con 1G de ram y me decidí a renovarlo. Actualmente Jarvis está dotado con dual core a 3.0ghz y 4g de ram.

Era espectacular ver lo que había conseguido y escucharlo, la verdad es que las luces de mi taller nunca se apagaban por las noches… seguro que los vecinos dirían: ¿Qué demonios estará haciendo el informático a estas horas? 

LOS OJOS – OpenCV/OpenFace

¿Si todo lo que me había propuesto lo iba sacando porque no seguir adelante? ¿Podría Jarvis ser capaz de ver?

Tras leer los apuntes, me decidí a instalar OpenCV para hacer que, mediante una webcam, Jarvis fuera capaz de detectar que una persona había entrado por la puerta. La documentación y ejemplos de esta librería es tan extensa que en pocas horas tenía un programa hecho en Python que era capaz de detectar caras y enmarcarlas con un recuadro trackeando su movimiento.

Esto no podía quedarse aquí, tenía que ir más allá… ¿y si conseguía la guinda del pastel? ¡Quería que Jarvis reconociera las caras! 

Bueno… ¡Qué os voy a decir! Horas y horas y más horas… pero al final, cuando ya estaba agotado de buscar entre proyectos de GitHub, di con la clave.

Una librería que se acababa de presentar en la Universidad de Pittsburgh por Brandon Amos y Gabriel Farina realizada en Python y con la que, mediante un complejo sistema, es posible crear una base de datos de caras y que el sistema las reconozca con una fiabilidad ajustable: OpenFace.

El gran handicap que conlleva esta librería es la cantidad de cosas de las que depende el sistema. Además, para que funcione correctamente en mi sistema, tenía que clonar el entorno de desarrollo que la máquina con la que ellos trabajaban.

Para integrarlo a Jarvis, fue necesario modificar el código original añadiendo funciones de comunicación por sockets, así como otras que permitían cerrar el proceso una vez reconocido el sujeto. Todo ello en Python, de nuevo, y del que yo era bastante novato.

Pero… valió la pena cada minuto invertido en este punto. Ahora, Jarvis era capaz de reconocer cualquier persona que yo me propusiera, educándolo con un mínimo de 7/8 fotos. ¿Os imagináis la cantidad de aplicaciones que puede tener algo así?

ICLOUD/GOOGLE APIS

Ya había conseguido que Jarvis detectara mi presencia con un sensor de movimiento, lanzará el programa en busca de alguna cara conocida y al reconocerla finalizara el proceso para ahorrar recursos y saludara.

Si ahora conseguía que pudiera acceder a mi cuenta de iCloud o Google y me geolocalizara para confirmar que realmente era yo el que estaba delante de la cámara, así como accediese a mi agenda y mis contactos… este asistente empezaría a parecerse al de la película Iron-Man.

Así fue como volví a sacar al Notepad++ para crear un cliente de calendario con CallDav, tema bastante complejo de nuevo, y más con la gente de Apple que lo tienen todo bastante cerrado. Pero después de muchas pruebas acabé encontrando la forma de comunicarme con los datos de Apple. El secreto se llama PyCloud, otra librería en Python con capacidades sorprendentes a la par que complejas.

La verdad que si queréis probar de hacer algo similar os recomiendo probarlo con Android y las APIS de Google, esta gente sí sabe compartir y dar opciones a los desarrolladores.

VíDEO CONOCIENDO A JARVIS

VíDEO JARVIS EN ACCIÓN

Conclusiones

A día de hoy sigo añadiendo nuevas funciones a mi asistente. He recuperado un sistema que quedó a medio camino utilizando Asterisk, un PBX (asistente telefónico). Estoy acabando el código para que Jarvis pueda recibir, gestionar y realizar llamadas; hablando y recibiendo ordenes mediante DTMF (pulsaciones del teléfono).

Con todo ello pretendo que Jarvis pueda realizar la gestión de clientes, reconocerlos, hablar con ellos y sea capaz de desviar llamadas, poner en espera, informar de estados en las fichas de los clientes… y muchas otras cosas.

También quiero investigar FastText de Facebook para dotar a Jarvis de una inteligencia verbal y que permita elegir como decir las cosas.

Sin duda alguna, este es el juguete que estaba esperando y con el que me parece que voy a perder muchas horas, dotando de más y más opciones a este asistente de película.

Por cierto, para la presentación del proyecto combiné asignaturas y ya que tenía que presentar el lanzamiento de un producto, en Composición Digital (After Effects), se me ocurrió hacerlo con un ejemplo real que mostrase el funcionamiento de Jarvis.

Quería que el vídeo fuera un resumen de todo lo realizado hasta el momento en el grado: Vídeo, Modelado, Animación, Programación, Post Producción, Entornos WWW, Usabilidad…  ¡Espero que os guste! ¡Un abrazo!

Enlaces relacionados:

Johnny-Five : http://johnny-five.io/

OpenFace: https://cmusatyalab.github.io/openface/

Festival: https://festvox.org/festival/

Festival Voices, UPC : http://festcat.talp.cat/

CallDAV: https://pypi.python.org/pypi/caldav

PyCloud: https://github.com/SEI-AMS/pycloud

GoogleAPIS: https://developers.google.com/google-apps/calendar/

FastText: https://github.com/facebookresearch/fastText

ASTERISK: http://www.asterisk.org/

Documentación:

Todas las librerías, software y sistema operativo para la realización de la práctica foman parte de las licencias GNU/GPL de software libre.

Acerca del autor

David Otero Verdaguer es estudiante del Grado Multimedia ofrecido por la UOC. Trabaja en un pequeño taller de su propiedad (ReparamiPC.com) ofreciendo soluciones avanzadas de informática para empresas y particulares. Combina esta tarea con la formación para grupos en diversos campos: programación, ofimática, diseño, informática musical…

Deja un comentario