El objetivo de este proyecto en montar una Raspberry Pi y configurarla para funcionar simultáneamente como asistente Amazon Alexa y Google Home. Después, trataremos que no todas las órdenes viajen a la nube; sino que algunas puedan ser resueltas por el dispositivo de forma offline. Para esto último utilizaremos Snips. El esquema sería el siguiente:

Paso 1. Obtener los componentes y software

Hardware:

  • Recomiendo comprar el pack de Google AIY. Yo he usado la V1, que requiere comprar aparte Raspberry Pi 3 B + micro SD. La V2 incluye la Raspberry Zero pero no la he probado). El pack Google AIY V1 incluye altavoz 3’’, micrófonos, voice hat, botón arcade con luz, cables, caja de cartón e instrucciones de montaje.
  • Raspberry Pi 3 B (ó 3 B+).
  • Adaptador de corriente de Raspberry.
  • Tarjeta micro SD. Mínimo de 8GB de capacidad y mínimo Clase 10 / U1 para tener +10Mbps (+info sobre tipos de tarjetas micro SD).
  • Cable de red. Lo necesitaremos para conectar nuestra raspberry a la misma red local que nuestro ordenador y poder conectarnos a la raspberry por SSH la primera vez. Para las siguientes veces, podremos seguir usando SSH o bien configuraremos VNC para ver escritorio en remoto.
  • No hará falta usar pantalla, cable HDMI, teclado ni ratón USB; nos conectaremos por SSH y VNC desde nuestro ordenador.
  • Necesitaremos un ordenador también 😀

Software:

  • Imagen Raspbian. La imagen que proporciona Google AIY nos servirá e incluye ya los scripts para Google Assistant.
  • Etcher, para grabar la imagen en la tarjeta micro SD.
  • Putty, cliente SSH para conectar desde tu PC a la raspberry.
  • VNC Viewer o similar, para conectar desde tu PC a la raspberry vía VNC.

También necesitaremos acceso a internet y poder conectar por cable ethernet la raspberry a nuestra red local. Esta red local tendrá que asignar una dirección IP automáticamente a la raspberry (es decir, DHCP habilitado y no filtrado por MAC con white list). En la mayoría de routers domésticos valdrá la configuración por defecto y únicamente nos centraremos en encontrar un puerto RJ-45 libre en el router. En otros escenarios, no podremos usar SSH y tendremos que conectar a la raspberry una pantalla, teclado y ratón para la configuración inicial de red.

Paso 2. Montaje

Sigue estas instrucciones para el montaje del hardware: https://aiyprojects.withgoogle.com/voice-v1/

Estas instrucciones incluyen la descarga y grabado de la imagen de Raspbian en la tarjeta microSD. Recomiendo el uso de esa imagen por sencillez, ya que incluye los scripts y dependencias necesarias para hacer funcionar Google Assistant en tu raspberry Pi.

Paso 3. Conectar por SSH en la primera ejecución, cambiar la contraseña y habilitar VNC

  • Para que SSH esté habilitado en raspberry, es necesario que en el directorio raíz de la microSD haya un fichero sin extensión llamado “ssh”. Créalo antes de colocar la tarjeta microSD en la raspberry. https://www.raspberrypi.org/documentation/remote-access/ssh/
  • Conecta vía cable ethernet a la misma red local que tu ordenador. Aunque la raspberry 3 B tiene wifi, no podremos configurarlo hasta que hayamos iniciado sesión. Por eso, usaremos conexión por cable al menos la primera vez.
  • Conecta la raspberry a la corriente.
  • Para conectar vía SSH desde tu ordenador, puedes utilizar la aplicación Putty, indicando:
    • Dirección IP (de raspberry). Podemos averiguar dicha IP entrando al panel de administración del router por ejemplo.
    • Usuario: pi
    • Password: raspberry
  • Tras conectar correctamente, por favor cambia la contraseña del usuario por otra. Es un riesgo tener tu raspberry conectada a la red, con acceso SSH habilitado y con la contraseña por defecto. Puedes cambiar la contraseña con los comandos “sudo raspi-config” o “passwd“.
  • Habilitar VNC. Lo puedes hacer desde el menú de “raspi-config”.
  • Comprueba con el cliente VNC Viewer de tu ordenador que puedes acceder remotamente al escritorio de tu raspberry. Sigue los pasos que aparecen en el escritorio para configurar el WiFi y ya no depender del cable ethernet.

Paso 4. Configurar Google Assistant en raspberry Pi

Para configurar tu raspberry Pi como un dispositivo Google Home, por favor sigue los pasos de AIY v1.

Paso 5. Configurar Amazon Alexa en raspberry Pi

Lo primero que tendrás que hacer es crear un Security Profile. Para ello, sigue estos pasos: https://github.com/alexa/avs-device-sdk/wiki/Create-Security-Profile

A continuación, descargar, configura scripts, autoriza y ejecuta los scripts. Sigue los pasos siguientes:

https://github.com/alexa/avs-device-sdk/wiki/Raspberry-Pi-Quick-Start-Guide-with-Script#setup

Como dice el equipo de Amazon Alexa en dicha url, esas son las instrucciones para la instalación fácil. Esos scripts se encargan de instalar todo. Si prefieres hacer la instalación paso a paso, utiliza esta otra guía: https://github.com/alexa/avs-device-sdk/wiki/Raspberry-Pi-Quick-Start-Guide

Paso 6. Probar ambos asistentes simultáneamente
En este punto, con los scripts de Alexa y Google Assistant corriendo en tu raspberry, podrías interactuar simultáneamente con ambos asistentes:

En las pruebas que he realizado, cada asistente consume aproximadamente el 25% de CPU de una raspberry Pi 3 B. Como punto de mejora más adelante, trataré que ambos compartan el detector de hotword.

Paso 7. Reflexiones

Después de un tiempo utilizando asistentes, espero que sientas que la UX a través de la voz es muy buena. Los asistentes también destacan por la velocidad para acceder a muchísima información online. Esta información a veces es pública y otras veces es info privada del usuario.

Cuando hacemos una pregunta a nuestro asistente, tanto Google como Amazon envían nuestra solicitud a su nube, donde se procesa. Si hemos hecho una pregunta que “saben” contestar directamente, los servidores de Google/Amazon contestarán con la respuesta (por ejemplo: “¿Qué día es hoy?”).

Si lo que hemos solicitado al asistente es que ejecute una acción determinada en un programa externo (custom skill), entonces nuestra pregunta viajará a los servidores de Google/Amazon pero desde allí se reenviará al servidor de terceros que ejecuta la custom skill. Por ejemplo, ocurre algo así cuando le pides a Alexa que te recomiende un libro utilizando la skill “recomendador de libros” que desarrollé hace unas semanas.

La pregunta que me surge es la siguiente. Tenemos claro que para muchas de las acciones que pedimos a nuestro asistente es necesario enviar la información a la nube, pero para otras acciones (ejemplo: preguntar la hora) se podría resolver de forma offline.

Si nuestro asistente pudiera contestar de forma offline, hay aspectos a tener en cuenta:

  • Privacidad: no toda la información de nuestro asistente estaría sometida a la misma privacidad si alguna viaja a la nube y otra no.
  • Velocidad de respuesta: los tiempos de respuesta de Google Assistant y Amazon Alexa son muy reducidos, no vamos a obtener tiempos de respuesta mejores con un funcionamiento offline.
  • Conectividad: en algunos escenarios puede tener sentido un asistente virtual pero no haber una conexión a internet disponible. En estos casos interesa conocer alternativas offline como Snips.
  • Volumen de información, información actualizada y mejora continua: un sistema offline no va a poder manejar tanto volumen de información como los sistemas cloud actuales. Además, la información del sistema offline puede quedar desactualizada. La distribución de actualizaciones se complica en los sistemas offline y con sistemas online llegamos a más público.

Por ello, en este artículo estoy proponiendo un sistema híbrido, donde algunas acciones serán respondidas por asistentes online (Alexa, Google) y otras acciones (más sencillas o con respuesta atemporal y/o con requisitos de privacidad especiales) serán resueltas por asistente offline tipo Snips.

Ejemplo de skill “recomendador de libros” que desarrollé sobre Amazon Alexa. Al estar en la nube, hay posibilidad de ampliar la base de datos de libros y de llegar a más usuarios.

Paso 8. Uso de Snips para operaciones offline

Lo que más me ha sorprendido de Snips es la facilidad para desplegar “skills” desde el ordenador, sin tener que entrar en la consola de raspberry. Los siguientes pasos instalan Snips en tu ordenador y despliegan un skill de ejemplo.

  • Primero, regístrate en https://console.snips.ai
  • Crear un asistente. Ojo: si elegimos idioma “English” el asistente funcionará íntegramente en el dispositivo; si elegimos “Español” aun no (es decir, usará internet).
  • Instalar desde nuestro ordenador (no desde consola de raspberry), siguiendo este orden: https://snips.gitbook.io/getting-started/installation
    npm install -g snips-sam
    Conectar a raspberry PI: sam connect
    sam status
    sam init // instala automáticamente lo necesario en tu raspberry
    sam setup audio
    sam test microphone // graba lo que digo y luego lo reproduce ok.
    sam test speaker // este paso no funciona correctamente con el kit AIY.
    sam status // para comprobar la instalación.
    sam sound-feedback on
    sam install demo
    sam watch // para ver los logs

Trabajo futuro:
Queda pendiente optimizar el detector de hotwords, espero subir otro artículo en el futuro. Me gustaría también incluir la integración con Microsoft Cortana, he visto que es sencilla usando como sistema operativo de la raspberry Windows 10 iot, pero no he encontrado aún la forma fácil de integrarlo en Raspbian.