Créer une application vocale pour Google Home avec Dialogflow

Google Home utilise Google Assistant pour dialoguer avec ses utilisateurs. Google Assistant permet à des développeurs tiers d’ajouter de nouvelles fonctions via le SDK ‘Actions on Google’. Une ‘Action’ est un agent conversationnel qui est capable de vous donner des informations, déclencher une commande ou jouer un son.

L’application vocale qui a le plus d’avis sur Alexa est Sleep Sounds. Il s’agit d’une application qui permet d’écouter des sons de la nature pour se détendre et se relaxer.

Dans ce tutoriel nous allons voir comment créer une application équivalente pour Google Home via l’outil Dialog Flow. Dialog Flow est un outil de NLP – Natural Language Processing – qui permet de transformer les commandes vocales des utilisateurs en données structurées.

 

Créer un projet dans la console ‘Actions on Google’

 

Actions on Google
Actions on Google

1. Rendez-vous sur le site Actions on Google, cliquer sur le bouton ‘Actions Console’ en haut à droite de votre écran puis connectez-vous avec votre compte Google.

Créer un projet Actions on Google
Créer un projet Actions on Google

2. Cliquez sur ‘Add/import project’, saisissez un nom de projet, le pays France et cliquez sur ‘Create Project’.

Ajouter une Actions à votre projet
Ajouter une Actions à votre projet

Le SDK ‘Actions on Google’ vous permet de connecter l’outil de NLP de votre choix. Dans ce tutoriel, nous utiliserons Dialogflow, l’outil de NLP proposé par défaut par Google.

3. Pour associer votre projet à l’outil Dialogflow, cliquez sur ‘Build’ sous la carte Dialogflow puis sur ‘Create Actions on Dialogflow’. Vous voici sur la console de création d’agent conversationnel de Dialogflow.

Associer Dialogflow au projet 'Actions on Google'
Associer Dialogflow au projet ‘Actions on Google’

 

Ajouter la langue française dans Dialogflow

 

1. Une fois arrivé sur l’écran de la console de Dialogflow, vérifiez le nom de votre agent, ici ‘Son-Zen’ et cliquez sur ‘Save’ pour le créer.

2. Dans le menu de gauche, cliquez sur le + à côté de la puce ‘en’, dans le menu déroulant de la page centrale, choisissez la langue française et cliquez sur ‘Save’ en haut à droite.

Ajouter une nouvelle langue sur Dialogflow
Ajouter une nouvelle langue sur Dialogflow

3. Dans le menu de gauche, cliquez sur la puce ‘fr’. Nous allons commencer par configurer la langue française de votre agent conversationnel.

 

Créer une nouvelle Entité (Entities) dans Dialogflow

 

Une entité correspond à un mot-clé que nous souhaitons récupérer dans la commande vocale d’un utilisateur. Dans notre exemple, nous voulons savoir quel son la personne souhaite jouer. De nombreuses Entities réutilisables sur tous types d’applications vocales sont déjà proposés par Dialogflow (heure, date, etc). Notre Entity est spécifique à notre application, nous allons donc créer une entité ‘relaxingSounds’ et y associer les paramètres et mots-clés à retrouver. Nous ajouterons deux valeurs de référence pour cette entité : ‘rain’ et ‘lullaby’. Puis nous leur associerons plusieurs synonymes français.

1. Cliquez sur Entities dans le menu de gauche puis sur le bouton ‘Create Entity’. Tout en haut, saisissez ‘relaxingSounds’ pour le nom de votre Entity.
Deux options sont disponibles sous le champ du nom de l’Entity.
‘Define synonyms’ vous permet de choisir si vous souhaitez associer plusieurs mot-clés à une valeur de référence ou si souhaitez récupérer le mot-clé directement tel qu’il a été dit par l’utilisateur.
‘Allow automated expansion’ vous permet de laisser Dialogflow ajouter de nouveaux mots-clés qui lui semblent pertinents en fonction de l’usage qui est fait sur votre agent.

2. Pour ajouter des mots-clés, cliquez sur ‘Click here to edit entry’ dans la liste disponible en dessous. Nous allons ajouter deux valeurs de référence ‘rain’ et ‘lullaby’. Nous allons ensuite leur associer plusieurs synonymes : pluie, orage, éclair, tonnerre pour ‘rain’ et berceuse, dormir pour ‘lullaby’.

Ajouter une nouvelle entité sur Dialogflow
Ajouter une nouvelle entité sur Dialogflow

 

Ajouter un nouvel Intent dans Dialogflow

 

L’intent est l’outil qui permet d’associer plusieurs énoncés dictés par un utilisateur à une action spécifique.

Par défaut, il y a deux intents obligatoires : le ‘Default Welcome Intent’ et le ‘Default Fallback Intent’.

Le Welcome Intent est celui qui va être déclenché lorsqu’une personne utilise une commande vocale qui contient seulement votre nom d’invocation, par exemple “Ok Google, lance Son Zen.’ Il est conseillé d’indiquer le nom de votre application dans la réponse de cet Intent afin d’ informer l’utilisateur qu’il est arrivé à bon port.
Dans notre application nous indiquerons “Bienvenue sur Son Zen. Quel son désirez-vous écouter ? Par exemple, dites ‘pluie’ ou ‘berceuse’.” et plusieurs alternatives.

Changer la réponse du Welcome Intent
Changer la réponse du Welcome Intent

Le Default Fallback Intent est l’intent qui sera déclenché si Dialogflow ne trouve pas d’autres intents pertinents à associer à la commande vocale d’un utilisateur. Il est fortement recommandé de guider l’utilisateur afin qu’il déclenche un Intent cible. Ici, nous indiquerons “Désolé, je n’ai pas compris. Quel son désirez-vous écouter ? Par exemple, dites ‘pluie’ ou ‘berceuse’.”

Changer la réponse du Fallback Intent
Changer la réponse du Fallback Intent

Nous allons maintenant créer l’intent ‘Play Sounds’ qui permettra de repérer quand une personne veux jouer une musique et laquelle.

1. Dans le menu de gauche, cliquez sur le + à droite de la mention ‘Intents’.

2. Tout en haut, saisissez le nom de l’intent : Play Sounds et cliquez sur ‘Save’.

Créer un nouvel Intent
Créer un nouvel Intent

Plusieurs champs sont disponibles dans la configuration d’un Intent.

3. Contexts

Ce menu vous permet de saisir manuellement le contexte d’une conversation. La plupart du temps, le contexte est indiqué via le code.
Dans le cadre de la création de notre Action Son Zen, nous n’avons pas besoin d’utiliser cette option. Vous pouvez sauter cette étape si vous le souhaitez.

Cette option est importante dans le cadre d’un dialogue à plusieurs entrées et plusieurs étapes. Le contexte permet de communiquer à l’intent les étapes précédentes du dialogue ou des paramètres dictés précédemment par l’utilisateur.

Ex: Si votre dialogue à plusieurs étapes où l’utilisateur doit confirmer la saisie.
“Vous souhaitez envoyer un message à Martin, c’est bien ça ?”(1) et plus tard dans “Votre message est “coucou”(2), c’est bien ça ?”.
Chacune de ces questions attend une validation qui pourrait être confirmée via la création de deux Intents : Yes Intent et No Intent.
Le code associé à chacun de ces Intents aura besoin de savoir à quelle question l’utilisateur a répondu – à quel état dans la conversation se situe l’utilisateur – pour adapter sa logique. Doit-il demander quel est le message à envoyer ou a-t-il maintenant toutes les informations pour l’envoyer ?
Dans cet exemple, on pourrait imaginer le contexte de sortie suivant dans le cas ou l’utilisateur répond “Oui” à chaque fois :

Bot : “Vous souhaitez envoyer un message à Martin, c’est bien ça ?”

Contexte d’entrée 1
state : waitingForContactConfirmation
message : null
recipient : null

User : “Oui”

Contexte de sortie 1
state : waitingForMessage
message : null
recipient : Martin

Bot : “Quel est votre message pour Martin ?”
User : “Mon message est ‘Coucou’.
Bot : “Votre message est ‘Coucou’, c’est bien ça ?”

Contexte d’entrée  2
state : waitingForMessageConfirmation
message : Coucou
recipient : Martin

User : “Oui”

Contexte de sortie  2
state : waitingForMessageConfirmation
message : Coucou
recipient : Martin

4. ‘User says’
Ces champs vous permettent d’indiquer toutes les commandes vocales qui seront associées à  l’Intent. Il est conseillé de mettre une dizaine de phrases pour optimiser la probabilité de ‘matcher’ notre Intent. Si vous avez défini des entités, les mot-clés correspondant seront automatiquement surlignés et associés. Dans notre exemple, nous saisirons les phrases suivantes :
‘mets un son de pluie’
‘joue de l’orage’
‘je veux écouter du tonnerre’
‘pluie’
‘lance une musique pour dormir’
‘musique de pluie’
‘joue une berceuse’

Ajouter les requêtes à matcher à l'Intent
Ajouter les requêtes à matcher à l’Intent

5. Events
Un event permet de déclencher un Intent autrement que via le matching de la commande vocale d’un utilisateur. Dans le cas du Default Welcome Intent, il n’y a pas de texte à analyser puisque l’utilisateur a simplement dit le nom d’invocation de l’application. Cet intent dispose donc de l’event ‘WELCOME’.
Nous n’utiliserons pas cette fonction dans notre exemple.

6. Action
L’action est à ne pas confondre avec les ‘Actions on Google’.
Ce champ permet simplement d’associer un Intent à un paramètre que nous utiliserons dans le code de l’application. Un intent est strictement équivalent à une action. Ici ce paramètre sera appelé ‘input.playSounds’.

Dans cette option vous pouvez indiquer quels sont les paramètres d’entités que vous souhaitez récupérer dans la requête de l’utilisateur.
Vous pouvez indiquer si le paramètre est requis ou non pour mener à bien la fonction de cet intent. Si vous cochez la case ‘requis’, vous pourrez indiquer une phrase de support pour demander à l’utilisateur d’indiquer précisément le paramètre. Dans notre exemple, si un utilisateur dit “Je veux écouter un son”, l’intent Play Sounds est matché mais nous ne savons pas quel son jouer. Notre bot demandera donc : “Quel son voulez-vous écouter ? Par exemple, dites ‘pluie’ ou ‘berceuse’.”
Vous pouvez supprimer les autres paramètres qui se seraient ajoutés automatiquement.

 

Configurer l'action et les paramètres requis
Configurer l’action et les paramètres requis

7. Response

Dans ce menu, nous allons configurer la réponse de l’agent lorsque l’Intent est matché avec les paramètres requis. Il est conseillé d’indiquer plusieurs réponses pour rendre votre agent moins robotique.

Dialogflow permet de créer des agents pour différentes plateformes de messageries (Messenger, Slack, Skype). Vous pouvez ajouter une réponse spécifique pour chaque plateforme en cliquant sur le + à droite de ‘Google Assistant’. Dialogflow propose un onglet ‘par défaut’ qui sera l’option choisie par l’agent si aucun réponse spécifique à une plateforme n’a été configurée.

Une réponse n’est pas forcément qu’une chaîne de caractères. Sur les plateformes de messagerie, il est possible d’ajouter de la mise en forme ou des boutons à votre bot. Sur le volet Google Assistant vous pouvez configurer ces options en cliquant sur ‘Add message content’. Voici les options disponibles : Simple Response, Basic Card, List, Suggestion Chip, Carousel Card, Linkout Suggestion, Custom Payload.

Dans l’option Response, nous allons simplement ajouter ‘Je joue un son.’ comme réponse dams l’onglet pour tester l’agent.

Ajouter une réponse à l'Intent
Ajouter une réponse à l’Intent

8. Google Assistant

Ce menu permet d’ajouter des paramètres spécifiques à Google Assistant.
L’ option ‘End conversation’, si elle est cochée, indiquera à Google Home de ne plus attendre de requêtes de l’utilisateur. Par défaut elle est décochée, après avoir répondu, Google Home sera prêt à écouter la prochaine commande vocale de l’utilisateur.
L’option ‘Fullfillement’ s’affichera dans la suite de ce tutoriel. Elle permet d’indiquer à Dialogflow de ne pas utiliser les réponses saisies en dur mais de s’appuyer sur une fonction qui gèrera la logique de la réponse.
Dans cet exemple, nous allons cocher la case ‘End conversation’ pour garder un dialogue simple.

 

Tester l’agent conversationnel

 

Ça y est, notre bot est crée. Nous allons pouvoir le tester dans le menu de droite de Dialogflow.
Cliquez sur Save si vous ne l’avez pas déjà fait. À chaque fois que vous sauvez, Dialogflow ‘entraîne’ votre bot à associer les commandes vocales au bon Intent.
Nous allons tester 4 commandes et voir ce que nous répond le bot.

1. ‘je mange un cassoulet.’

je mange un cassoulet
je mange un cassoulet

 

Dans cet exemple, notre intent Play Sounds n’est pas matché à juste titre. L’agent va donc  matché le Fall Back Intent.

 

 

 

 

 

 

 

 

2.  ‘joue un son’

joue un son
joue un son

 

Ici, l’intent Play Sounds est bien matché mais aucun mot clé n’est repéré pour l’entité relaxingSounds.
L’agent nous répond donc le ‘Prompts’ que nous avons rempli lorsque la commande vocale ne contient pas le paramètre requis.

 

 

 

 

 

 

 

 

3. ‘lance une musique pour dormir’

lance une musique pour dormir
lance une musique pour dormir

 

Dans cet exemple, la commande vocale que nous avons testé correspond exactement un exemple d’énoncé que nous avons saisi : l’intent Play Sounds est bien matché.
On récupère bien le paramètre relaxingSounds  qui a pour valeur ‘lullaby’.

 

 

 

 

 

 

 

4. ‘je voudrais entendre de la pluie.’

je voudrais entendre de la pluie
je voudrais entendre de la pluie

 

Dans cet exemple, nous testons la robustesse de Dialogflow. La phrase ‘je voudrais entendre de la pluie’ ne correspond à aucun exemple de phrase que nous avons saisis et pourtant le bon Intent est matché et le paramètre est bien reconnu.

 

 

 

 

 

 

 

Notre agent semble fonctionner correctement. Nous allons maintenant lui ajouter plus de logique via le menu Fullfillement pour pouvoir effectivement jouer un fichier mp3.

 

Connecter une Cloud Function via Dialogflow

 

Dialogflow nous permet, via le menu Fullfillement, d’apporter plus de logiques à notre agent.
Vous pouvez paramétrer un webhook qui correspond à un serveur de votre choix ou utiliser l’éditeur intégré pour utiliser une Cloud Function directement associé à votre agent. Nous allons développé cette Cloud Function en node.js.

1. Activer le Inline Editor en cliquant sur l’interrupteur à sa droite.
2. Cliquer sur Deploy pour effectuer un premier déploiement de la cloud function. L’opération peut durer quelques minutes.

Déployer la Cloud Function
Déployer la Cloud Function

Le fichier index.js est déjà alimenté par un template fourni par Google.
Le fichier peut paraître imposant de prime abord car il contient la logique pour chaque plateforme (Google Assistant chatbot, Google Assistant  voicebot, Facebook Messenger, etc). Il est moins compliqué qu’il n’y paraît.

On remarque qu’en ligne 21 et 22, on récupère l’action associé à notre Intent ainsi que les paramètres qui contiendront les valeurs de notre entité.

Puis de la ligne 28 à 68, nous allons pouvoir indiquer la réponse de Google Assistant en fonction de l’action de la requête.

 

Ajouter une réponse audio via un fichier mp3 avec le  SSML

 

Google Assistant peut jouer un fichier mp3 via le langage SSML.
Ce langage permet généralement d’adapter la manière dont parle Google Assistant : vitesse, ton de la voix, accentuation de certains mots etc.
Avec Google Assistant il permet aussi de lire un fichier mp3 qui respecte un certain standard. Nous verrons dans un autre blog post comment convertir au fichier mp3 via ffmpg.
Nous avons donc nos deux fichiers mp3 hébergés sur le cloud de votre choix est accessible en lecture public.
“https://s3.eu-central-1.amazonaws.com/google-actions-eu/lullaby.mp3”
“https://s3.eu-central-1.amazonaws.com/google-actions-eu/rain.mp3”

Nous allons donc maintenant indiquer dans notre fonction que lorsqu’on à l’action input.playSounds on jouera le son correspondant au paramètre de l’entité relaxing sounds en rajoutant ce bout de code après la ligne 37. On utilise les balise <speak></speak> pour faire jouer le fichier mp3 via le SSML.

Ensuite, cliquez sur ‘Deploy’ pour mettre à jour le code de votre Cloud Function.

Il va maintenant falloir indiquer à Dialogflow que l’agent doit utiliser le fullfillment pour répondre, plutôt que les réponses rentrée précédemment en dur.

Allez dans le menu Intents et choisissez l’intent Play Sounds.
Dans le sous menu Fullfillement tout en bas, cochez la case ‘Use webhook’ puis cliquez sur ‘Save’.

Utiliser le webhook
Utiliser le webhook

On ne peut pas tester les réponses qui jouent du mp3 dans la console de test de Dialogflow. Dorénavant, il faudra utiliser le simulateur de la console Actions on Google.

 

Intégrer l’agent Dialogflow avec Google Assistant

 

1. Dans le menu de gauche de Dialogflow, cliquez sur Intégrations, puis cliquez sur Google Assistant.
2. Dans la pop in qui apparaît, rajouter l’intent Play Sounds dans le menu ‘Additional triggering intents’. Cela permet aux utilisateur de ‘deep linker’ dans votre application. Il pourront dire directement : “Ok Google, demande à Son Zen de mettre un son de pluie”. Cette option permet aussi d’optimiser votre Voice SEO. Si un utilisateur dis : “Ok Google, je veux écouter de la pluie.” Google Assistant pourra mettre la personne en relation avec votre app.
3. Cliquez sur update draft.

Et là erreur : “Types should be same across locales. Expected: []. Actual: [$relaxingSounds].”
Nous n’avons pas bien paramétrer l’Entity relaxingSounds dans la langue anglaise.

Types should be same across locales
Types should be same across locales

Rajoutez la configuration de l’entity relaxingSounds en langue anglaise pour supprimer ce message d’erreur.

Configurer l'Entity en langue anglaise
Configurer l’Entity en langue anglaise

Réeffectuez la même manipulation pour mettre à jour l’intégration de l’agent Dialogflow avec Actions on Google.
Et là, on rencontre à nouveau une erreur : Request contains an invalid argument. Query pattern is missing for custom intent ‘Play Sounds’.

Query pattern is missing for custom intent 'Play Sounds'
Query pattern is missing for custom intent ‘Play Sounds’

En effet, nous n’avons pas rajouter d’utterances à notre intent Play Sounds en langue anglaise. Ajoutez donc un exemple d’énoncé de commande vocale pour l’intent Play Sounds de la langue anglaise et cliquez sur ‘Save’.

Ajouter un exemple d'énoncé à l'Intent Play Sounds EN
Ajouter un exemple d’énoncé à l’Intent Play Sounds EN

Retenter une nouvelle fois l’intégration avec Google Assistant. Cette fois c’est la bonne, nous arrivons sur console d’Actions on Google.

Intégrer Dialogflow avec Actions on Google
Intégrer Dialogflow avec Actions on Google

 

Tester l’application sur le simulateur de Google Assistant

 

Depuis la console Actions on Google, cliquez sur ‘Simulator’.
Puis vérifier que la langue sélectionnez est bien le français.
Choisissez une adresse française dans le champ juste à droite de la langue.
Sélectionnez l’icône de l’enceinte à la place de celle du smartphone.
Enfin, lancez le simulateur avec la commande ‘Parler avec mon application test’.

Utiliser la console de test d'Actions on Google
Utiliser la console de test d’Actions on Google

 

Conclusion

 

Ce tutoriel arrive à sa fin.
Il ne vous reste plus qu’à indiquer les metadata de votre Actions dans la console.
Il reste encore quelques étapes avant de pouvoir publier votre application mais le plus gros du travail est fait.
Ce blog post étant le premier, je serai très heureux d’avoir vos commentaires pour améliorer la qualité du contenu dans le futur. Si c’était trop long ou trop court, trop détaillé ou non, n’hésitez pas à me donner votre avis et à me poser vos questions dans la section commentaire.