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..
Avant de poursuivre, assurez-vous d'avoir accès à:
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.
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.
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.
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.
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:
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..
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)
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.
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..
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..