Cómo crear tu propia skill para Alexa paso a paso

Los asistentes de voz están cada vez más presentes en nuestras vidas. Ya no solo en nuestros móviles, sino que tenemos todo tipo de dispositivos como, por ejemplo, Google Home o Amazon Echo, ambos con distintas variantes.

Al igual que pasó con los dispositivos móviles y las interfaces táctiles, ahora se abre un nuevo mundo de posibilidades para los desarrolladores con las interfaces de voz. En este artículo nos vamos a centrar en el asistente de voz creado por Amazon: Alexa. Que incluye ya 5 dispositivos como Echo Dot, Echo, Echo Plus, Echo Spot y Echo Show.

En los últimos meses he estado aprendiendo sobre cómo crear una skill, así se llaman las aplicaciones en este asistente, y las distintas herramientas que tenemos para ello. Escribí una serie de posts que voy a usar como referencia aquí según vaya comentado cada paso.

¿Por dónde empiezo?

Lo primero es pensar en la skill que queremos crear. Mi consejo es ir a algo sencillo que no requiera de bases de datos o llamadas a APIs externas. De primeras siempre podemos construir algo que tenga la información en el propio código de server, ya sea con código estático, un fichero JSON o similar. Ese fue mi caso cuando decidí crear mi primera skill que permite consultar los estrenos de cine de un determinado periodo de tiempo. Lo importante es que nos centremos en aprender el paradigma de crear una skill.

Hay bastante documentación oficial y alguna que otra charla en español. Hice una pequeña recopilación en mi primer post de la serie. Para conocer cómo funciona Alexa en pocas palabras puedes ver el siguiente vídeo (inglés) de la cuenta oficial de Alexa Developers en YouTube.

Desarrollo de la skill

Una skill de Alexa no es diferente a cualquier aplicación que se hace hoy en día. Tiene una parte cliente y una parte servidora. La parte cliente es la responsable de definir el modelo de interacción (Interaction Model) con el usuario. Este modelo está compuesto de varias partes que veremos más adelante. Para la parte server vamos a usar AWS Lambda y el SDK que nos proporciona Alexa para Java. Aunque sea para Java nosotros vamos a ver su uso con Kotlin. Cualquier lenguaje de la JVM nos valdría.

Antes de ponernos manos a la obra necesitamos tener una cuenta de desarrollador de Amazon. La podemos hacer desde la web oficial de Alexa y nos permitirá acceder al conjunto de servicios que ofrece Amazon a desarrolladores. En nuestro caso, nos permitirá acceder tanto a la Alexa Developer Console como a los servicios AWS donde usaremos AWS Lambda.

La primera skill que desarrollé, que he tomado como base para los artículos, permite a un usuario preguntar por estrenos de cine indicando un periodo de tiempo. Como escenario básico podemos plantear la siguiente interacción:

Igualmente el usuario podría hacer usar la skill con una “one-shot invocation”. O podría indicar un periodo de tiempo para el cual no se conocen los estrenos:

Y, como evolución, al principio no obligaba a indicar un periodo de tiempo pero luego lo cambié:

Creando el Interactor Model con la Alexa Developer Console

La Alexa Developer Console es el site principal a la hora de desarrollar una skill para Alexa. Nos va a permitir cubrir gran parte del ciclo de desarrollo, pruebas, distribución, certificación y analíticas.

A la hora de crear una skill nos pide: nombre, idioma del skill y de qué tipo es. Los tipos disponibles dependen del idioma por defecto que elijas. Para español vamos a crear un “custom skill” ya que nos permitirá tener todo el control sobre la experiencia del usuario y crear nuestro propio interactor model.

Una vez creado pasarás a una ventana con diferentes pestañas. La pestaña de “build” será la que te ofrece toda la funcionalidad necesaria para crear el interactor model. La definición de este modelo no es más que generar un fichero JSON con una estructura concreta. Tendremos acceso a ese fichero si queremos, por ejemplo, versionarlo o crear otra skill partiendo de un modelo ya existente.

A modo de resumen, las partes del modelo son:

  • Nombre de invocación, el nombre que usará el usuario para invocar nuestro skill.
  • Intents, las acciones que un usuario va a poder hacer.
  • Utterances, son sentencias definidas a nivel de intent y sirven para lanzarlos.
  • Slots, son argumentos dentro de un utterance destinados a recoger información del usuario. Hay que asignarles un tipo al crearlos. Amazon ya ofrece algunos tipos predefinidos, pero podemos crear los nuestros propios.

El uso de slots en nuestro modelo va a depender del caso de uso. De los elementos anteriores son los únicos que no son obligatorios de definir ya que puede que no nos haga falta recopilar información del usuario. Como vimos en la sección anterior, mi skill lo fui evolucionando de tal forma que acabé definiendo un slot obligatorio con información sobre un periodo de tiempo determinado (esta semana, este mes, la próxima semana, etc).

Una vez hemos definido el modelo tenemos que construirlo. Esto nos va a permitir probarlo con el Utterance Profiler, una herramienta dentro de la consola que no requiere tener el server desplegado para ejercitar el modelo.

Usando AWS Lambda y Kotlin para la parte server

Ya creada la parte front de la skill vamos a explicar el back. Como dijimos antes vamos a usar AWS Lambda lo cual nos permitirá una integración muy sencilla. No voy a entrar en detalles de conceptos serverless porque no es el propósito de este post. Dejo aquí el enlace al artículo que escribió Ricardo Borillo sobre el tema.

Lo único a comentar es que uséis la región de Irlanda porque no todas os dejarán configurar una Alexa Skill.

Necesitamos crear una función en el panel de AWS Lambda y usaremos como runtime Java 8. Tendremos que hacer algún trámite adicional de config si no tenemos creado un rol previo para temas de permisos en AWS pero es sencillo. Os recomiendo también trabajar en base a versiones de la función que habéis creado. Os dará flexibilidad y control a la hora de ir desplegando distintas versiones de código contra vuestra skill.

Una vez creada la función tenemos que hacer la conexión con la skill. Para ellos tenemos que añadir el trigger de Alexa Skills Kit en nuestra función y añadir el skill id que podremos encontrar en la Alexa Developer Console. A continuación, tenemos que usar el ARN de nuestra función para indicarle al skill el endpoint que vamos a usar. De esta forma, la parte front y back pasan a conocerse la una a la otra.

Para el código del back, aunque hayamos elegido el runtime de Java 8, decidí usar Kotlin. Al principio lo hice en Java, pero lo acabé migrando. Tengo todo publicado en un repo de GitHub y podrás ver commit por commit el proceso. Como base usamos el SDK que nos ofrece Alexa para así poder recibir las peticiones de la skill y enviar respuestas completas a todos los devices que la estén usando.

Hay dos tipos de clases básicas que tendremos que crear:

  • Tantos RequestHandler como necesitemos para manejar los intents que vengan del skill. Un mismo RequestHandler puede manejar más de un intent.
  • Un SkillStreamHandler que será la clase principal de nuestro backend. Aquí registraremos los handlers que hayamos creado previamente.

Veamos la estructura básica de un RequestHandler:


public class StopIntentHandler implements RequestHandler {

    @Override
    public boolean canHandle(HandlerInput input) {
        return input.matches(intentName("AMAZON.StopIntent"));
    }

    @Override
    public Optional handle(HandlerInput input) {
        String text = "Gracias por usar Estrenos de cine";
        return input.getResponseBuilder()
                .withSpeech(text)
                .withSimpleCard(CARD_TITLE, text)
                .withShouldEndSession(true)
                .build();
    }
}

El método canHandle se usa para chequear si el handler puede manejar la petición que llega. Aquí la lógica básica que se suele hacer es mirar el nombre del intent de la request.

El método handle es el encargado de recibir el input y construir la respuesta para el usuario a partir de su request. Es el método donde irá el código más interesante del handler. Aquí también procesaremos cualquier slot que necesite nuestra skill. En el caso del ejemplo me gustaría destacar tres cosas:

  • withSpeech, le estamos dando a la respuesta el texto que Alexa dirá de voz al usuario.
  • withSimpleCard, aquí construimos una salida para Alexa que será útil para dispositivos con pantalla, como la app del móvil.
  • withShouldEndSession, con esto le indicamos a Alexa que, una vez manejada la request, no esperamos otra interacción con el usuario y cerramos la sesión, es decir, el skill.

Una vez creados los RequestHandler que necesitemos pasamos a registrarlos en SkillStreamHandler:


public class UpcomingMoviesStreamHandler extends SkillStreamHandler {

    public static final String CARD_TITLE = "Estrenos de cine";

    public UpcomingMoviesStreamHandler() {
        super(getSkill());
    }

    private static Skill getSkill() {
        return Skills.standard()
                .addRequestHandlers(
                        new LaunchRequestHandler(),
                        new HelpIntentHandler(),
                        new CancelAndStopIntentHandler(),
                        new NewReleasesIntentHandler()
                ).build();
    }
}

Destacar que el orden de registro de los handlers afecta a la elección del adecuado para manejar una petición del usuario. El SDK irá validando los handlers en el order que fueron registrados y el primero que retorne true para el método canHandle será el elegido.

Ahora ya solo nos falta crear un artefacto para desplegar en nuestro lambda.

Cómo probar la skill manualmente con las herramientas de Amazon

Con la parte back lista podemos probar manualmente el funcionamiento de nuestra skill de varias formas:

  • Con el Utterance Profiler como decíamos al construir el modelo. Sin tener el back desplegado vamos a poder lanzar utterances verificando el intent y los valores de slots que acabaría enviando al lambda.
  • Con las herramientas de AWS Lambda podemos crear eventos que serán lanzados al back que hemos creado. De esta forma, podemos simular peticiones que llegarán desde Alexa. Amazon ya nos ofrece plantillas para crear esos eventos de pruebas y tenemos un sistema de logs integrados de AWS.

Distribución y certificación

Y ya estamos llegando al final del proceso. Al igual que las aplicaciones móviles, tenemos que publicar nuestra skill en una tienda on-line que tiene Amazon. Para llegar hasta ahí tenemos que cumplimentar toda la información de distribución de la skill y pasar un proceso de certificación previo que realiza Amazon.

Todo esto lo hacemos a través de la Alexa Developer Console:

  • Desde la pestaña de Distribution sólo tenemos que completar el formulario que nos pide Amazon. Es fácil y no hay mucho que explicar aquí, pero quería destacar un apartado: las frases de ejemplo. Lo que pongamos ahí influirá mucho en el proceso de certificación y en cómo los usuarios interactuarán con el skill la primera vez. Además, desde aquí podremos también habilitar el beta testing sin necesidad de publicarla.
  • Una vez hemos completado lo anterior podremos pasar a la Certification. Desde aquí podremos hacer un par de validaciones previas al envío de la skill a la certificación por Amazon. Las validaciones previas llevan poco tiempo y tendremos feedback en la propia Alexa Developer Console. La certificación definitiva lleva algo más de tiempo y te llegará el resultado por correo electrónico. Ya sea feedback para arreglar cosas o que tu skill ha pasado el proceso y será automáticamente publicada en la tienda.

Conclusiones

En este artículo hemos ido viendo todos los pasos necesarios para crear nuestra primera skill de Alexa:

  • El caso de uso a resolver, crear una skill que nos permitiera preguntar a Alexa por los estrenos de cine de un periodo de tiempo determinado. El usuario tenía que indicar ese periodo de forma obligatoria, por ejemplo, “esta semana”, “este mes”, “la próxima semana”, etc
  • A través de la Alexa Developer Console hemos creado el modelo de interacción, el front de la skill, para con el usuario. Ahí hemos identificado las distintas partes del modelo: nombre de invocación, intents, utterances y slots.
  • Para la parte back de la skill hemos usado AWS Lambda y Kotlin. En este paso hay algunas tareas de configuración imprescindibles para conectar el front con el back. Además hemos visto cómo usar el SDK que proporciona Alexa para Java. Y, para finalizar, hemos generado el artefacto que se acaba desplegando en AWS.
  • Una vez tenemos ambas partes de la skill terminadas hemos pasado a hacer pruebas manuales. Desde la Alexa Developer Console tenemos acceso a un simulador que nos dará información muy detallada de cada interacción.
  • Y el último paso, completar la información de distribución de la skill y mandarla al proceso de certificación de Amazon. Una vez pasemos ese proceso de forma exitosa tendremos nuestra primera skill de Alexa publicada.

Yo no tenía muchos conocimientos previos sobre este tema, ni lo que implicaba tanto un paradigma de interfaces de voz como AWS. Gracias a los recursos que otros comparten y una gran documentación oficial pude crear mi primera skill en poco tiempo y ganar algunos dispositivos Alexa gratis. Amazon suele sacar promociones para desarrolladores de skills cada cierto tiempo. Pongo una par de enlaces en la sección final de recursos.

He aprendido mucho durante el proceso, sobre todo dándome cuenta de los retos a la hora de usar una aplicación con la voz. Temas como los acentos al hablar, la forma particular de cada uno de decir ciertas palabras o lo rico del lenguaje para expresar la misma acción. Son dificultades a las que te vas a enfrentar al crear este tipo de aplicaciones. Tecnologías como Alexa, y todo lo que tiene detrás por parte de Amazon, hacen más fácil gestionar estos desarrollos pero aún queda mucho por hacer. Además, como se puede comprobar con este artículo, crear tu primera skill es un proceso de poca dificultad.

Te animo a profundizar en temas como conversaciones por turnos, es decir, crear verdaderos diálogos entre Alexa y el usuario. Así como dotar a una skill de la capacidad de mantener el contexto o dar respuestas progresivas porque tienes que hacer alguna operación costosa o asíncrona en el server. Y, una de las cosas que creo que más puede gustar, jugar con el lenguaje de marcado para el habla que tiene Alexa con el cual podrás decir cosas en distintos idiomas, dar entonaciones a las palabras, usar frases predefinidas, etc.

Recursos

Ver todos los comentarios en https://www.genbeta.com

VER 7 Comentarios

Portada de Genbeta