Crear una skill de Alexa usando Python 1/2
Amazon ha hecho un gran esfuerzo en acercar el desarrollo de skills para Alexa a las diferentes comunidades de desarrolladores, ofreciendo SDKs para distintos lenguajes de programación, entre ellos Python. Lenguaje que no necesita presentación.
Desde que empecé a desarrollar skills para Alexa (que no es que sean muchas) he observado cómo el soporte, el interés y la comunidad de desarrolladores de skills en Python ha crecido. Esto es lo que motiva este artículo que espero sea útil e interesante (y no muy aburrido).
¿Qué esperar de esta serie?
En primer lugar tener una idea general de cómo crear una skill de Alexa en Python, utilizando las herramientas web que ofrece Amazon para ello, puesto que se puede hacer también a través del ASK CLI, esto último para otro artículo.
Por otro lado comprender mejor la estructura de la función Lambda asociada a una skill de Alexa.
Finalmente cómo probar la skill localmente y en el simulador.
La idea de la skill que vamos a crear está tomada de uno de los últimos episodios de Alexa Dev en Twitch por Cami Willams. Ella lo ha escrito en JS y utilizando persistencia, nuestra versión será bastante más sencilla puesto que no tendrá persistencia, vamos paso a paso.
Requisitos
- Cuenta en la Consola de AWS. Esto para poder utilizar Lambda.
- Cuenta de desarrollador de Alexa. Esto permite crear skills.
- Conocimientos básicos de linea de comandos.
Diseñando la skill: vista desde 10.000 km¹
¹(bueno, no tanto, 2 km)
El proceso de diseño de una skill comprende varios pasos. Una de las mejores formas de hacerlo es dividiendo la skill en dos grandes partes.
Front-end
Que consiste en:
- Objetivo de la skill.
- Nombre.
- Diálogos de interacción o script (happy path).
- Nombre de apertura (invocation name).
- Intenciones (intents).
- Enunciados (utterances).
- Variables (slots)
Back-end
Que consiste en:
- Función Lambda
- Otros servicios como: S3, IAM, etc.
Manos a la obra…
Vamos con el Front-End
Objetivo
Somos unos exploradores de cosas, buscamos cosas, Alexa nos preguntará cuántos objetos queremos buscar o cazar durante el día y una vez le digamos, nos responde con ese número de objetos (aleatorios) y nuestra tarea es conseguirlos.
Nombre
Podemos llamarla: Exploradores Fantásticos
Happy Path
Lo que haremos es escribir cómo sería la interacción entre Alexa y el usuario en el mejor de los casos (esto se conoce como happy path). Para esto existen unas cuantas herramientas, en este otro artículo, Juan González describe su proceso de selección de la herramienta para diseñar estos diálogos o interacciones. En nuestro caso sería algo como lo siguiente:
Por supuesto, existe una variedad amplia de happy paths sin embargo esto es para tener una idea.
Ahora podemos ir a la consola de desarrolladores de ASK (ASK Developer Console) para crear nuestra skill. Hacemos click en Create Skill
.
Luego rellenamos los campos que solicitan y hacemos click en Create Skill
(5).
Skill Name: Exploradores Fantásticos (2)
Default Language: Seleccionamos Spanish (ES) (3)
El tipo de skill que queremos es custom (4)
Ahora debemos asegurarnos de cada uno de los pasos estén completados (en verde), para ello hacemos click en el primero Invocation Name
.
Nombre de apertura (invocation name)
Ahora decidimos cómo vamos a invocar nuestro skill. Vamos a utilizar el mismo nombre de la skill.
Entonces, el nombre de apertura será: exploradores fantásticos
Luego de insertar la frase (7) guardamos los cambios (8). Una vez que este proceso termina veremos un cuadro de información (9) indicando que los cambios han sido guardados satisfactoriamente. Luego para volver a la configuración principal hacemos click en Custom
(10).
Intenciones (intents)
En esta parte del proceso aprovecho para comentar otras cosas en referencia a las intenciones. En primer lugar (A) quiero resaltar que se pueden utilizar las intenciones predefinidas que Amazon ofrece, de hecho al momento de crear una skill ya podemos observar (B) que hay al menos 4 intenciones por defecto; esto depende de la skill que queremos crear, en nuestro caso es una skill personalizada (custom skill).
Vamos a crear un custom intent : ListItemsIntent
(12). Click en Create custom intent
.
Enunciados (utterances)
Son las frases que utiliza el usuario para interactuar con Alexa.
Haciendo una pequeña tormenta de ideas podemos hacer la siguiente lista de frases:
las que tú me digas
quiero buscar 4 cosas
no lo sé
decide tú
cualquiera
escoge tú
da igual
no importa
5
las que sean
Agregamos todas los enunciados que consideremos relevantes, es importante agregar una buena variedad, incluso se recomienda que sean unas 30, por el momento con las que tenemos es suficiente. Observamos que el usuario puede utilizar cualquier número, en una ocasión puede querer 3 cosas; en otra 5, etc, es por esto que se incluye el concepto de variables (slots).
Variables (slots)
Podemos comprender los slots como variables que pueden tener cualquier tipo y valor. De hecho Amazon nos ofrece, ya en Español, 24 de ellos: números, países, colores, ciudades, días de la semana, entre otros.
En el caso de Exploradores Fantásticos vamos a utilizar una sola que vamos a llamar numObj
. Nuestros enunciados, incluyendo la variable, serían así:
las que tú me digas
quiero buscar {numObj} cosas
no lo sé
decide tú
cualquiera
escoge tú
da igual
no importa
{numObj}
las que sean
Verificamos que el nombre de la intención que estamos editando es correcto y corresponde con el que queremos crear (A).
Cuando escribimos nuestros enunciados con {numbObj}
incluido como variable, automáticamente se crea una variable (B) con ese nombre, ahora debemos definir el tipo. Para ello desplegamos la lista y seleccionamos Amazon.NUMBER
(14) este es uno de los slots predefinidos que permite a Alexa comprender cualquier número. Una vez seleccionado el tipo, observamos que inmediatamente se agrega un Slot Type
(A). Ahora podemos guardar los cambios haciendo click en Save Model
(15).
Una vez que está guardado el modelo volvemos a hacer click en Custom
en el panel de la izquierda para volver a la pantalla principal. Hacemos click en Build Model
(15). Este proceso lleva unos 20–30 segundos.
Nos queda un paso pendiente, sin embargo aun no tenemos un Endpoint
con el cual conectar nuestra skill. Este es el siguiente paso.
Vamos con el Back-End
Función Lambda
Vamos a la Consola de AWS.
El asunto de las regiones: por regla general seleccionamos la region que más cerca este de nosotros. En mi caso Ireland
(1).
En la sección de AWS Services Seleccionamos escribimos lambda
veremos que tan pronto empezamos a escribir aparece un cuadro que nos indica Lambda (2), seleccionamos esa.
Luego hacemos click en Create function
. (3).
En esta sección del proceso de creación de la función se nos presentan 3 posibilidades:
- Crear una función desde cero (Author from scratch).
- Una función basada en una plantilla (Blueprints).
- Una función que ha sido publicada por AWS o sus socios, por ejemplo seleccionando esta opción encontramos las funciones de los ejemplos del repositorio de GitHub de Alexa.
Seleccionamos Author from scratch
(4).
Lo siguiente es ponerle un nombre a nuestra función, la llamaremos ExploradoresFantasticos (5).
Seleccionamos Python 3.6 como Runtime
(6).
Para el rol, tenemos dos opciones; creamos uno o utilizamos uno existente, en nuestro caso utilizamos uno existente, por lo que seleccionamos la opción Choose an existing role
(7).
En el menu desplegable seleccionamos lambda_basic_execution como rol de la sección Existing Role
(8).
Click en Create function
(9).
Llegados a este punto, ya tenemos nuestra función Lambda creada.
Ahora necesitamos conectar el Font-End y el Back-End. Esto se hace utilizando el ARN
(Amazon Resource Names) de la función Lambda y la Skill ID
.
Primero obtenemos el ARN
de nuestra función Lambda, simplemente lo copiamos (10).
Aprovecho para comentar un par de cosas más:
(11) Indica la función Lambda, de hecho cuando queremos utilizar el editor (inline) hacemos click allí.
(12) Indica qué es lo que dispara esta función, en el caso nuestro es una Skill de Alexa.
(13) Indica los servicios (permisos) a los que esta función tiene acceso. Si por ejemplo nuestra skill utiliza persistencia a través de DynamoDB, los servicios de este aparecen allí; el mismo caso seria con S3 y demás.
(14) Es el editor que podemos utilizar para escribir nuestra función, es bastante útil cuando la función es simple y no utiliza módulos adicionales, sin embargo en nuestro caso lo haremos de otra forma ya que el SDK no viene por defecto en la función, a diferencia de aquellas escritas en JS.
Una vez copiado el ARN
(10), volvemos a la consola de desarrolladores de Alexa (ASK Developer Console) y hacemos click en Endpoint
, de esta forma cumpliremos con el último requisito para completar la skill. De esta forma le estamos diciendo a la skill cuál será la función Lambda que utilizará. Hacemos click en (1).
Ahora seleccionamos la opción AWS Lambda ARN
(2), esto habilita varios cuadros de texto, uno de ellos con el titulo Default Region
, en ese pegamos el ARN
de nuestra función Lambda. Copiamos el Skill ID
puesto que lo necesitaremos para conectar el Front-End con el Back-End.
Ahora volvemos a la Consola de AWS y a nuestra función Lambda. Hacemos click en Alexa Skills Kit
(4) para insertar el Skill ID
(5). También podemos observar que automáticamente se crea un trigger
(4).
En el panel inferior se activa una caja de texto en la que insertamos la Skill ID
permitiéndonos conectar el Front-End con el Back-End y luego hacemos click en Add
(6).
Una vez que todo esta correcto se activa el boton Save
(7).
Volvemos a las consola de desarrolladores de ASK y hacemos click en Save Endpoint
(8).
Ya tenemos todos los componentes de nuestra skill completos.
Un momento, aún hay mas…
Bien, llegados a este punto tenemos el Front-End y parte del Back-End listos y conectados. Ciertamente, quizá durante el desarrollo de nuestra función Lambda observemos que necesitamos cambiar cosas y es perfectamente normal.
En el siguiente artículo describo el desarrollo entero de la función Lambda, la preparación del entorno de desarrollo, herramientas que utilizo, pruebas y algunas cosas mas.
[UPDATE]: Aquí, la parte dos.
Muchas gracias por leer,
Escribió para Diseñando para la Voz, Francisco. Hasta la siguiente!
Cualquier sugerencia, queja, duda o comentario son mas que bien recibidos. No dudes en contactarme.