Desarrollo de Skills Alexa con Alexa Blueprints

Llevo varios años viviendo en Francia y desde hace pocas semanas Amazon ha abierto su plataforma Amazon Blueprints en este país. Tengo un pequeño Amazon Echo Dot (de tercera generación) que cuesta entre 30 y 60 euros dependiendo de las ofertas del momento, y siempre me he interesado al desarrollo de aplicaciones.

Echo Dot

Amazon Blueprints permite crear aplicaciones (skills) de una forma muy sencilla sin tener que escribir nada de código. Yo me he puesto a probar todos los tipos disponibles, pero en este blog quiero hablaros de los flujos RSS.

Con un RSS se puede hacer una skill de tipo "flash news", donde preguntas a Alexa "dame las noticias" y ella responde lanzando la skill, o bien si el RSS posee más de un ítem se pueden hacer aplicaciones de podcast, donde el usuario puede escuchar la entrada más reciente pero también las más antiguas, y avanzar o retroceder. Por último, estos mismos RSS permiten ofrecer un streaming de audio. No hay que olvidar que estamos hablando básicamente de un altavoz inteligente, es decir que el principal uso de este tipo de aparatos es la difusión de música y audio en general.

La primera skill que os voy a comentar es de tipo "flash news". Se trata de recuperar el último tweet del Dalai Lama, traducirlo al francés, y meterlo en el flujo RSS. Luego desde la interfaz de Amazon Blueprints sólo hay que introducir la URL del RSS, que siempre debe ser https.

El formato del RSS es el siguiente:

<?xml version="1.0" encoding="UTF-8" ?>  
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">  
    <channel>
        <ttl>30</ttl>
        <title>Dalai Lama tweets</title>
        <link>https://www.tuxe.es/alexa-rss-dalai-lama/</link>
        <description>Feed for Dalai Lama tweets</description>
        <atom:link href="https://www.tuxe.es/alexa-rss-dalai-lama/" rel="self" type="application/rss+xml" />
        <item>
            <title>Le Dalai Lama, twitté le 20 avril 2020</title>
            <link>https://www.tuxe.es/alexa-rss-dalai-lama/</link>
            <description>Le temps bouge toujours; rien ne peut l'arrêter. Nous ne pouvons pas changer le passé, mais nous pouvons en tirer des enseignements pour façonner l'avenir. Le fait de mettre l'accent sur «nous» et «eux» est une source de conflit. Nous négligeons les qualités humaines fondamentales de gentillesse et de compassion. Travaillons ensemble pour créer un avenir plus heureux.</description>
            <guid>rn:uuid:b385254e-dc31-4c4a-afc5-169ab31ff57f</guid>
            <pubDate>2020-05-15T04:09:21.0Z</pubDate>
        </item>
    </channel>
</rss>  

Para recuperar el tweet del Dalai Lama, he instalado twarc y para traducir el tweet al francés, translate-shell. Aquí podéis ver el script:

<?php

$cmd = "twarc timeline dalailama 2>/dev/null | head -10";

ob_start();  
passthru($cmd);  
$datas = ob_get_contents();
ob_end_clean();

$datas = explode("\n", $datas);

$output = [];

foreach($datas as $data) {  
  $data = trim($data);
  if(empty($data)) {
    continue;
  }

  $data = (array)json_decode($data);

  if(empty($data['in_reply_to_status_id'])) {
    $text = $data['full_text'];

    if(! strstr($text, 'http')) {
      $cmd = 'trans -b :fr "'.$text.'"';
      $translation = exec($cmd);

      if($translation) {
        $aux = [];
        $aux['text'] = $translation;
        $aux['timestamp'] = strtotime($data['created_at']);

        $output[] = $aux;
      }
    }
  }
}

if(!empty($output)) {  
  file_put_contents("./twitter_dalai_lama.json", json_encode($output));
  exit(0);
}
else {  
  exit(1);
}

En resumen, este script lanza twarc para recuperar los 10 últimos posts, luego en el bucle miro que no se trate de un retweet, que no tenga una url dentro, porque entonces podría ser una imagen, y finalmente lanzo translate-shell para traducirlo. Si la traducción me devuelve algo, lo meto en un array y al final escribo el array en un fichero .json que será recuperado por el PHP encargado de construir el flujo. Este ultimo script no merece la pena que os lo muestre, simplemente lee el fichero .json, elige uno de los 10 tweets al azar y construye la estructura XML del feed.

Así, cada vez que digo a Alexa "dime las noticias", Alexa repetirá uno de los 10 últimos tweets del Dalai Lama.

skill culture tibétaine

Para hacer un sistema de podcast el funcionamiento es el mismo. Simplemente hay que publicar un RSS con el siguiente formato:

<?xml version="1.0" encoding="UTF-8" ?>  
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">  
    <channel>
        <ttl>30</ttl>
        <title>Ecole Saint Joseph children tales</title>
        <link>https://www.tuxe.es/alexa-rss/</link>
        <description>Feed for the Ecole Saint Joseph children tales</description>
        <atom:link href="https://www.tuxe.es/alexa-rss/" rel="self" type="application/rss+xml" />
        <item>
            <title>Je_nai_pas_desobei.mp3</title>
            <link>https://www.tuxe.es/alexa-rss/</link>
            <description></description>
            <guid>rn:uuid:b385254e-dc31-4c4a-afc5-00f5e64801d4</guid>
            <pubDate>2020-05-15T04:51:10.0Z</pubDate>
            <enclosure url="https://www.tuxe.es/alexa-rss/data/Je_nai_pas_desobei.mp3" length="2880091" type="audio/mpeg" />
        </item>
        <item>
            <title>au_cirque_bavard.mp3</title>
            <link>https://www.tuxe.es/alexa-rss/</link>
            <description></description>
            <guid>rn:uuid:b385254e-dc31-4c4a-afc5-092a067b0d16</guid>
            <pubDate>2020-05-14T05:51:10.0Z</pubDate>
            <enclosure url="https://www.tuxe.es/alexa-rss/data/au_cirque_bavard.mp3" length="1895577" type="audio/mpeg" />
        </item>

    </channel>
</rss>  

La diferencia consiste en que <description> se queda vacía y la nueva entrada <enclosure> contiene la url del audio. Éste debe ser un fichero MP3 codificado a 256k en estéreo o mono y servido desde una dirección https.

Para hacer una skill de streaming de una emisora de radio, Amazon Blueprints propone simplemente un tipo de skill donde sólo se necesita indicar la dirección del stream, ni siquiera hay necesidad de crear un RSS. Para probarlo, he decidido emitir la señal de TVE1 que se puede obtener a partir de su página web : https://www.rtve.es/directo/la-1/

Una vez en la página de TVE1 en directo, con el inspector de elementos del navegador web podemos filtrar las urls que contienen la extensión m3u, en mi caso he encontrado ésta.

Se trata de un flujo web de tipo HLS. Para convertirlo a un formato MP3 utilizo ffmpeg:

$ /usr/bin/ffmpeg -nostdin -i <url_tve1> -ab 256k -ar 44100 -ac 2 -c:a libmp3lame -f mp3 -content_type 'audio/mpeg' icecast://<user>:<passwd>@icecast.tuxe.es/tve1.mp3

El detalle está en que necesitamos un servidor icecast2 para poder hacer el streaming MP3. Ffmpeg actúa como una fuente para icecast2. Desde Amazon Blueprints, sólo necesitamos dar como dirección la url que permite acceder al streaming icecast, en mi caso https://icecast.tuxe.es/tve1.mp3.

En resumen, en este post he intentado comentaros rápidamente cómo hacer una skill de noticias, una skill de podcasts y una de streaming de audio, pero Amazon Blueprints propone en Francia una docena de tipos de skills diferentes. Por ejemplo me ha llamado la atención la skill "Mis invitados", que permite explicar a tus inquilinos el funcionamiento de los aparatos de tu casa, si por ejemplo decides alquilar tu residencia temporalmente.

Las skills se pueden publicar para que todo el mundo las utilice, se pueden compartir entre amigos o pueden quedarse en modo privado disponibles únicamente sobre la cuenta del usuario que las crea.

Con Amazon Blueprints cualquiera puede crear sus aplicaciones sin necesidad de hacer código. Yo he intentado automatizar ciertos procesos pero no es obligatorio casi todo se puede hacer desde la página web.

Amazon permite lanzar aplicaciones desde las rutinas, lo que permite configurar por ejemplo una alarma que suene todos los días à las 08h, que nos diga "Buenos días" y al final nos lance la skill que queremos. Pero para las aplicaciones privadas o compartidas esta funcionalidad no está disponible, sólo las aplicaciones en modo "público" pueden añadirse a las rutinas. No obstante se ha lanzado una petición para que esto cambie.

¡Espero que llegue pronto a España porque os vais a divertir mucho como yo lo he hecho! Amazon ha prometido muchas cosas en su conferencia del año pasado (2019), principalmente la utilización de varias lenguas a la vez, la multiconferencia al estilo de Zoom para las llamadas telefónicas o la extensión de la plataforma Alexa Answers a otros países.

Para continuar con la tradición de libreadmin, os dejo esta canción de regalo, esperando que os guste y que la podáis escuchar algún día con vuestro dispositivo Echo : https://www.youtube.com/watch?v=4bPGxLxogvw