L’assistant virtuel Alexa a été l’un des temps forts du salon AWS re:Invent 2016, et il a suscité beaucoup d’intérêt. Alexa est le service vocal qui gère Amazon Echo, Echo Dot, Echo Tap et Fire TV, et qui propose des fonctionnalités, ou compétences, qui permettent aux utilisateurs d’interagir avec leurs appareils de façon plus intuitive à l’aide de la voix. Faisant partie des premiers utilisateurs, je dispose de la première génération d’Echo et d’Echo Dot et j’ai 3 de ces appareils dans mon petit appartement ! Et je dois avouer qu’ils sont vraiment cool.

Je suis convaincu qu’Alexa fera prochainement partie de notre quotidien. Le système est déjà intégré à certains véhicules Ford et Volkswagen, et il ne fait aucun doute que ce n’est que le début. Chez Nuxeo, nous essayons de suivre les dernières innovations et nous prenons un réel plaisir à développer de nouvelles fonctionnalités et intégrations amusantes qui ajoutent un plus à la plateforme. J’ai donc décidé de créer une compétence Nuxeo qui nous permettra de chercher les documents présents dans Nuxeo Content Services Platform via Alexa.

Découvrez cette compétence en action :


Vous pouvez trouver toutes les sources dans mon repository GitHub. Regardons maintenant l’implémentation en détail.

Informations sur la compétence

Vous devez tout d’abord définir les informations génériques de votre compétence, comme un nom, une icône et une langue.

Nuxeo Skill Information

Modèle d’intégration

La prochaine étape est de définir l’interaction avec votre compétence, les différentes actions possibles et leur contenu.

{ "intents": [ { "intent": "GetMyLast" }, { "intent": "GetMyTasks" }, { "intent": "Search", "slots": [ { "name": "Criteria", "type": "Value" } ] }, { "intent": "AMAZON.RepeatIntent" }, { "intent": "AMAZON.HelpIntent" }, { "intent": "AMAZON.StopIntent" }, { "intent": "AMAZON.CancelIntent" } ] } AMAZON.* est l’action (intent) prédéfinie utilisée pour la navigation. Vous avez ensuite GetMyLast et GetMyTasks qui n’acceptent aucun paramètre et enfin, l’action Search qui accepte un paramètre Criteria.

Nuxeo Authentication screen shot

Configuration

Association au compte

Afin d’envoyer des requêtes au serveur Nuxeo, il faut créer un jeton qui permet de conserver les identifiants et de les utiliser pour envoyer une requête dynamique vers le serveur.

Les pré-requis pour l’authentification via l’UI sont SSL et une URL unique. J’ai donc dû créer une UI qui vous permet de saisir l’URL de votre serveur pour n’avoir qu’une seule compétence Alexa. Bien sûr, n’hésitez pas à essayer par vous-même.

Une fois que l’UI valide votre compte, elle génère une authentification par jeton sur Nuxeo et la combine avec l’utilisateur et l’URL du serveur en tant que nouvelle authentification par jeton Alexa.

Nuxeo Authentication screen shot

Comme mon hébergement supporte nativement PHP, j’ai pu réaliser cette partie avec le client PHP Nuxeo et Polymer pour l’UI, car chez Nuxeo, nous adorons Polymer.

Vous trouverez les sources sur ce repository GitHub.

Il ne nous reste plus qu’à configurer notre compétence avec cette UI d’authentification.

Nuxeo Authentication configuration

Lambda

Il faut maintenant définir le point de terminaison de service (service endpoint). Une fonctionnalité Lambda semble bien adaptée, et c’est donc ce que nous allons utiliser.

Nuxeo Executor configuration

J’ai choisi d’utiliser NodeJS et le client JavaScript Nuxeo car il est simple à utiliser et rapide.

Les dépendences du projet sont :

  • alexa-sdk : pour la fonction primitive Alexa - alexa-app : un petit framework qui simplifie le développement de l’application Alexa - nuxeo : pour accéder au serveur Nuxeo - striptags : pour supprimer toutes les balises HTML de la réponse car Alexa n’aime pas les balises

Pour chaque intent, il faut spécifier une méthode :

app.intent('Search', function(request, response) { // Retrieve the criteria var criteria = request.slot("Criteria"); // Load the token from the request return loadToken(request) .then(function(nuxeo) { // Search Nuxeo return nuxeo.repository().query({...}); }) .then(function(doc) { // List the results ... for (let id in doc.entries) { ... docs += res; response.say(res); } // Add a result card for the Alexa UI response.card({type: 'Standard', ...}}); }).catch ( function(err) { // Handle Error handleError(err, request, response); }); });

Vous trouverez les sources dans ce repository GitHub.

Remerciements

Un grand merci aux différents clients d’API, PHP et NodeJS qui ont grandement facilité cette intégration. J’espère que vous apprécierez cette compétence autant que moi !