Créer une interface conversationnelle pour Android avec Dialogflow

Ce que vous allez créer

La montée en puissance de l'intelligence artificielle déclenche un changement de paradigme dans le domaine du développement d'interfaces utilisateur. Grâce à la prolifération d'assistants intelligents et activés par la voix tels que Google Home, Siri et Alexa, les utilisateurs commencent à sentir que presser de nombreux boutons sur un écran ou remplir manuellement des formulaires est non seulement inefficace et lent, mais aussi à l'ancienne..

Heureusement, il existe aujourd'hui de nombreux services basés sur un nuage qui permettent aux développeurs d'ajouter facilement des interfaces utilisateur de conversation à leurs applications. Le Dialogflow Standard Edition de Google est l'un de ces services. C'est gratuit, très puissant, multilingue et livré avec un grand nombre de modèles bien conçus.

Dans ce tutoriel, je vais vous montrer comment créer une interface utilisateur conversationnelle à base de texte simple pour Android à l'aide de Dialogflow..

Conditions préalables

Avant de poursuivre, assurez-vous d'avoir accès à:

  • la dernière version d'Android Studio
  • un appareil ou un émulateur sous Android 5.0 ou supérieur

1. Créer un agent

En utilisant Dialogflow, vous travaillerez toujours avec un agent, un système de compréhension en langage naturel formé pour gérer un ensemble spécifique d'entrées utilisateur..

Pour créer votre premier agent, utilisez un compte Google pour vous connecter à la console Dialogflow et appuyez sur le bouton de la souris. Créer un agent bouton.

Dans le formulaire qui s’affiche, attribuez un nom raisonnable à l’agent, puis appuyez sur la touche. Créer bouton.

Après quelques secondes, vous aurez un nouvel agent.

2. Créer une intention

Alors que les interfaces visuelles ont des boutons, les utilisateurs peuvent appuyer pour exprimer leurs intentions, les interfaces de conversation ont des intentions. En tant que tel, dans une interface de conversation bien conçue, tout ce qu'un utilisateur peut dire est associé à une intention. Le travail d'un agent consiste uniquement à déterminer avec précision l'intention à activer lorsqu'un utilisateur prononce ou tape une phrase ou une phrase.

Pour que les choses restent simples, créons une seule intention pour notre agent: une intention nommée POIDS, qui permettra aux utilisateurs de convertir des poids en kilogrammes en livres et vice versa.

Pour créer l'intention, appuyez sur la touche Créer l'intention bouton dans la console.

Sur l'écran suivant, tapez le nom de l'intention et appuyez sur la touche Ajouter des phrases de formation bouton. Vous pourrez désormais fournir plusieurs phrases que l'agent peut utiliser pour se former. Par exemple, la phrase "ce qui est 32 kilogrammes en livres" serait une bonne phrase de formation pour le POIDS intention.

Après avoir tapé la phrase et frappé le Entrer vous verrez que Dialogflow devine correctement que la phrase "32 kilogrammes" est variable. Il va également créer automatiquement un paramètre accessible par programme nommé unité de poids pour cela et définir son type à @ sys.unit-weight.

De même, il suppose que le mot "livres" est lui aussi variable et crée un paramètre nommé nom-unité-poids, dont le type est @ sys.unit-weight-name.

Je vous suggère de taper quelques phrases d’entraînement similaires en veillant toujours à ce que le unité de poids et nom-unité-poids les paramètres sont résolus aux valeurs correctes.

Ensuite, appuyez sur le Ajouter des réponses bouton pour taper quelques réponses génériques. Comprenez bien que ceux-ci seront montrés à l'utilisateur textuellement.

Lorsque vous êtes satisfait des phrases d’entraînement et des réponses fournies, continuez et appuyez sur la touche sauvegarder bouton pour enregistrer l’intention et lancer le processus d’entraînement, qui dure généralement moins d’une minute.

Comme je l’ai dit plus tôt, une bonne interface de conversation doit pouvoir gérer tout ce que dit l’utilisateur. Cela signifie que notre agent doit également pouvoir cartographier les plaisanteries et les phrases qu'il ne comprend pas avec des intentions valables. Comme il s’agit là d’une exigence très courante, Dialogflow génère automatiquement de telles intentions pour nous, bien nommées. Intention de bienvenue par défaut et Intention de secours par défaut. Alors que le dernier n'a pas besoin de changements, le premier ne.

le Intention de bienvenue par défaut n'a pas de phrases de formation, vous devez donc en fournir quelques-unes. De plus, nous ne travaillerons pas avec les événements de ce tutoriel, vous pouvez donc supprimer le Bienvenue événement associé. 

appuyez sur la sauvegarder bouton après avoir effectué les modifications.

3. Activer Small Talk

Il est peu probable que la plupart des utilisateurs se limitent à la POIDS l'intention que vous avez créée. Bien que l’intention de repliement puisse traiter toutes les requêtes non valides, il est toujours judicieux de former l’agent afin qu’il puisse s’engager dans de petites discussions. Cela le fera paraître plus humain.

Dans la console Dialogflow, l'ajout de capacités de conversation réduite à l'agent est très simple. Tout ce que vous avez à faire est d’ouvrir le Banalités onglet et appuyez sur le Activer bouton.

À ce stade, l'agent sera en mesure de générer des réponses par défaut pour un grand nombre de questions courantes. Vous pouvez éventuellement personnaliser ces réponses pour leur donner une personnalité unique. Pour le moment, je vous suggère de répondre à quelques questions dans le A propos de l'agent section et appuyez sur la sauvegarder bouton.

4. Obtenir un jeton d'accès

Votre application Android aura besoin d'un jeton d'accès client lors de la communication avec l'agent Dialogflow. Pour l'obtenir, cliquez sur l'icône en forme d'engrenage à côté du nom de l'agent et ouvrez le Général languette. Sur le défilement vers le bas Clés API section, vous pourrez voir le jeton. Notez-le afin que vous puissiez l'utiliser plus tard.

5. Ajouter des dépendances de projet

Nous utiliserons la bibliothèque réseau de Fuel lors de notre interaction avec le service Web de Dialogflow, ajoutez donc ce qui suit la mise en oeuvre dépendance dans le app modules build.gradle fichier:

implémentation 'com.github.kittinunf.fuel: fuel-android: 1.12.1'

Dialogflow peut gérer à la fois le texte et l'audio. Dans ce tutoriel, cependant, nous ne travaillerons qu'avec du texte. Par conséquent, notre application va avoir une interface utilisateur semblable à une application de chat. Alors ajoutez la bibliothèque ChatMessageView comme une autre dépendance.

mise en oeuvre 'com.github.bassaer: chatmessageview: 1.10.0'

Enfin, assurez-vous que votre application peut se connecter à Internet en demandant l’autorisation suivante dans le AndroidManifest.xml fichier:

6. Définir la mise en page

La bibliothèque ChatMessageView ChatView Le widget offre une interface utilisateur de discussion à part entière capable d'afficher des messages de discussion et d'accepter les entrées de l'utilisateur. En l'utilisant dans notre mise en page, nous pouvons économiser beaucoup de temps et d'efforts. Alors placez le widget dans un FrameLayout widget et l'ajouter à votre fichier XML de mise en page.

   

Si les extensions Kotlin Android sont activées dans votre projet, une référence au widget sera disponible en tant que propriété d'extension dans votre activité..

Je vous suggère de lancer votre application maintenant pour jeter un coup d'œil à la mise en page que vous venez de créer..

7. Configuration du carburant

Vous pouvez rendre votre code de réseau beaucoup plus concis en configurant le client Fuel spécifiquement pour utiliser le service Web Dialogflow. Avant de le faire, cependant, ajoutez à votre activité le jeton d'accès au client que vous avez obtenu précédemment en tant que constante de compilation..

objet compagnon private const val ACCESS_TOKEN = "1234567890abcdef"

Toutes les demandes HTTP que vous adressez au service Web Dialogflow doivent avoir un Autorisation en-tête basé sur le jeton. Pour éviter de créer manuellement l’en-tête chaque fois que vous faites une demande, utilisez la commande baseHeaders propriété du FuelManager classe.

FuelManager.instance.baseHeaders = mapOf ("Autorisation" à "Bearer $ ACCESS_TOKEN")

Ensuite, réglez le basePath propriété du FuelManager class à l'URL de base du service Web Dialogflow.

FuelManager.instance.basePath = "https://api.dialogflow.com/v1/"

Enfin, toutes vos requêtes HTTP doivent toujours avoir les paramètres de configuration suivants: a v paramètre spécifiant la version du protocole que vous souhaitez utiliser, un lang paramètre spécifiant la langue dans laquelle vous voulez que les réponses de l'agent soient, et un ID de session paramètre dont la valeur peut être une chaîne quelconque.

Le code suivant vous montre comment utiliser le BaseParams propriété pour définir tous les paramètres:

FuelManager.instance.baseParams = listOf ("v" à "20170712", // dernier protocole "sessionId" à UUID.randomUUID (), // identifiant aléatoire "lang" à "fr" // langue anglaise)

8. Configuration de l'interface de discussion

le ChatView le widget a besoin de deux ChatUtilisateur objets: un pour l'utilisateur et un pour l'agent. Ces objets sont destinés à stocker des détails tels que les noms et les images de profil qui doivent être affichés avec les messages de discussion. De plus, chaque ChatUtilisateur l'objet doit avoir un identifiant unique qui lui est associé.

Le code suivant vous montre comment créer les objets:

val human = ChatUser (1, "Vous", BitmapFactory.decodeResource (ressources, R.drawable.ic_account_circle)) val agent = ChatUser (2, "Agent", BitmapFactory.decodeResource (ressources, R.drawable.ic_account_circle))

Notez que le code utilise une ressource intégrée nommée ic_account_circle en tant qu'avatar pour les deux objets. N'hésitez pas à utiliser toute autre ressource attrayante si vous voulez.

9. Envoi et réception de messages

Chaque fois que les utilisateurs appuient sur le bouton d’envoi du ChatView widget, vous devez créer Message objets en fonction du texte qu’ils ont saisi. Pour ce faire, vous pouvez utiliser le Message.Builder classe. Lors de la création de l'objet, vous devez vous assurer qu'il appartient à l'utilisateur humain en appelant le setUser () méthode.

Une fois la Message l'objet est prêt, vous pouvez le transmettre au envoyer() méthode du ChatView widget pour le rendre. Le code suivant vous montre comment procéder dans le setOnClickSendButtonListener () méthode du ChatView widget.

my_chat_view.setOnClickSendButtonListener (View.OnClickListener my_chat_view.send (Message.Builder () .setUser (human) .setText (my_chat_view.inputText) .build ()) // Plus de code ici)

Pour envoyer le message de l’utilisateur à votre agent, vous devez maintenant envoyer une demande HTTP GET au serveur. /question point de terminaison du service Web Dialogflow. A titre d’entrée, il s’attend à un question paramètre dont la valeur peut être toute phrase ou phrase saisie par l'utilisateur.

En réponse HTTP, vous obtenez un document JSON dont résultat / accomplissement / discours la valeur contient la réponse de l'agent.

Fuel.get ("/ query", listOf ("requête" vers my_chat_view.inputText)) .responseJson _, _, result -> val reply = result.get (). Obj () .getJSONObject ("result"). getJSONObject ("accomplissement") .getString ("speech") // Plus de code ici

Pour rendre la réponse à l'intérieur du ChatView widget, vous devez à nouveau construire un autre Message objet. Cette fois, cependant, son propriétaire doit être l'agent. De plus, pour afficher le message à droite, vous devez passer vrai à son redresser() méthode.

my_chat_view.send (Message.Builder () .setRight (true) .setUser (agent) .setText (réponse) .build ())

Si vous exécutez l'application maintenant, vous devriez pouvoir discuter avec l'agent..

Si vous demandez à l'application de convertir un poids en kilogrammes en livres, vous obtiendrez une réponse générique. Pour pouvoir réellement effectuer la conversion, vous devez d’abord déterminer si le POIDS l'intention a été déclenchée. Pour ce faire, vous pouvez vérifier la valeur de la result / metadata / intentName clé.

val intention: String? = result.get (). obj () .getJSONObject ("result") .optJSONObject ("metadata") .optString ("intentName") if (intent !! == "WEIGHT") // Plus de code ici

Une fois que vous êtes sûr que le POIDS l'intention a été déclenchée, vous pouvez déterminer les valeurs du nom-unité-poids et unité de poids paramètres, qui seront présents à l'intérieur du résultat / paramètres objet.

// Conversion en quelle valeur unitWeightName = result.get (). Obj () .getJSONObject ("result") .getJSONObject ("parameters") .getString ("unit-weight-name") // Le poids devant être valeur de conversion unitWeight = result.get (). obj () .getJSONObject ("result") .getJSONObject ("parameters") .getJSONObject ("unit-weight") .getDouble ("amount")

Avec les valeurs ci-dessus, tout ce qu’il faut, c’est un calcul simple et un sinon instruction pour effectuer la conversion. Pour rendre le résultat, vous aurez besoin d'un autre Message objet. Son propriétaire doit aussi être l'agent.

// Effectue la conversion val result = if (unitWeightName == "lb") unitWeight * 2.20462 else unitWeight / 2.20462 // Afficher le résultat my_chat_view.send (Message.Builder () .setRight (true) .setUser (agent) .setText ("C'est $ "%. 2f ".format (résultat) $ unitWeightName") .build ())

Notre application est prête. Vous devriez pouvoir l'exécuter maintenant pour voir qu'il effectue correctement toutes les conversions..

Conclusion

Vous savez maintenant comment créer un agent convivial et utile à l'aide de Google Dialogflow. Dans ce tutoriel, vous avez également appris à créer une interface attrayante que les utilisateurs peuvent utiliser lorsqu'ils communiquent avec l'agent..

Pour en savoir plus sur Dialogflow, consultez sa documentation officielle..