Juan González
Diseñando para la Voz
16 min readOct 23, 2018

--

Actualización, Abril 2020: este tutorial ha sido actualizado para reflejar novedades relacionadas con la nueva versión de la placa Raspberry Pi 4 y su configuración.

Actualización, Enero 2019: este tutorial ha sido actualizado para reflejar los cambios en la configuración del SDK de AVS.

Instalando el Servicio de Voz de Alexa en una Raspberry Pi

Hasta la fecha, la mayor parte del trabajo que he realizado con Alexa está relacionado con el Alexa Skills Kit (ASK). Es realmente simple crear Skills básicas que te permitan realizar un sin fin de tareas. Con las plantillas en GitHub y la gran cantidad de tutoriales existentes (casi enteramente en el idioma inglés), en solo cuestión de minutos puedes desarrollar y probar una Skill.

Sin embargo el ASK es solo un elemento del entorno de desarrollo. Alexa ofrece posibilidades adicionales para aquellos fabricantes de dispositivos que quieren tener la oportunidad de probar las capacidades del asistente virtual de Amazon. A través del Alexa Voice Service (AVS) es factible embeber el cerebro de Alexa en distintos tipos de hardware.

AVS Webinar en Español. Fuente: Alexa Developers

Para los que cuentan con presupuesto y tienen aspiraciones reales de crear un producto, Amazon nos facilita el adquirir kits de desarrollo con diversas configuraciones para poder crear prototipos y realizar las pruebas necesarias en distintos escenarios. Estos kits son geniales pero la verdad es que para fines educativos y alimentar la curiosidad, se van un poco de precio y se complica su disponibilidad en el mercado Español.

Es por esto que en el tutorial de hoy vamos a crear un prototipo que nos permite realizar las pruebas del AVS en un equipo económico y fácil de obtener en España: el Raspberry Pi 3. Este pequeño ordenador, junto a algunos accesorios adicionales, nos permitirá crear nuestro propio Amazon Echo, hecho en casa y por poco dinero.

Novedad: En la actualidad es posible adquirir la nueva versión de la placa Raspberry Pi (4B). Esta nueva placa cuenta con más recursos de procesamiento y memoria, así como componente actualizados. Adicionalmente es importante tener en cuenta que esta nueva placa base se conecta a tu monitor a través de Micro HDMI, por lo que puedes necesitar un adaptador adicional.

Antes de Empezar

Para poder completar el proceso es necesario cumplir con al menos tres requisitos previos:

Una vez se hayan completado estos pasos, podemos ponernos manos a la obra con el diseño e implementación de nuestro prototipo usando la Raspberry Pi.

Requisitos Básicos de Hardware

No existe una única configuración para lograr el objetivo que tenemos en mente con este tutorial. Si solemos “cacharrear” con ordenadores o proyectos de electrónica, es posible que ya contemos con alguno de los accesorios requeridos para este prototipo. Yo me he asegurado de reutilizar los dispositivos que tengo en casa y adquirir exclusivamente lo que no he podido sacar de algún cajón. Para este proyecto necesitamos al menos:

  • Tarjeta Raspberry Pi: el modelo más reciente disponible al momento de crear este tutorial es la Raspberry Pi 3 B+, disponible en Amazon España por unos 36€. Esta tarjeta incluye conexión inalámbrica (WiFi y Bluetooth), salida de audio, 4 puertos USB y salida HDMI.

Novedad: como he mencionado anteriormente, la nueva Raspberry Pi 4 B está disponible actualmente en el mercado.

  • Tarjeta de memoria Micro SD: puede ser una tarjeta de 8/16/32GB. El modelo de 32GB (SanDisk) en Amazon España se puede conseguir hoy por poco menos de 8€.
  • Micrófono USB: un mini micrófono USB en Amazon se puede conseguir por unos 6€ aproximadamente. He utilizado el micrófono incluido en mi cámara web para las pruebas. La gran ventaja del mini micrófono es la portabilidad del prototipo pero cualquier producto similar hará el trabajo de forma satisfactoria.
  • Altavoz: aunque inclusive unos auriculares de cable son más que suficiente para realizar las pruebas, idealmente podremos contar con algún tipo de altavoz equipado con conector de 3.5mm para obtener una mejor experiencia de usuario.
  • Fuente de alimentación: para poder encender la tarjeta Raspberry Pi necesitamos un adaptador 5.1V 2.5A. He reutilizado cables y adaptadores que tenía en casa, pero una fuente de alimentación adecuada no solo proveerá protección a la tarjeta sino que en algunos casos nos permitirá contar con un interruptor de encendido y apagado, lo que siempre viene bien para asegurarnos de no dañar la tarjeta de memoria o algún componente de la Raspberry Pi.
  • Periféricos: para poder realizar la instalación tanto del sistema operativo como del SDK del AVS, necesitamos teclado y ratón USB, un monitor HDMI y finalmente él cable HDMI para conectar la pantalla.

Kit Raspberry Pi

Es posible adquirir la mayoría de los elementos necesarios por tan solo 60€ en Amazon España como parte del kit UCreate. En este kit básico de desarrollo obtendremos la Raspberry Pi 3 B +, una tarjeta MicroSD de 16GB, la carcaza dura oficial de Raspberry Pi (absolutamente opcional para este proyecto) y una fuente de alimentación. El kit está disponible tanto en color blanco como en color negro.

Novedad: existen varios kits disponibles en la actualidad, pero mi opinión personal sobre si estos kits merecen la pena o no ha cambiado. Hoy en día, prefiero comprar las piezas que necesito de forma individual como primera opción, el kit oficial de Raspberry Pi como segunda (y solo para los casos en los que se cuenta con una sola placa.) Para el caso en el contamos ya con más de una Raspberry Pi, mi opción ideal es el rack de Pis.

Instalación y Configuración Inicial

Preparación del Sistema Operativo

Antes de iniciar el trabajo relacionado con el SDK del AVS, es necesario realizar la instalación y configuración inicial de Raspbian OS, el sistema operativo de la Raspberry Pi.

Novedad: este proceso se ha simplificado aún más con el lanzamiento de la herramienta oficial: Raspberry Pi Imager, la cual ofrece no solo la opción de instalar el sistema Raspbian, pero a su vez ofrece la descarga e instalación de sistemas de terceros como Ubuntu o inclusive tu propia imagen.

Raspberry Pi Imager v1.2

Para principiantes, el método recomendado pasa por utilizar el instalador NOOBS (New Out Of the Box Software) que podemos descargar desde la página oficial. Al momento de escribir este tutorial, la versión más reciente de NOOBS es la 3.0.0.

Descarga del NOOBS en la web de Raspberrypi.org.

El proceso de instalación es muy simple. Basta con descomprimir el contenido del fichero NOOBS_v3_0_0.zip y transferir todo el contenido a la tarjeta Micro SD.

Contenido del fichero NOOBS_v3_0_0.zip.

Nota: En mi caso, el reutilizar una tarjeta Micro SD de otro dispositivo generó ciertos problemas al intentar iniciar el instalador NOOBS en la Raspberry Pi. La solución definitiva fue formatear la tarjeta nuevamente como MS-DOS (FAT) desde Disk Utility del Mac OS. Para requerimientos más avanzados de formato se puede utilizar la herramienta oficial de la SD Association.

Ensamblado de la Raspberry Pi

Ensamblar la tarjeta es muy simple. Solo tenemos que asegurarnos que hemos conectado todos los elementos correctamente:

  1. Verifica que has insertado la tarjeta Micro SD en la ranura correspondiente y con los pines de contacto hacia arriba.
  2. Conecta el micrófono USB y el altavoz en la entrada de audio de 3.5mm.
  3. Conecta el teclado y el ratón USB. Si estás utilizando un mini micrófono USB asegúrate de no bloquearlo con los cables del teclado o el ratón.
  4. Conecta el monitor HDMI.
  5. En caso de no utilizar la antena WiFi, asegúrate de conectar el cable de red Ethernet.
Ensamblado de la Raspberry Pi.

Instalación del Sistema Operativo

Conecta la fuente de alimentación a tu Raspberry Pi y en cuestión de pocos segundos deberás ver la pantalla de inicio del instalador, con la opción (recomendada) para instalar Raspbian OS.

Menú de instalación del Raspbian OS.

Al confirmar la intención en la ventana emergente de instalación, el proceso comienza automáticamente.

Instalación del sistema Raspbian OS.

Una vez finalizada la instalación entramos a un sistema Linux familiar, en este caso basado en la distribución Debian, conectado a internet y listo para iniciar la siguiente fase del proyecto. Es hora de descargar algunos archivos de configuración de AVS.

Configuración de las Credenciales AVS

Descarga del SDK para Dispositivos AVS

Ahora que tenemos un sistema conectado a internet, podemos utilizar el terminal para descargar scripts y archivos de configuración con el comando wget, pero antes vamos a asegurarnos de tener el sistema actualizado con:

sudo apt-get upgrade
Actualización de los paquetes de sistema en la Raspberry Pi.

Luego, simplemente copia y pega la siguiente instrucción en tu terminal de Raspbian OS:

wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/setup.sh \
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/genConfig.sh \
wget https://raw.githubusercontent.com/alexa/avs-device-sdk/master/tools/Install/pi.sh
Comando wget para descargar los ficheros de configuración.

Descarga las Credenciales

En los pasos iniciales de este tutorial hablamos sobre la necesidad de registrar el dispositivo en la consola de Alexa Voice Service y crear un perfil de seguridad. Los datos generados en esos pasos previos son los que vamos a utilizar ahora para configurar la autenticación a nuestro servicio.

Desde la consola de AVS, en la sección Product Details > Other devices and platforms encontramos la opción para descargar el fichero config.json. Este fichero, una vez descargado debemos moverlo al directorio /home/pi/ para luego ejecutar el comando de configuración.

Descarga de credenciales del dispositivo.

Configuración del SDK de AVS

Ya que hemos configurado correctamente las credenciales, estamos listos para ejecutar los archivos de instalación. Durante este proceso se instalan todas las dependencias, incluyendo el gestor de alerta de Alexa o Wake Word Engine (WWE). El WWE se encarga de filtrar el audio que llega a través de nuestro micrófono para detectar la palabra clave “Alexa” e iniciar la transmisión a la nube de Amazon.

Para proceder a la ejecución del instalador solo debemos escribir en nuestra ventana de terminal de Raspbian OS los comandos:

cd /home/pi/
sudo bash setup.sh config.json [-s 1234]

Antes de dar inicio al proceso de instalación debemos aceptar los términos y condiciones de forma explícita, escribiendo la palabra “AGREE” cuando el instalador nos haga la pregunta.

Inicio del proceso de instalación del SDK AVS.

Si has cometido algún error en la configuración de las credenciales, el instalador te dejará saber que algo anda mal y que alguno de los valores necesita ser corregido. En tal caso, será necesario verificar una vez más que has obtenido los valores correspondientes a cada variable desde tu consola de productos AVS.

En caso de que todo se complete correctamente, obtendrás un mensaje de éxito acompañado de algunas notas de ayuda y comandos de ejemplo para ejecutar la aplicación de prueba.

Instalación completada del SDK de AVS.

Nota: en mi caso, la instalación se detuvo y congeló el sistema por completo cuando ya se había completado el 97% del proceso. Luego de esperar lo suficiente para confirmar que no era un problema temporal (en algunos casos donde la carga de procesamiento es alta, se detiene el sistema por pocos segundos), he reiniciado el sistema y todo se ha retomado desde un punto cercano a donde se había quedado atascado.

Continuación del proceso de instalación luego de una interrupción.

Ahora es solo cuestión de ejecutar la aplicación de ejemplo y asegurarse de obtener un nuevo token desde el servicio AVS. De este modo el dispositivo se podrá autenticar con la nube utilizando el Login With Amazon (LWA).

Obtener el “Refresh Token”

Actualmente nuestra Raspberry Pi cuenta con el SDK de AVS y las credenciales necesarias para acceder al servicio en la nube, pero aún es necesario obtener lo que se conoce como el “refresh token”, necesario para garantizar que el cliente pueda mantener un sesión abierta con el Alexa Voice Service en la nube. En el caso de estar diseñando un producto real con Alexa, destinado a ser utilizado por millones de clientes, ellos pueden utilizar sin problemas el mismo ID tanto para cliente como para producto, pero en cada caso individual, el dispositivo va a requerir un refresh token único para poder autenticarse a través del LWA.

Normalmente, el cliente obtendrá un refresh token cuando ellos activen su dispositivo, ya sea utilizando una aplicación que lo acompañe, una web asociada, o a través del sistema Code-Base Linking (CBL). Para este tutorial, nosotros seremos a la vez el fabricante y el cliente final, utilizando el fichero startsample.sh para invocar la aplicación de ejemplo y solicitar un nuevo token para nuestro prototipo.

Utilizando una ventana del terminal y desde nuestro directorio /home/pi procedemos a ejecutar el fichero startsample.sh con el siguiente comando:

cd /home/pi/
sudo bash startsample.sh

Una vez se inicia el proceso, algunos mensajes de depuración aparecerán en la pantalla, haciendo scroll automáticamente y de forma bastante rápida. Recibiremos en este momento una notificación de que nuestro dispositivo esta en el proceso de ser autenticado. Es necesario ubicar la sección que incluye la información sobre el URL (https://amazon.com/us/code) y el código de activación.

Mientras el servicio se encuentre en espera, es normal que en la ventana del terminal se despliegue el mensaje “Checking for authorization (2),” donde el número entre paréntesis representa la cantidad de veces que el mensaje ha sido enviado.

Proceso de autenticación de nuestra aplicación con AVS a través de LWA.

Luego el servicio de autenticación nos pide confirmar que realmente queremos garantizar el acceso a este dispositivo.

Confirmación de acceso al AVS por parte de nuestro dispositivo.

Finalmente, si todo ha salido como esperamos, obtenemos un mensaje de confirmación y podemos observar que el Alexa Voice Service se encuentra en ejecución y esperando comandos de voz para procesar.

Mensaje de confirmación de LWA para ejecutar el AVS en nuestro sistema.

¿Problemas con el Audio?

Ajustes de Micrófono

Si al momento de intentar “despertar” a Alexa notas que no sucede nada, es posible que tu micrófono no esté conectado o configurado correctamente. Para verificar la configuración del micrófono, solo debemos dirigirnos a las opciones de audio desde el menú de inicio de Raspbian y activar la “Selección de Controles” de nuestra tarjeta de sonido — en mi caso, la que viene integrada a mi cámara web (HD Pro Webcam C920).

Verificación de la correcta configuración del micrófono conectado a la Raspberry Pi.

Ajustes de Altavoces

Aunque yo no tuve ningún problema con la detección del micrófono USB conectado a la tarjeta, en el caso de mi instalación, al intentar dar comandos de voz a Alexa pude notar que el servicio recibía mis instrucciones pero yo no escuchaba ningún tipo de respuesta desde los altavoces que había conectado a la Raspberry Pi.

Luego de investigar un poco, me di cuenta que en algunos casos es necesario realizar una configuración adicional para lograr el correcto funcionamiento del sistema de sonido. El proceso es muy sencillo. Lo primero que debemos hacer es iniciar el sistema de configuración de audio con el comando:

sudo raspi-config

En este caso buscamos entrar en la opción número “7" del menú de configuración. Esta es la opción correspondiente a “Advanced Options.”

Herramienta de configuración de la Raspberry Pi 3.

Una vez dentro de la sección de opciones avanzadas, buscamos el elemento “A4” del menú correspondiente al audio. Esta opción nos permite forzar el audio a través del conector HDMI o de la opción que nos interesa en este caso, el conector de audio de 3.5mm.

Opción para forzar la salida de audio de la Raspberry Pi 3.

Finalmente seleccionamos la opción del menú correspondiente al conector que vamos a utilizar. Para esta versión de la herramienta de configuración, se corresponde con la primera opción: “Force 3.5mm (‘headphone’) jack.”

Opción para forzar la salida en el conector de 3.5mm de la Raspberry Pi 3.

Al aceptar los cambios, mi tarjeta de sonido empezó a funcionar correctamente y sin necesidad de realizar ningún paso adicional o reiniciar alguno de los servicios.

Interactuando con Alexa

Una vez hemos configurado nuestro sistema correctamente, podemos empezar a interactuar con Alexa de la manera en que lo haríamos con un dispositivo Echo o una tableta de Amazon.

Cuando decimos en voz alta “Alexa,” notamos que en la ventana de nuestro terminal se lleva a cabo un scroll automático y se muestran distintos estados: Listening, Thinking, Speaking. Cada uno representando el estado actual del servicio, dependiendo de la operación que se esté ejecutando.

Distintos estados presentados por el AVS en la consola del terminal.

Nota: Si quieres saber más sobre la personalización de los estados que vienen por defecto en el cliente AVS y su asociación a distintos sonidos, con el fin de mejorar el feedback al usuario, puedes ver este tutorial de Francisco Rivas.

Si en algún momento Alexa deja de responder o la aplicación parece estar congelada (o inclusive desplegando un mensaje de error a medida que hablamos), podemos escribir la letra “s” y presionar la tecla de retorno en la ventana del terminal para detener la interacción. De la misma forma se puede utilizar la letra “q” y presionar la tecla de retorno para cerrar la aplicación completamente.

Actualmente, ninguna de las opciones de dispositivos Alexa se encuentran disponibles de manera oficial para España. La única forma de tener acceso al sistema en Español es a través del programa Preview en el que participan algunos clientes seleccionados por Amazon.

Para el caso de nuestro prototipo, los idiomas disponibles son los soportados oficialmente por Amazon. Es posible verificar y cambiar estos valores simplemente escribiendo la letra “c” y luego el número “1” en la consola de AVS en nuestro terminal.

Opciones de configuración de la consola AVS.

En el caso de mis pruebas, he realizado toda la interacción con Alexa en la opción por defecto (Inglés de los Estados Unidos). Cosas básicas como establecer un temporizador o realizar preguntas típicas de conocimiento general funcionan muy bien.

Al realizar solicitudes relacionadas con mi ubicación, me doy cuenta que Alexa me está reportando datos erróneos correspondientes a la hora, el clima, etc. Esto sucede en mi caso porque yo tengo una tableta Kindle Fire HD con Alexa, configurada con mi cuenta de Amazon USA.

La mayor parte de estos parámetros se puede ajustar en la sección de configuración de la web.

Ajustes y Configuración Avanzada

En este punto, es posible realizar algunos ajustes adicionales para mejorar la experiencia de usuario mientras realizamos nuestras pruebas.

Cosas como la ubicación del dispositivo, las unidades de medida, dirección (importante para los envíos), nombre del dispositivo y algunos valores mas se pueden editar en la sección de configuración de nuestra consola en https://alexa.amazon.com/.

Configuración de parámetros en la consola de Amazon Alexa.

Al realizar los cambios correspondientes, Alexa reporta correctamente los valores correspondientes a hora, clima y adicionalmente se ha ajustado a las unidades de medida de temperatura y distancia correspondientes al sistema métrico.

Gestión con Acceso Vía SSH

Una vez configurado y puesto en marcha el prototipo AVS, es posible simplificar el setup de periféricos y la gestión de nuestra instalación a través de el uso de VNC o simple acceso SSH.

Con el fin de llevar al mínimo la cantidad de dispositivos conectados a la tarjeta Raspberry Pi—y hacerle un hueco permanente en mi escritorio, manteniendo el orden que me gusta preservar — decido reemplazar el uso del micrófono USB de mi cámara web por el micrófono USB que menciono al principio del artículo. A su vez, y con el fin de eliminar en un solo paso los cables correspondientes al teclado, ratón y salida HDMI, decido realizar la gestión desde mi ordenador principal a través de la aplicación Terminal, utilizando SSH.

Desde el mes de Noviembre de 2016, el sistema operativo Raspbian viene con el servidor SSH desactivado por defecto. El proceso que debemos seguir para activarlo es muy sencillo:

  1. Desde una ventana de terminal ejecutamos el comando sudo raspi-config
  2. Buscamos la opción Interfacing Options en el menú
  3. Seleccionamos la opción SSH
  4. Elegimos el valor Yes
  5. Confirmamos la selección en Ok
  6. Guardamos y salimos con la opción Finish

De forma alternativa, podemos habilitar e iniciar el servicio con los comandos:

sudo systemctl enable ssh
sudo systemctl start ssh

Al habilitar el servidor SSH en una tarjeta que está conectada a la red, es importante seguir las recomendaciones de seguridad relacionadas con la gestión de usuarios y contraseñas de fábrica, que vienen pre-configuradas en la Raspberry Pi.

Una vez configurado el servicio, es posible conectarnos desde nuestro ordenador principal y continuar la gestión de nuestra instalación a través de la línea de comandos:

Acceso vía SSH desde la app Terminal de Mac OS X.

Laboratorio Listo para Pruebas

Con los cables y periféricos reducidos a su mínima expresión, la configuración final del prototipo del AVS en la Raspberry Pi queda listo para la batería de pruebas y experimentos que vendrán a continuación.

Configuración minimalista de escritorio para la Raspberry Pi.

Desde cerca podemos observar que gracias a la conexión inalámbrica del modelo que hemos utilizado y la gestión a través de acceso SSH, es posible tener una tarjeta configurada con el mínimo de periféricos posible.

Configuración final de los dispositivos E/S de la tarjeta.

Solo el Comienzo con Alexa Voice Service

Ahora que tenemos un prototipo funcional con el asistente de voz de Amazon, podemos empezar a realizar todo tipo de experimentos relacionados con Alexa y soportados por el ecosistema de la Raspberry Pi.

Desde la web oficial de la documentación para AVS, es posible acceder a tutoriales avanzados (en inglés) exclusivos para la Raspberry Pi.

En Diseñando para la Voz tenemos tutoriales dedicados al tema AVS, en donde podemos aprender a modificar la GUI o modificar los indicadores de estado para agregar sonidos.

En la página principal del AVS, es posible consultar ejemplos de productos que podemos desarrollar con Alexa. Desde altavoces y auriculares, pasando por PCs y Smart TVs, hasta coches.

Si queremos ser los primeros en saber cuando alguno de los servicios del AVS estarán disponibles en los distintos mercados, podemos consultar la web de soporte internacional y darse de alta a través del formulario de contacto.

¿Tienes algún proyecto en mente para desarrollar con el Alexa Voice Service? Déjame saber en los comentarios.

Gracias por leer,

Juan.

Diseñando para la Voz es una iniciativa personal de Juan González Ponce que trae contenido relacionado al mundo del desarrollo de Alexa Skills para el servicio de Amazon, en Castellano, con la finalidad de compartir ideas y lecciones aprendidas en el camino.

--

--