El día de hoy vamos a aprender como desarrollar una primer skill para Amazon Alexa. Actualmente estoy desarrollando una skill para publicar y recibir notificaciones en Twitter vía Alexa a la que llamaré TuitLexa o simplemente Mis Tuits, recientemente publiqué un video con el pequeño avance que llevo. El código fuente de esta skill será de código abierto y lo publicaré en su momento en mi repositorio github.
El único requisito para seguir este tutorial es saber Java y Gradle (o Maven). Para desarrollar una buena skill, necesitamos no solamente teoría de programación, también requerimos conocer sobre los 4 principios del diseño situacional que son: be adaptable, be personal, be available y be relatable, principios que nos saltaremos por el momento dado que seguramente muchos de ustedes estarán impacientes por comenzar con su primer skill, así que omitiré muchas cosas teóricas que dejaré para una segunda parte. Por lo tanto, si hay algo que no te queda muy claro, no te preocupes, en una segunda parte explicaré a mayor detalle lo que estaremos haciendo aquí.
Antes que nada necesitamos una cuenta en AWS, así que registrarse para obtenerla y después continuar con el tutorial.
Nuestra primer skill será muy sencilla pero suficiente para mostrar los conceptos de Utterance, Intents y Slots. La skill nos permitirá decirle a Alexa que sume dos números, una conversación podría ser la siguiente:
Usuario: Alexa, abre dime la suma
Alexa: Hola raton con cola, yo puedo sumar dos números, dime cuales
Usuario: Suma cinco mas diez
Alexa: cinco mas diez es igual a quince
Definido esto, manos a la obra. Para crear la skill debes dirigirte a la consola de desarrollo de Alexa, la cual tiene un aspecto como la siguiente imagen:
Da clic en el botón Create skill y establece los siguientes valores:
La opción Provision your own nos permitirá ejecutar los recursos backend en la plataforma Amazon Lambda.
Una vez creada la skill, veremos una pantalla donde del lado derecho existirá una especie de checklist con 4 pasos escenciales que debemos cubrir para crear nuestra skill, vayamos en órden y demos click sobre la opción Invocation Name
En esta parte debes establecer algo conocido como el Invocation Name, el cual es el nombre por el que le dirás a Alexa que abra tu skill, según nuestro ejemplo de conversación de arriba, el Invocation Name es “dime la suma”. Para crear el Invocation Name sigue estos 3 pasos:
Ahora podrás ver que el punto de Invocation Name está completo y marcado con una palomita verde.
El próximo paso ahora es establecer los Intents, Utterances y Slots que necesitaremos, así que da clic en Intents, Samples, and Slots >
Los Intents (intenciones) son las acciones que el usuario pedirá a Alexa. Los Intents no son mas que un nombre mediante el cuál en nuestro backend referenciaremos para hacer algo, en este caso en el código Java usaremos este Intent para realizar la suma. Por el momento sigue estos 3 pasos
Al crear el Intent, pasarás a otra pantalla para crear los Utterances o enunciados. Los Utterances son las frases que el usuario puede decirle a Alexa para que nos sume dos numeros. En nuestra conversación de ejemplo que vimos al inicio, el Utterance es
Usuario: Suma cinco mas diez
Sin embargo, el usuario puede decir variantes como por ejemplo:
suma cinco y diez
cuanto es cinco mas diez
cinco mas diez
sumale cinco a diez
De lo anterior desprendemos que tenemos dos variables, a estas variables son a lo que denominados Slots.
Suma {uno} mas {dos}
Por lo tanto {uno} y {dos} son nuestros slots. Primero vamos a crear nuestros Slots, en la pantalla actual localiza en la parte de abajo el apartado Intent Slots y agrega dos Slots de tipo AMAZON.NUMBER
, la siguiente imagen describe lo que debes hacer:
Ahora en la misma pantalla en la parte de arriba es donde debemos crear los Utterances, es decir, las frases que creemos que el usuario puede decirle a Alexa para que sume dos números. Completa los siguientes pasos y que se pueden observar en la imagen:
El JSON contiene el nombre de nuestro Intent creado y que se llama “SumaIntent”, así mismo están los Utterances y Slots.
{
"interactionModel": {
"languageModel": {
"invocationName": "dime la suma",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "SumaIntent",
"slots": [
{
"name": "uno",
"type": "AMAZON.NUMBER"
},
{
"name": "dos",
"type": "AMAZON.NUMBER"
}
],
"samples": [
"{uno} mas {dos}",
"cuanto es {uno} mas {dos}",
"{uno} y {dos}",
"suma {uno} y {dos}",
"suma {uno} mas {dos}"
]
}
],
"types": []
}
}
}
Si ahora regresamos a la vista de build vamos a observar que ya solo nos falta 1 paso y es vincular nuestro frontend que acabamos desarrollar (si, también se llama frontend) con nuestro backend que vamos a desarrollar en Java.
No explicaré paso a paso como desarrollar el backend en Java, en lugar de eso descarga el código fuente clonando el repositorio y abre el proyecto con tu IDE favorito. El proyecto ya contiene todo lo necesario para subirlo a Amazon Lambda, solo necesitas crear un JAR, dado que el proyecto está configurado con Gradle, solo necesitas correr la tarea shadowJar para generar el artefacto, el proyecto ya está configurado para que te aparezca esta tarea la cual genera un JAR con dependencias.
Dado que el JAR generado pesa más de 10 MB, será necesario alojar el JAR en Amazon S3 debido a que Amazon Lambda no permite componentes mayores a 10MB.
Así pues, ingresa a la Consola de Administración de AWS y buscar el servicio S3 asi como se muestra en la imagen
Ingresa a la opción y luego localiza el botón de “Crear bucket” y establece un nombre el cual debe ser único, por ejemplo yo lo nombre como “calculadora-ask”, el resto de valores dejalos tal cual están, incluyendo el de región EE.UU. Tendrás el bucket creado, da click sobre su nombre para entrar y cargar el JAR.
Para cargar el jar solo da clik al botón cargar, busca el JAR y a todo da siguiente hasta que el archivo esté cargado. Al finalizar verás al archivo cargado, ahora da click sobre su nombre para que puedas obtener su url, copiala porque la vas a necesitar en el siguiente paso
Ahora debes crear una nueva función Lambda, dirigete nuevamente a la consola y busca ahora el servicio de Amazon Lambda, luego da click en Create Function y completa los siguientes pasos
Estamos a solo unos pasos de completar nuestra primer skill para Alexa. Amazon Lambda es una plataforma que puede ejecutar un código determinado cuando ocurre un evento, por lo tanto para nuestra función recien creada debemos vincularla al JAR creado y agregar un desencadenador, es decir, el evento que desencadenará que el código en el JAR se ejecute. Para ello, sigue los siguientes pasos que ves en la imagen:
Paso 1. Da click en “Añadir un desencadenador”: Busca Alexa Skills Kit, vas a necesitar el ID de la skill alexa que creamos al inicio, para ello abre la consola de alexa en otra ventana, localiza el nombre de tu skill y en View Skill ID obtendrás el ID.
Ahora pega el ID de la skill
Paso 2. Sube el código de la función: Vuelve a entrar a la configuración de la función lambda que estamos creando, ya verás un desencadenador que es la skill alexa. Ahora en la sección de Código de la función llena los valores como se muestran en la imagen, en el campo controlador escribe windoctor7.github.io.alexa.skills.calculadora.MainStreamHandler
y pega la URL que obtuviste al subir el JAR en Amazon S3 (te dije que la copiaras ;) )
Finalmente da click al botón Guardar.
En la esquina superior derecha, encontrarás un código ARN, la leyenda dice algo así:
ARN - arn:aws:lambda:XXXXXXXXXXXXXXXXXXXXX
Copia este código ya que ahora deberemos conectar nuestra skill alexa (frontend) con nuestro backend para que sume los números.
Regresa a la consola de alexa, recuerdas que nos faltaba un punto final, el ENDPOINT, da click en la opción
Solo debes elegir la opción AWS Lambda ARN y en el campo Default Region pegar el código ARN que te comenté arriba.
Listo!!! Finalmente llega el momento de probar nuestra skill así que para ello vamos a probarla primero desde la consola y si todo funciona bien la probaremos desde nuestro dispositivo físico.
Dirígete a la opción Test, elige el idioma Español y escribe “abre dime la suma” (este es nuestro Invocation Name recuerdas?)
Si todo sale bien, Alexa deberá darte el mensaje de bienvenida, luego escribe “suma ocho mas doce” y pulsa la tecla ENTER, verás que Alexa te dice el resultado:
Para probar nuestra nueva Skill en Alexa, lo único que debes hacer es abrir la app de Alexa en tu celular con la misma cuenta con la que creaste la skill. Dirigete a Skills y juegos luego selecciona Mis Skills y en la categoría Desarrollador encontrarás tu apreciada y flamante Skill. Ingresa a la Skill y solamente activala… listo! Has la prueba y continúa jugando a agregar nueva funcionalidad.
Aqui pueden ver el video demostrativo en el dispositivo físico.