“Amazon Echo dot” by Andres Urena on Unsplash

Crear una skill de Alexa usando Python 1/2

Francisco Rivas
Diseñando para la Voz
9 min readOct 21, 2018

--

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

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…

by jesse orrico on Unsplash

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:

Happy Path de Exploradores Fantásticos

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.

Crear la 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)
Agregando el nombre de la skill, el idioma y el tipo

Ahora debemos asegurarnos de cada uno de los pasos estén completados (en verde), para ello hacemos click en el primero Invocation Name.

Asegurarnos de que cada paso indicado (6) este completado

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).

Asignamos el nombre con el que invocamos la skill
Nombre de apertura

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.

Creando la intención para nuestra skill

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).

Agregando los enunciados con variables (slots)

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).

Especificando el tipo de variable y guardando el modelo.

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.

Ahora al paso 3: Build Model
Terminado el proceso de construcción del modelo

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

by Runscope.com

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.

Seleccionamos Lambda

Luego hacemos click en Create function. (3).

Creando la función Lambda

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).

Agregando la información básica de la función

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.

Obteniendo información para conectar el Front-End y el Back-end

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.

Conectando el Back-End con el Front-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).

Conectando el Front-End con el Back-End

Una vez que todo esta correcto se activa el boton Save (7).

Guardando los cambios

Volvemos a las consola de desarrolladores de ASK y hacemos click en Save Endpoint (8).

Guardando el punto de conexión

Ya tenemos todos los componentes de nuestra skill completos.

Componentes de la skill completados satisfactoriamente

Un momento, aún hay mas…

by Jason Tourville

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.

--

--

Francisco Rivas
Diseñando para la Voz

Alexa Developer | Coffee Enthusiast | Percussionist | Curious (life, tech) | Keen on learning