27 septembre 2017

Création d'un skill sur le service AWS Lex (Alexa)

Echo est un device (enceinte intelligente) d'assistance personnelle basé sur la voix. Le terminal émet des requêtes vocales (via le micro du device) et reçoit en retour des réponses audibles (via les haut-parleurs du device). Ces échanges peuvent être des dialogues et aboutir sur des actions engagées par des services Amazon ou Internet, voire sur des actions d'objets connectés (ex: lampes, prises, etc.). La chaîne de services offerte s'appuie sur plusieurs fonctions dans l'écosystème de services AWS avec principalement les services suivants : AWS Alexa, Lex, API Gateway, Lambda et Polly. Le coeur du service de la solution est Lex. Amazon Lex est un service qui permet de créer des interfaces de conversation dans une application reposant sur la voix (ex: Alexa) et le texte (ex: Chatbot). Lex comprend la reconnaissance automatique de la parole (RAP) permettant de convertir une saisie orale en texte, et la compréhension du langage naturel (CNL), qui vise à reconnaître l'intention du texte. Le code d'Alexa est Open Source, ceci n'est pas fréquent côté d'Amazon! Alexa est bon pour des applications simples où les expressions de commande restent encore limitées et distinctes, bien qu'elle permettent une approche conversationnelle pour améliorer la compréhension d'un besoin à traduire en action.

Bien que Alexa soit commercialisée depuis fin 2015 aux Etats-Unis, la solution n'est toujours pas disponible en France, alors qu'elle l'est en Allemagne. A vrai dire, seulement trois pays (langues) sont couverts à ce jour: Etats-Unis, Angleterre et Allemagne. Suite à la commercialisation en France début août de la solution concurrente, le Google Home, j'ai étudié en priorité cette dernière. Après avoir joué avec l'enceinte intelligente de Google et réalisé quelques applets avec le service IFTTT, je me suis penché sur la conception de l'architecture afin de comprendre en détail la solution et pouvoir y réaliser des agents personnalisés. Mon premier agent a été réalisé en l'aide de différents services et outils, tels que: API.AI console, Firebase, Cloud Functions et Nodejs. L'agent réalisé concerne la fourniture de citations personnalisées.Tout est prêt et qualifié unitairement, il ne reste plus maintenant qu'à disposer du service API.AI pour la langue de Molière.

La connaissance détaillée de la solution de Google permet de rentrer plus facilement dans les concepts de la solution d'Amazon, sachant que logiquement c'est l'inverse qui aurait plus logique, dans la mesure où il semble que Google s'est inspiré fortement de la solution d'Amazon  pour réaliser la sienne.Les deux solutions sont semblables d'un point de vue conception, voire outillages associés.

On trouve sur Internet quelques tutoriels permettant de créer des skills pour Alexa. La plupart sont en langue anglaise, mais dans la revue mensuelle "L'informaticien" du mois de juin 2017, on trouve l'article suivant en français: "Alexa: prise en main du Chatbot d'Amazon". Cet article a été réalisé sur la base des posts suivants (ici et ici) du cabinet d'expertise JavaScript nommé Js-Republic. Il y a aussi une vidéo intéressante (ici) sur Alexa et ses différentes interfaces (chatbot, echo, etc.) relative à une session intitulée "Amazon Lex Chatbot avec vos services de messagerie" lors de AWS Summit Paris 2017, en mai ou juin dernier. Le détail du code évoqué pour la démonstration est disponible (ici et ici).

La création d'un skill sur Amazon comprend 2 parties :

  • la partie configuration des données (intents, utterances, etc.) depuis le portail de développement d'Amazon (ici),

  • la partie traitement et hébergement relative à la requête demandée depuis le service serverless Lambda de la plate-forme AWS (ici). Le code relatif à ce traitement supporte les langages ci-dessous, sachant qu'actuellement sous Google Cloud Functions, seulement Node.js est supporté. Pour Node.js, il est intéressant de lire cette information (ici) relatif au kit SDK pour Alexa. A vrai dire, c'est logique que AWS Lambda soit plus riche en langages supportés par rapport à Google, AWS a aussi été précurseur sur le volet des serverless.


Pour dérouler le cas d'utilisation proposé par Js-Republic, il faut naturellement disposer d'un compte AWS et d'un autre compte AWS Developer, en lien avec les consoles Web UI, voire autres interfaces des liens fournis ci-dessus. Ces comptes doivent être associés à une localisation US quelconque, voire UK ou encore DE. Il est préférable, mais pas absolument nécessaire de disposer d'un terminal Echo, voire Echo dot pour dérouler la démonstration.

Les étapes à dérouler sont les suivantes :

  1. Coder dans le langage retenu (Node.js), les fonctions nécessaires qui seront exécutées sur AWS Lambda, soit les actions ci-dessous avec pour pré requis, l'installation de npm et de Node.js.

# vérification de la présence des outils et version associée nécessaires
$ npm --version <CR>
4.2.0

$ node --version <CR>
v7.10.1

$ mkdir myfirstskill <CR>
$ cd myfirstskill <CR>

# initialisation Node.js pour l'application (skill) à créer
$ npm init <CR>

# modules Node.js nécessaires au skill
$ npm --save alexa-skill-kit yahoo-weather <CR>

# code relatif à la fonction Lambda appelée via son endpoint par le service Alexa
$ cat > index.js << EOF
const alexaSkillKit = require('alexa-skill-kit')
const intent = require('./lib/Intents')

exports.handler = function(event, context) {
   alexaSkillKit(event, context, parsedMessage => {
       // console.log(JSON.stringify(parsedMessage))
       return intent(parsedMessage)
   })
}
EOF

# code relatif au traitement d'appel du service yahoo distant relatif à la météo
$ mkdir lib <CR>
$ cat > lib/Intents.js << EOF
const weather = require('yahoo-weather')

module.exports = function(parsedMessage) {  
 if (parsedMessage.type === 'IntentRequest' && parsedMessage.intent.name === 'MyGetWeather') {
   return weather(parsedMessage.intent.slots.Location.value)
      .then(info => info.item)
      .then(item => item.condition)
      .then(condition => {
         // console.log('info', condition)
         return `It is currently ${condition.text} with ${condition.temp} degrees in ${parsedMessage.intent.slots.Location.value}`
      })
      .catch(() => {
        return `Hm, I can't find any weather data for ${parsedMessage.intent.slots.Location.value}.`
      })
 }
}
EOF

# préparation du package (format ZIP) à remonter au service AWS Lambda
$ cd ..; zip -r ../myfirstskill.zip *
....
$ ls -l myfirstskill.zip <CR>
-rw-r--r-- 1 patrick patrick 276558 sept. 26 12:05 myfirstskill.zip

$

  1. Enregistrement du code (dépendance de librairies comprises, c'est-à-dire dans le cas de Node.js des modules nécessaires au skill) sous AWS Lambda. Pour ce faire, se connecter au portail AWS et sélectionner le service Lambda. Ensuite suivre les étapes ci-dessous.


ensuite,


ensuite,


ensuite,


ensuite,


suite de l'écran en cours (étape 3: configuration fonction),


ensuite, écran de vérification et validation pour création de la fonction. Pour éviter d'écraser mon ancien skill (le N°1), j'ai nommé ce skill "MySecondSkill".


La fonction créée, l'écran ci-dessous est retourné. Il faut conserver le code ARN qui sera nécessaire dans la partie configuration du skill.


Suite à la création de ce skill plusieurs onglets sont disponibles depuis la console Lambda pour sa gestion, comme le montre la copie d'écran ci-dessous.


  1. Maintenant, depuis le portail de développement AWS, la configuration du skill va être définie. Le page de garde de ce portail est la suivante.


En cliquant sur l'onglet Alexa, on a 2 offres possibles (une facile et une plus expérimentée). Pour débuter, on va retenir la première, comme le montre la copie d'écran ci-dessous.


En cliquant dessus, on obtient l'écran ci-dessous ou l'on clique sur "Add a New Skill"


Il y a 6 étapes pour configurer le skill. Les étapes 5 et 6 (respectivement "Publishing Information" et "Privacy & Compliance" ne sont pas nécessaires à la qualification et l'utilisation personnelle du skill. Elles sont relatives au processus de validation AWS afin que le skill soit publié (dans la catégorie adéquate) sur le store AWS dédié aux skills (un peu comme le store des applications mobiles). Les étapes qui nous intéressent sont les suivantes :

3.1 : Skill Information
Ces informations sont relatives au contexte (nom, langage, etc.) du skill, comme le montre la copie d'écran ci-dessous.


Une fois, les informations saisies, passez à l'étape suivante.

3.2 : Interaction Model
C'est probablement, la partie la plus importante de configuration pour le skill. C'est dans cette page que l'on configure les notions de "intents" et de "utterances". Pour rappel, ce premier skill répond à la demande de météo de villes européennes (uniquement). En conséquence, les deux seules informations à saisir de cette page sont les suivantes.

Intent Schema: la variable (slot) est une ville d'europe
{
 "intents": [
   {
     "slots": [
       {
         "name": "Location",
         "type": "AMAZON.EUROPE_CITY"
       }
     ],
     "intent": "MyGetWeather"
   }
 ]
}

Sample Utterances: liste basique et non exhaustive
MyGetWeather what is the weather in {Location}
MyGetWeather weather in {Location}
MyGetWeather will it rain in {Location}

Une fois, les informations saisies ou collées, passez à l'étape suivante

3.3 : Configuration
Cette partie permet, entre autres, de faire le lien (endpoint) avec la ressource relative à la fonction Lambda, ainsi que la position géographique d'utilisation (region relative à l'endpoint).


Une fois, l'ARN recopié et les options de localisation retenues, passez à l'étape suivante.

3.4 : Test
Cette étape est l'aboutissement de la configuration et du code réalisé pour le skill. Il est possible de valider le skill à l'aide de la partie simulation de la page. Il est important de lire la partie relative au test. Il est donné par exemple, la phrase nécessaire pour déclencher le skill.


D'ailleurs, comme indiqué, il faut utiliser la console Web UI ou l'interface mobile (Android ou iOS) pour vérifier que le skill créé est bien présent, voire le rendre actif, s'il ne l'est pas, comme le montre la copie d'écran ci-dessous. Pour information, seule l'interface Web UI (console Alexa) est exploitable, car le store Android ou iOS de l'europe ne dispose pas de l'application mobile téléchargeable.


La seconde partie de la page relative au test de la console de développement permet de simuler textuellement le skill, comme le montre la copie d'écran ci-dessous et d'obtenir les contenus JSON correspondants (demande et réponse) à la question "weather in Moscow". Il est possible d'écouter la réponse, si nécessaire, comme le montre la copie d'écran ci-dessous.


Bon à ce stade, cela semble opérationnel, il ne reste plus qu'à le tester réellement à l'aide de son propre terminal, à savoir dans mon cas, un Echo dot. Les échanges (forme textuelle) sont donc les suivants:

  • demande: "Alexa, ask My Fist Skill weather in Paris",
  • réponse: "It is currently Cloudy with 13 degrees in Paris". (c'est bien vrai, c'est couvert et il ne fait pas chaud, en cette fin septembre).

Via le service Lambda, il est possible de visionner (graphiquement) l'activité du skill, sachant que l'offre Lambda est gratuite et comprend un million de requêtes offertes ainsi que 400 000 Go-secondes de temps de calcul par mois.


Ceci a permis de rendre concret la logique de création de skills, ceci étant, il y a encore plein de choses à étudier pour enrichir ses réalisations, à savoir :

  • utiliser d'autres langages de programmation que Node.js,
  • retenir "Alexa Voice Service" (plus riche fonctionnellement) plutôt que "Alexa Skill Kit",
  • associer plusieurs langues à son skill,
  • apporter ponctuation, intonation, etc. nécessaires aux réponses fournies par le skill à l'aide de SSML (Speech Synthesis Markup Language),
  • établir des réels dialogues conversationnels avec son skill,
  • etc.

Aucun commentaire:

Enregistrer un commentaire