Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK

Android Things: Integrando el Asistente de Google

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Nadia Castelli (you can also view the original English article)

Con el crecimiento de la Internet de las Cosas (IoT, del inglés Internet of Things), desarrolladores a ingenieros tuvieron que repensar cómo interactúan los usuarios con sus dispositivos en el día a día.

Si bien las pantallas funcionan bien con los sitios web y la mayoría de las apps, los dispositivos que se comunican con el mundo real pueden resultar un poco más tediosos de operar si tienes que utilizar múltiples botones o una pantalla para hacerlos funcionar. Una de las maneras de resolver esto es habilitar comandos de voz en tus dispositivos.

En este tutorial aprenderás acerca del Asistente de Google y cómo puedes integrarlo con tus dispositivos IoT.

Si necesitas un poco de contexto acerca de Android Things antes de comenzar, revisa algunos de mis otros posts aquí en Envato Tuts+.

SDK del Asistente

El SDK del Asistente de Google te permite añadir comandos de voz con detección de palabras clave, procesamiento de lenguajes naturales, y otras funciones de aprendizaje de máquinas a tus dispositivos IoT. Es mucho lo que se puede hacer con el SDK del Asistente, pero este tutorial sólo se enfocará en lo básico: cómo puedes integrarlo en tus dispositivos IoT para poder hacer preguntas, obtener información, e interactuar con la funcionalidad estándar del Asistente.

En cuanto a los requisitos de hardware, tienes algunas opciones. Puedes utilizar un Raspberry Pi con Android Things instalado, en conjunto con un Kit de Voz AIY.

O puedes emplear un parlante estándar con un conector AUX y un micrófono USB.

Además, puedes utilizar cualquier otra configuración de hardware I²S. Aunque no discutiremos I²S en detalle en este tutorial, vale la pena destacar que el Kit de Voz utilizará este protocolo. Una vez que tengas tu micrófono y tu parlante preparados, también necesitarás agregarle un botón a tu dispositivo. Este botón deberá registrar dos estados: presionado y soltado. Puedes lograr esto con un botón de arcade, o un botón estándar con un botón estándar con una resistencia pull-down conectada a uno de los polos.

Credenciales

Una vez que hayas configurado tu hardware, es hora de integrar el SDK del Asistente a tu dispositivo. Primero, necesitarás crear un nuevo archivo de credenciales para tu dispositivo. Puedes leer las instrucciones para esto en la documentación del Asistente de Google. Una vez que tengas tu archivo credentials.json, debes colocarlo dentro del directorio res/raw de tu módulo de Android Things.

credentialsjson file in the resraw directory

Luego de crear tus credenciales con Google, necesitarás declarar algunos permisos para tu app. Abre el archivo AndroidManifest.xml y escribe las siguientes líneas dentro de la etiqueta manifest, pero antes de la etiqueta application.

Vale la pena destacar que tendrás que reiniciar tu dispositivo luego de instalar la app con estos permisos para que puedan ser administrados.

Luego, necesitas copiar el módulo gRPC en tu app para que se comunique con el dispositivo. Esto puede tornarse un poco complicado, por lo cual el mejor lugar para descargarlo es de la app de ejemplo de Google Assistant Android Things, que puede encontrarse en la cuenta de GitHub de Android Things. Luego, deberás actualizar tu archivo settings.gradle para que incluya el nuevo módulo.

Luego de actualizar settings.gradle, incluye el módulo como una dependencia de tu módulo things, escribiendo la siguiente línea en el archivo build.gradle del módulo things, e incluyendo el driver del botón de Google (lo necesitarás para activar el micrófono), y de manera opcional el driver de Voice Hat si estás usando ese hardware.

También necesitarás incluir protobuf como dependencia en tu archivo build.gradle ubicado a nivel de proyecto.

Luego, incluye la librería oauth2 en tu proyecto, abriendo el archivo build.gradle del módulo things y escribiendo lo siguiente dentro del nodo dependencies:

Puedes hallar conflictos aquí si tu proyecto contiene la dependencia Espresso, con un mensaje de error similar al siguiente:

De ser así, simplemente borra la dependencia Espresso de build.gradle.

Luego de sincronizar tu proyecto, crea una clase nueva llamada Credentials.java para acceder a tus credenciales.

Clase Auxiliar Embedded Assistant

Una vez creada la clase Credentials.java, es momento de crear una nueva clase llamada EmbeddedAssistant.java. Esta es una clase auxiliar originalmente escrita por ingenieros de Google para integrar de manera sencilla el Asistente de Google para Android Things. Aunque esta clase es muy fácil de utilizar, simplemente incluyéndola en tu proyecto, queremos adentrarnos en ella y comprender cómo funciona.

Lo primero que harás es crear dos clases abstractas internas que servirán para manejar callbacks en la conversación y peticiones a la API del Asistente.

Una vez que tus dos clases internas estén listas, continúa definiendo el siguiente conjunto de variables globales al principio de tu clase. La mayor parte de estas serán inicializadas luego en este archivo. Estos valores se usan para mantener registro del estado del dispositivo y sus interacciones con la API del Asistente. 

Manejando las Respuestas de la API

Mientras que el código anterior tiene un objeto StreamObserver<ConverseRequest> para las peticiones a la API del Asistente, también necesitarás uno para las respuestas. Este objeto consistirá de una cláusula switch que chequea el estado de la respuesta y luego la maneja de acuerdo a este.

El primer caso chequea que un usuario ha terminado de hablar y utiliza ConversationCallback para hacerle saber al resto de la clase que una respuesta es inminente.

El siguiente caso comprobará y actualizará la conversación, el volumen, y el estado del micrófono.

El tercer caso tomará un resultado de audio y lo reproducirá para el usuario.

El caso final simplemente devolverá errores que pudieran haber ocurrido durante el proceso de conversación.

Los dos métodos finales dentro de este flujo manejan estados de error y hacen la limpieza cuando se completa un resultado de la conversación.

Streaming de Audio

Luego, necesitarás crear un Runnable que manejará streaming de audio en un thread diferente.

Creando el Asistente

Ahora que tus variables globales están definidas, es hora de crear el EmbeddedAssistant. Tendrás que obtener las credenciales para tu app utilizando la clase Credentials.java creada anteriormente.

Para que pueda instanciarse a sí misma, esta clase utiliza un constructor privado y el patrón builder.

La clase interna Builder contiene múltiples métodos para inicializar los valores dentro de la clase EmbeddedAssistant, como frecuencia de muestreo, volumen, y credenciales de usuario. Una vez invocado el método build(), todos los valores definidos se configurarán en el EmbeddedAssistant, los objetos globales necesarios para operar se iniciarán, y se disparará un error si falta algún dato necesario.

Conectándose a la API del Asistente

Luego de que el EmbeddedAssistant ha sido creado, debemos llamar al método connect() para poder conectarnos a la API del Asistente.

Luego de conectarte a la API, emplearás dos métodos para comenzar y detener conversaciones. Estos métodos enviarán objetos Runnable a mAssistantHandler, para pasar objetos de estado de la conversación hacia los flujos de petición y respuesta.

Apagado

Finalmente el método destroy() será utilizado durante el apagado, cuando tu app se cierre y no requiera más acceso a la API del Asistente.

Utilizando el Asistente

Una vez desarrolladas tus clases auxiliares, es momento de utilizarlas. Lo harás editando tu clase MainActivity de Android Things para que interactúe con el EmbeddedAssistant y el hardware para controlar el Google Assistant. Primero, agrega la interfaz Button.OnButtonEventListener a tu Activity.

A continuación necesitarás agregar las variables miembro y las constantes necesarias para tu app. Estos valores controlarán el rebote del botón que dispara el Asistente, así como también el volumen, el formato de audio, la clase UserCredentials que creaste anteriormente, y el hardware de tu dispositivo.

Una vez que tus constantes estén definidas, necesitarás crear algunos objetos callback que serán utilizados para las conversaciones y peticiones al asistente.

En mConversationCallback, notarás que guardamos un porcentaje de variación del volumen en una preferencia compartida. Esto permite que el volumen del dispositivo permanezca constante para tus usuarios, inclusive después del reinicio.

Como el Asistente trabaja de manera asincrónica en tu dispositivo, inicializarás todo para usar la API del Asistente en el método onCreate(), invocando un conjunto de métodos auxiliares que definiremos en el resto de este tutorial.

El primer método auxiliar es initVoiceHat(). Si se conecta Voice Hat a un Raspberry Pi, este método iniciará el dispositivo para que los usuarios puedan utilizar el micrófono y el parlante integrados. Si no hay un Voice Hat conectado, entonces se pueden utilizar un parlante AUX estándar y un micrófono USB, y serán detectados automáticamente. Voice Hat utiliza I²S para manejar periféricos de audio en el bus, y está contenido en una clase driver escrita por Google.

En este ejemplo, el Asistente sólo responderá al mantener presionado un botón. Este botón se inicializa y configura de la siguiente manera:

Cuando el botón es presionado, el Asistente comenzará a escuchar, a la espera de una nueva conversación.

Puedes encontrar más información acerca de GPIO y Android Things en mi tutorial acerca de entrada y salida con Android Things.

Como hemos almacenado información en las SharedPreferences de nuestro dispositivo, podemos accederlas directamente para inicializar el volumen del dispositivo.

El SDK del Asistente requiere autenticación para ser utilizado. Afortunadamente, hemos creado un método en la clase EmbeddedAssistant anteriormente en este tutorial, específicamente para esta situación.

El último método auxiliar invocado en onCreate() inicializará el objeto EmbeddedAssistant y lo conectará con la API.

Por último, necesitarás apagar correctamente tus periféricos, actualizando el método onDestroy() de tu Activity.

¡Ahora, deberías ser capaz de interactuar con tu dispositivo Android Things como si fuera un Google Home!

Conclusión

En este tutorial, has aprendido acerca del Asistente de Google y cómo puede integrarse en tus aplicaciones Android Things. Esta función les da a tus usuarios una nueva manera de interactuar y controlar tu dispositivo, así como acceso a las diversas funcionalidades de Google disponibles. Esta es sólo una parte de las fantásticas funciones que pueden existir dentro de una app Android Things, y te permiten crear increíbles dispositivos nuevos para tus usuarios.

Mientras estés aquí, ¡revisa algunas de mis otras publicaciones acerca de Android Things en Envato Tuts+!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.