Google Assistant : Création d’une application de A à Z

Le but de cet article est de fournir une première introduction au développement d’applications pour Google Home. Nous allons voir comment récupérer un flux RSS avec Google Home et Google Cloud, et ensuite publier l’application.

Avant de démarrer, je tiens à préciser que j’ai souhaité rédiger un article montrant comment développer et publier une application de A à Z. Du coup, cet article sera long, et passera rapidement sur certaines notions. J’envisage par la suite d’écrire des articles plus détaillés sur chaque partie du développement d’une application pour Google Home.

Le projet que nous développerons dans cet article

Avant de commencer, arrêtons-nous sur l’application que nous allons développer aujourd’hui. Le but va être de créer une application Google Home capable de nous lire le titre du dernier article de la catégorie choisie du journal Le Monde.

Actions on Google Console

Toute application pour Google Home commence par l’Actions on Google Console

Actions on Google Console

Commencez par cliquer sur Add/Import project. Il vous faudra ensuite choisir le nom de votre projet, ainsi que la zone géographique à laquelle votre projet s’applique.

Création de projet Google Actions

Cliquez ensuite sur Create Project.

Sélection des Actions à ajouter

L’assistant nous propose ensuite de choisir parmi l’interface API.AI ou bien le SDK Actions pour la création de notre application.

  • API.AI : Tout s’effectue via une interface. N’imaginez même pas utiliser cela dans un outil de versioning tel que Git, partager le code source de votre application etc… Toutefois, le fait que tout se fasse via une interface rend les choses beaucoup plus simples et intuitives.
  • SDK Actions : Tout s’effectue via un fichier contenant les actions principales.Il offre beaucoup plus de souplesse et de possibilités, mais demande déjà une connaissance des différentes options.

Cet article étant une introduction ne nécessitant aucune connaissance préalable avec Google Assistant, et l’interface API.AI répondant tout à fait à notre besoin, nous sélectionnerons cette dernières. Cliquez sur cette options.

Dans la boîte de dialogue qui s’ouvre, cliquez sur CREATE ACTIONS ON API.AI.

API.AI

Nous allons donc maintenant créer nos actions via l’interface API.AI. Commencez d’abord par renseigner les données de votre projet :

Création d'un projet sur API.AI

Une fois que tout est renseigné, cliquez sur le bouton Save.

Nous sommes redirigés sur les Intents de notre application.

Intents sur Api.ai

Tout est question d’intentions

On pourrait définir Intent par intention de l’utilisateur. En effet, dans le développement d’interfaces d’intelligence artificielle, on ne va pas raisonner en terme de phrases, mais d’intentions. Pour prendre un exemple simple, on ne va pas spécifier quoi répondre à la phrase « Quelle est la recette du clafoutis ?« , mais plutôt quoi répondre lorsque l’utilisateur à l’intention de consulter la recette d’un clafoutis. En fonctionnant ainsi, vous serez capable de répondre à des phrases que vous n’aviez pas prévu au départ telles que « Comment fait-on les clafoutis ?« , ou encore « C’est comment qu’on fait les clafoutis ?« .

En effet, fonctionner par phrase peut s’avérer complexe. En effet, comment différencier « C’est quoi la recette des clafoutis ? » et « Quelle est la liste des ingrédients d’un clafoutis ?« . Avec des if successifs sur le mot ingrédients et recette ? Très bien ! Comment faîtes vous alors pour distinguer « Comment fait on les clafoutis avec mes ingrédients ? » ou encore « Y a quoi dans un clafoutis ? »

C’est pour ça que l’on va parler d’intentions. Dans un cas, l’intention est de connaître la recette des clafoutis, dans l’autre cas l’intention est de connaître la liste des ingrédients du clafoutis. Ensuite, la détection d’une intention passe par une étape initiale, et une étape récurrente :

  • Fournir quelques phrases d’intention
  • Corriger les erreurs que fait le robot au fur et à mesure des questions des utilisateurs

Cette seconde étape récurrente vous permettra, à la longue, d’avoir une intelligence artificielle capable de comprendre les intentions à partir de phrases que vous ne lui aurez même pas fourni.

Nous voyons que nous avons pour le moment deux Intent :

  • Default Fallback Intent : Il s’agit de ce que va répondre l’assistant lorsque la phrase qu’on lui donne ne lui permet pas d’identifier l’intention de l’utilisateur.
  • Default Welcome Intent : Il s’agit de la phrase de bienvenue lorsque vous accédez à l’application via Google Home. Pour accéder à l’application, il suffit de dire « Talk to [NOM DE L’APPLICATION]« . (À l’heure où cet article est écrit, il n’existe pas d’interface française, donc j’ignore quel sera l’équivalent français ». Ce à quoi, votre application répondra par un message de bienvenue.

Nous allons laisser ces Intent tels qu’ils sont, nous n’avons pas besoin de les modifier pour le moment.

Entities

Maintenant que nous avons vu les Intent, nous allons pouvoir nous intéresser aux Entities. Les Entities sont une liste de données dont l’application a besoin pour fonctionner. Dans notre exemple, il s’agira des liste de catégories pour lesquelles nous souhaitons récupérer le titre du dernier article. Il s’agit de la liste des rubriques des flux RSS du Monde.

Ajoutez une Entity et nommez la Categories.

Maintenant, nous pourrions saisir une à une toutes les catégories, mais Api.ai autorise un import de CSV. C’est donc ce que nous allons faire. Cliquez sur le menu en haut à droite juste à côté du bouton Save, et choisissez « Switch to raw mode ».

Vous allez maintenant pouvoir coller la liste de catégories ci-dessous (vous avez l’option « view raw » en bas de la liste) :

Une fois que c’est fait, vous avez votre liste d’entities qui est ajoutée :

Entities Google Actions

Ajout d’un Intent

Maintenant que nous avons nos Entities, nous pouvons retourner dans la partie Intents pour en ajouter un premier. L’intention de l’utilisateur sera de récupérer le titre du dernier article d’une catégorie. Dans la rubrique Intent, cliquez sur le bouton Create Intent :

Création d'un nouvel Intent

Pour ce nouvel intent, on va spécifier :

  • Le nom de l’intent : get_last_article
  • User says : Il s’agit de ce que l’utilisateur doit dire pour exprimer cette intention. Il convient d’ajouter une douzaine de phrases pour entraîner l’assistant :
    Normalement, au fur et à mesure que vous saisissez les questions, l’assistant reconnaît automatiquement les variables associées à vos Entities. Pensez-bien à supprimer les autres variables s’il en détecte, et à bien spécifier la bonne variable. Normalement, elles doivent toutes apparaître en jaune :
    Ajout de phrases d'intention

    • C’est quoi le dernier article à la une du Monde ?
    • Dis-moi y a quoi à la une ?
    • Il me faut le dernier article à la Une
    • J’aimerais avoir le dernier article à la Une
    • Y a quoi à la Une ?
    • Quelles sont les dernières actualités à la Une ?
    • Donne moi les dernières news à la une du monde
    • Y a du nouveau chez les décodeurs ?
    • Quoi de neuf à la Une ?
    • C’est quoi les dernières news des décodeurs ?
    • Quel est le dernier article des décodeurs ?
    • Quel est le dernier article à la une ?

Pour le reste, il n’est pas besoin de remplir, nous y reviendrons par la suite.

Désormais, nous pouvons laisser Api.ai de côté, nous y reviendrons par la suite.

Webservice

Pour récupérer le titre du dernier article, j’ai décidé de faire un simple script Node.js qui se chargera de nous retourner le résultat. J’ai choisi cette infrastructure afin de pouvoir l’héberger gratuitement sur Google Cloud Platform.

Format des données API.AI

Lorsque nous branchons un webservice à API.AI, ce dernier nous renvoie les données via la méthode POST. Le body contenant un json avec l’ensemble des données.

Dans ce body, la seule partie qui nous intéresse est l’endroit où nous retrouvons les paramètres. L’extrait des données envoyées qui nous intéresse est donc le suivant :

Projet Node.js

Commencez d’abord par démarrer un nouveau projet, que nous nommerons monde_unofficial :

 npm init
name: (MondeUnofficial) monde_unofficial
version: (1.0.0)
description: Récupère le dernier article de la catégorie souhaitée du journal Le Monde
entry point: (index.js)
test command:
git repository:
keywords:
author: Gahfy
license: (ISC)

Ensuite, ajoutez les dépendances dont nous aurons besoin :

npm install dom-parser html-entities --save
+-- dom-parser@0.1.5
`-- html-entities@1.2.1

Script Node.js

Le but est d’avoir un script qui retourne le dernier article d’une catégorie donnée. Libre à vous d’utiliser la techno et le serveur que vous souhaitez. L’exemple ci-dessous s’applique à un script node.js déployé sur un serveur Google Cloud.

Google Cloud

Cette partie s’adresse à ceux souhaitant héberger leur projet sur Google Cloud Platform. Pour information, bien que l’activation de la facturation soit indispensable, un premier usage gratuit est disponible.

  1. Sélectionnez un projet Google Cloud, ou créez-en un sur la page de gestion des projets
  2. Activez la facturation
    1. Rendez-vous dans la console
    2. Sélectionnez votre projet
    3. Dans le menu de gauche, choisissez Billing
    4. Cliquez sur « Link to a billing account »
    5. Cliquez sur « Set Account »
  3. Activez les Cloud Functions API
  4. Initialisez et installez le Cloud du SDK
  5. Mettez à jour et installez les composants gcloud
    gcloud components update && gcloud components install beta
  6. Publiez votre script
    gcloud beta functions deploy getCategory --stage-bucket [BUCKET_NAME] --trigger-http

Une fois la dernière commande exécutée, vous obtiendrez en résultat l’url d’appel du script. Notez la bien.

Nous avons donc terminé avec le webservice. Maintenant, il va falloir le relier à notre script API.AI.

Retour sur API.AI

Retournez dans la console de API.AI et cette fois-ci, dans le menu de gauche, allez dans la partie Fulfillement.

Fulfillement

Activez le et indiquez l’url de votre script (vous pouvez vous servir de l’url de mon script renseignée ci-dessus). Il ne vous reste plus qu’à cliquez sur le bouton Save.

Maintenant, retournez dans la liste des Intents, puis dans l’Intent get_last_article, puis en bas dans la partie Fulfillement, cochez Use Webhook afin d’utiliser le webservice que l’on vient de renseigner.

Cliquez sur Save

Test

Dans la partie de droite, cliquez sur le micro et dîtes : « Quel est le dernier article de la rubrique Les Décodeurs ? »

Test API.AI

Wow, ça marche trop bien. En plus il s’agit d’une phrase qu’on ne lui a pas donné, et il sait l’interpréter. Plus qu’à aller bronzer au Soleil. Pas si vite, un petit essai encore : dîtes « Quel est le dernier article de la catégorie Roland Garros ? ».

Test raté

Mince, ça ne fonctionne pas, il ne comprend pas de quelle catégorie on parle. C’est tout simple, notre catégorie s’appelle Roland-Garros, avec un tiret. Hors à l’oral, il a traduit cela par Roland Garros, sans tiret. Il n’arrive donc pas à détecter la catégorie dont nous parlons.

Pour lui faire comprendre que « Roland-Garros » et « Roland Garros » sont la même chose, il suffit de définir des synonymes. Retournez dans la partie Entities, et passez en mode Éditeur si ce n’est pas déjà le cas.

Il ne vous reste plus que dans la colonne synonymes, à ajouter « Roland Garros » en face de « Roland Garros« , à cliquer sur Save,  et le tour est joué.

Synonymes des Entities

Retestez à nouveau en disant « Quel est le dernier article de la catégorie Roland Garros ? » et cette fois, vous devriez voir le dernier article.

Test réussi

Voilà, tout fonctionne comme prévu. N’hésitez pas à ajouter plus de synonymes au fur et à mesure de votre usage.

Préparation pour la publication

Maintenant, dans le menu de droite, choisissez Integrations. Dans le carré Actions on Google, cliquez sur Settings.

Ajoutez l’Intent que l’on vient de créer dans la partie Additional trigerring intents, puis cliquez sur Update.

Publication et Tests

Retournez maintenant dans la console Actions on Google.

Renseignez les différentes données de votre application.Une fois que c’est fait, vous n’avez plus qu’à valider pour que Google teste votre application. (Pour l’exemple ci-dessous, je me suis servi du logo du journal présent sur Wikipedia, et quelques retouches de couleurs et recadrages sous Photoshop).

Publication Google Home

Pour le moment, il n’est pas possible de définir la langue française comme langue de l’application. L’intérêt de la publication d’une telle application est donc toute relative.

Vous voilà prêt à développer des applications pour Google Home, afin de pouvoir les publier le jour J lorsqu’il sera possible de publier des applications en français.

Twitter
Vous avez aimé cet article ? N’hésitez pas à me suivre sur Twitter pour être informé des prochains.
Développeur Android freelance depuis Avril 2016, je partage sur mon blog aussi bien que dans des meetups.

10 réponses sur “Google Assistant : Création d’une application de A à Z”

  1. Bravo, super article !!

    Est-il possible d’utiliser cette application avec google assistant sdk installé sur une raspberry ?
    merci

    1. Comment ça tu n’arrives pas à utiliser cette url ?

      Pour tester, tu peux utiliser Postman et envoyer ce genre de requête :
      Url : https://us-central1-le-monde-non-officiel.cloudfunctions.net/getCategory

      Moi de mon côté, ça marche. Pourrais-tu être plus précis sur ce que tu testes et ce qui coince ?

  2. Top article Gaëtan! Tiens moi au courant lorsqu’on pourra développer sur les enceintes de Google home en version FR stp ? ou bien comment passer en mode anglais sur des enceintes françaises ? thx

    1. On peut déjà le faire (passer la box en anglais tout du moins). Je suis en train de préparer un article sur le développement en utilisant Actions SDK plutôt que API.AI dans lequel il y aura pas mal d’infos à ce sujet. Le rythme de parution des articles a quelque peu diminué ces derniers temps, mais je tâche de remettre de l’ordre dans ça

  3. Bonjour,

    Super ce guide, vraiment.
    Juste un petit point, je n’ai pas vu comment mettre l’application créé sur le google home ? Est-ce possible en l’état ou faudra-t-il attendre la version de sdk FR? N’y a t’il pas un moyen de tester directement sur le google home ?
    Merci

    1. Hello Géo,

      Merci pour ton commentaire, ça m’encourage vraiment à poursuivre.

      Pour la publication, pour le moment, il n’est possible de publier des applications que dans les langues Anglais Américain, Anglais Britannique et Anglais Australien.
      Un article viendra dans la semaine sur comment localiser son application pour savoir comment jouer avec ces langages.

      Pour la publication, je t’invite à aller lire mon article Google Home : Tester et publier son application

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *