skills de Alexa como servicios web - parte 1: Creando la Skill en el portal de Amazon

El día de hoy inicio con algo que tenía pendiente intentar por varios meses ya. Escribiré un poco sobre cosas que voy descubriendo a la hora de desarrollar. Nuevas librerías, métodos y patrones de diseño, y en general cosas que vaya encontrando por el camino. He notado que hay mucha gente escribiendo sobre esto en inglés, pero no sé qué tanta gente escribe en español. Así que, en parte para contribuir un poco con la documentación sobre varios temas en español, y para no olvidar lo que voy aprendiendo, aquí estaré escribiendo sobre algunos temas que me resulten interesantes.

skills para alexa

Hace un par de semanas, debido a la necesidad de aprender algo nuevo para distraerme de lo que hasta ese momento llevaba haciendo, así como debido a una motivación personal, decidí revisar la documentación sobre el SDK para Alexa de amazon. A estas alturas, imagino que no hay qué explicar qué es Alexa ni qué es lo que puede hacer. Lo cierto es que llevo teniendo uno de estos dispositivos (específicamente un Echo dot de tercera generación) y nunca me había interesado por el desarrollo de skills para este ni para ningún otro dispositivo similar. Así que en este y otra serie de artículos, hablaré un poco sobre cómo crear skills para Alexa utilizando Python (que es uno de los lenguajes soportados, junto con Javascript/Node, Java, .net, PHP entre otros). Como se puede notar, amazon, más o menos, se ha tomado en serio eso de permitir a los desarrolladores elegir los lenguajes de programación que quieran para programar sus skills.

A lo largo de estos artículos se trabajará para crear una de las Skills más simples que se hayan podido imaginar hasta la fecha: Crear un lector de fuentes RSS. Se trabajará utilizando Python, flask y las librerías proporcionadas por Amazon, con lo que algo de conocimiento sobre Python es más que suficiente. Prácticamente todos los vínculos llevarán a documentación de Amazon en Inglés. Al término de esta serie, la Skill estará desplegada como un servicio web, aunque alternativamente se puede eliminar flask como dependencia y ejecutar la skill en un servicio Lambda.

¿Qué es una Skill?

Una skill es, a grandes rasgos, una "app" para Alexa. Los usuarios de alexa pueden iniciar una Skill e interactuar con ella. La mayoría de skills seguirán abiertas, atentas a las respuestas e interacciones con el usuario, hasta que este expresamente finalice la sesión diciendo "para" o similar. Existen otros métodos de interactuar con Skills, pero este es el más común para la mayoría de los desarrollos.

¿Cómo interactúa el usuario con una skill?

Antes de programar nada, es necesario conocer a grandes rasgos el modo en el que nuestros potenciales usuarios interactuarán con la Skill. Este proceso puede resumirse de la siguiente manera:

  1. El usuario decide abrir la Skill utilizando para ello el nombre de invocación: Cada skill debe tener uno, y es la frase que el usuario debe decir para que Alexa envíe los datos necesarios a nuestro servicio web.
  2. Una vez identificada nuestra Skill, Amazon envía a nuestro servicio web una "LaunchRequest" (¿petición de lanzamiento?). Amazon puede enviar varios tipos de peticiones para que nuestro servicio web reaccione a ellas. Siempre al llamar la skill por su frase de invocación, se generará una Launch Request.
  3. Nuestro servicio debe recibir la petición post, comprobar que la llamada es realizada por uno de los servidores de amazon, y enviar una respuesta al usuario. Esta respuesta puede incluir texto a voz, audio, una tarjeta (que es un Widget para dispositivos con pantalla) y varias otras directivas.
  4. El usuario continuará interactuando con la Skill al responder a las preguntas que le hagamos, o al ser guiado por nosotros para que llame otras "intents". En Alexa, un intent (que pudiera ser traducido como intención) es como se llama a una palabra o grupo de palabras que desencadenan una acción por nuestra Skill.
  5. Nuestra Skill recibe en la función que hemos designado la intent, la procesa, responde al usuario y los pasos 4 y 5 se repiten hasta que el usuario decide que ha tenido ya suficiente de nuestra Skill, y pide a alexa que pare.
  6. Al pedir a Alexa que pare, o al decidir, en la lógica de nuestra Skill, que ya es hora de parar, se generará una SessionEndedRequest (petición de sesión terminada), lo que hará que la skill cierre la sesión con el usuario. Esto es importante porque a partir de aquí, el usuario ya no podrá interactuar con la skill, a menos que la llame de nuevo utilizando su frase de invocación, y cualquier dato persistente que se haya almacenado en la sesión se perderá de igual modo.

Para más información sobre los diferentes tipos de peticiones que Envía alexa a las Skills, La referencia en el Alexa skills kit es muy buena.

lector de noticias

Para este ejemplo, crearemos una skill que tiene un propósito muy sencillo. Se encargará de hacer las siguientes tareas:

  • Puede listar las últimas x noticias de nuestro sitio RSS de preferencia. Naturalmente, el número dependerá de la fuente RSS. En mi caso, he elegido leer las noticias de RT en español.
  • Si le pedimos a alexa que nos lea la noticia 5, leerá todo el texto de la noticia.
  • Para evitar que Alexa lea mucho texto y duerma al usuario, le preguntaremos cada cierto tiempo si quiere que siga leyendo, para que la experiencia sea más cómoda.

Requisitos

Estos son los requisitos para el proyecto en cuestión:

  • Una cuenta de desarrolladores de Amazon: Si no tienes una todavía, puedes Crearla aquí
  • Un servidor VPS con un dominio que apunte a este y un certificado SSL: Técnicamente el código expuesto aquí puede correr sin problemas en un servicio Lambda. pero nunca lo he probado. Para el certificado SSL se puede muy bien usar letsencrypt.

Curiosamente, para este tipo de Skills no se requiere tener un dispositivo Alexa. Aunque naturalmente, si se quiere disfrutar (y no solo probar) la Skill, sí que será necesario.

paso 1: Creando la skill

Lo primero que vamos a hacer, antes de poder siquiera tocar algo de código, es crear la skill en el portal de Desarrolladores de Amazon. Esto es indispensable ya que será el punto de conexión entre nuestra Skill y cualquier dispositivo alexa. En este momento, el portal de desarrolladores se encuentra disponible solamente en inglés, y creo que no es algo que vaya a cambiarse. Aunque el proceso para crear skills es más bien sencillo:

  1. Accedemos a la consola de Alexa en el sitio de desarrolladores de Amazon. Aquí se muestra una tabla con todas las Skills que hay ya creadas en la cuenta. Si no hemos creado ninguna antes, naturalmente no se mostrará nada. Para crear una nueva skill, existe un botón que dice simplemente "create skill", justo después del campo de búsqueda en la web.
  2. Al crear una nueva skill, aparece una web que puede ser algo confusa. Muchos controles no se encuentran etiquetados correctamente por lo que se pueden seleccionar, incluso con el teclado, pero tiene que ponerse atención al trabajar con esto. Lo primero que seguramente querremos llenar es el nombre de la skill, que en este momento no puede contener más de 50 caracteres. En mi ejemplo, yo voy a extraer noticias de RT en Español, así que simplemente le pondré RT en español. Naturalmente, si esta Skill saliera a producción algún día tendríamos qué cambiar el nombre para no incumplir con la política de nombres de skill de amazon. Es importante destacar que este es el nombre de la skill, pero no el nombre de invocación. El nombre de invocación debe ser diferente de este y debe tener más de dos palabras, sin contar artículos.
  3. En el apartado "Default Language", normalmente está seleccionado el idioma con el que se tiene configurada la cuenta de Amazon del Desarrollador. En mi caso está puesto a Spanish (MX). Esto se lee por un lector de pantalla como solo texto, pero no lo es: al pulsar sobre el idioma con la barra espaciadora, se despliega la lista de idiomas. Se puede seleccionar un idioma diferente utilizando las flechas de cursor y pulsando espacio sobre el idioma que se desea seleccionar. Al hacer esto, la lista se volverá a reducir y solo se verá el idioma seleccionado. Si quieres incluir soporte para más de un idioma o locale en una skill, más adelante se pueden añadir más idiomas.
  4. En el apartado que dice "choose a model", tenemos qué elegir el modelo de voz que nuestra skill utilizará. Un modelo de voz se encarga de mapear las frases y palabras de los usuarios con intents de Alexa para que el desarrollador no tenga qué generar el modelo de voz a mano. Aunque en este momento es más fácil elegir el modelo de voz "custom" para comenzar. Para elegirlo con el teclado, simplemente ubica el encabezado con el modelo "Custom" y pulsa espacio o intro.
  5. En el apartado "Choose a method to host your skill's backend resources" tenemos qué seleccionar cómo queremos almacenar nuestra Skill. Básicamente tenemos dos opciones: utilizar los "Alexa Hosted" (para Node y Pytohn), que te entregan una cantidad de recursos gratuitos bajo un servicio Lambda, y te dan todo listo para empezar a trabajar, o la opción "Provision your own", donde tú proporcionas la URL de un servidor al que alexa llamará cada que un usuario interactúe con la Skill. En mi caso elegiré la opción "Provision your own", pero en teoría el código que vamos a escribir debería ser perfectamente posible de correr bajo lambda. De nuevo, para elegir alguna de estas opciones únicamente te debes situar sobre el encabezado correspondiente y pulsar intro.
  6. Quizá esta sea la opción más rara para los usuarios de lectores de pantalla, pero aquí vamos: Para guardar los cambios, tienes qué desplazarte de nuevo hacia el nombre de tu aplicación, y de ahí utilizar la flecha hacia arriba hasta encontrar el botón llamado "create-skill-save-btn". Otra cosa que se puede hacer es utilizar el atajo Shift+B para navegar hasta el botón anterior, que debe ser este. Sea cual sea el método utilizado, a ese botón hay qué pulsarlo para guardar los datos de nuestra Skill.
  7. Una vez se han guardado estas preferencias, se nos preguntará por nuestra plantilla. Es decir, podemos importar una skill desde un repositorio git, o tomar una plantilla de una Skill que alguien haya hecho y compartido en Amazon Developers. Para este ejemplo dejaré la opción predeterminada, que es, literalmente, iniciar desde cero. O algo así. Para continuar, simplemente pulsa sobre el botón "Continue with Template".
  8. ¡Lo hemos conseguido! una vez pulsado dicho botón, amazon nos informará (si usas lector de pantalla, la información está al final de la página) que en este momento se encuentra creando nuestra skill, y nos dice que el proceso puede demorar varios minutos. Realmente no demora más de uno, así que pronto podremos seguir con el paso 2.

paso 2: configurando nuestra skill

Una vez hayas creado la skill en el portal de Amazon, antes de nada debes modificar dos cosas, para poder concentrarnos en el código. El nombre de invocación y el endpoint. El nombre de invocación le dice a Alexa cómo se llamará tu Skill de cara al usuario, mientras que el endpoint le dice a dónde tiene qué enviar las solicitudes cuando este pida algo a tu Skill.

Si usas lector de pantalla, aquí va otro tip raro para navegar por el portal de Amazon: Existe un cuadro combinado desde donde se accede al idioma de la Skill, y en general, a las preferencias de idioma (desde donde se pueden añadir más variantes o idiomas nuevos). Justo debajo de ese cuadro combinado, está el menú de navegación de la Skill, desde donde se efectúan todas las acciones importantes (editar el modelo de datos, cambiar el nombre de invocación, el endpoint, añadir o eliminar interfaces, etc). Siempre que hable del menú de la skill me referiré a este menú específicamente.

Para cambiar el endpoint, que es hacia donde nuestra skill llamará una vez el usuario solicite algo, se debe hacer lo siguiente:

  1. En el menú de la skill, selecciona "endpoints". Eso te llevará a una web donde hay dos botones de radio que te preguntan por qué método quieres que tu skill se comunique con el código.
  2. Asegúrate de seleccionar el segundo botón, llamado "https".
  3. Rellena al menos el primer cuadro de texto con la dirección de tu endpoint. Por definición, debe ser un endpoint SSL.
  4. Una vez completado, después de ese campo existe otro donde se te pregunta por el tipo de certificado de seguridad. Por lo general puedes seleccionar la opción "My development endpoint has a certificate from a trusted certificate authority".
  5. Cuando hayas terminado, pulsa sobre el botón "save endpoint" para guardarlos. si usas lector de pantalla, puede que desees utilizar de nuevo el atajo Shift+B para desplazarte a los botones anteriores.

Finalmente, para cambiar el nombre de invocación de la skill, realiza lo siguiente:

  1. En el menú de la skill, selecciona "Invocation".
  2. De la página que se nuestra a continuación, únicamente verás un campo de texto donde deberás escribir la frase de invocación que quieres que tenga la skill. Como nota, ten en cuenta que debería ser un nombre que no sea fácil de confundir para Alexa, de preferencia en el idioma de la skill. Si quieres utilizar letras como parte de siglas, por ejemplo para RT, utiliza mayúsculas. Mi ejemplo es simplemente "noticias de RT". Importante es que tu invocación no puede empezar con mayúsculas, ni contener cosas como skill, app, alexa o demás.
  3. De nuevo, si usas lectores de pantalla, deberás buscar los botones anteriores. Hay qué pulsar dos botones, primero el que se llama "Save model" y después "build model". Si Pulsas sobre build Model, puedes buscar un encabezado anterior para encontrar si el modelo se ha guardado con éxito. Normalmente, encontrarás "Skill Saved Successfully" si todo ha ido bien, u otro mensaje con detalles sobre el error en caso contrario. De igual modo, al construir el modelo podrás encontrar en un encabezado, siempre anterior al foco actual, si la skill se ha construido con éxito o no.

Modelo

Como ya has visto, el modelo de voz es importante. Es la pieza más importante que tenemos en este momento en la skill. El modelo, que debe guardarse y reconstruirse cada ciertos cambios, mapea los textos con la voz de los usuarios de la skill, y genera siempre una serie de datos que ayuda a alexa a saber cómo identificar lo que se le dice. Es por eso que se debe volver a construir el modelo cada vez que se cambia algo que tenga mínimamente qué ver con algo que el usuario diga (como el nombre de invocación, o prácticamente todo lo que se haya puesto en el modelo de voz).

conclusión

Por ahora ha sido todo. Hemos configurado, desde el portal de desarrolladores de Amazon, una skill que estamos próximos a utilizar en nuestro siguiente artículo, donde exploraremos un poco algo más sobre el modelo de voz que hemos construido, qué podemos hacer con él, y algo sobre el SDK de alexa.