Share via


HoloLens (1ère génération) et Azure 303 : Compréhension du langage naturel (LUIS)


Notes

Les tutoriels Mixed Reality Academy ont été conçus pour les appareils HoloLens (1re génération) et les casques immersifs de réalité mixte. Nous estimons qu’il est important de laisser ces tutoriels à la disposition des développeurs qui recherchent encore des conseils pour développer des applications sur ces appareils. Notez que ces tutoriels ne sont pas mis à jour avec les derniers ensembles d’outils ou interactions utilisés pour HoloLens 2. Ils sont fournis dans le but de fonctionner sur les appareils pris en charge. Il y aura une nouvelle série de tutoriels qui seront publiés à l’avenir et qui montreront comment développer pour HoloLens 2. Cet avis sera mis à jour avec un lien vers ces tutoriels lorsqu’ils seront publiés.


Dans ce cours, vous allez apprendre à intégrer Language Understanding dans une application de réalité mixte à l’aide d’Azure Cognitive Services, avec l’API Language Understanding.

Résultat du labo

Language Understanding (LUIS) est un service Microsoft Azure, qui offre aux applications la possibilité de donner un sens à l’entrée de l’utilisateur, par exemple en extrayant ce qu’une personne peut vouloir, selon ses propres mots. Pour ce faire, le machine learning permet de comprendre et d’apprendre les informations d’entrée, puis de répondre avec des informations détaillées et pertinentes. Pour plus d’informations, consultez la page Azure Language Understanding (LUIS).

Après avoir terminé ce cours, vous disposerez d’une application de casque immersif de réalité mixte qui sera en mesure d’effectuer les opérations suivantes :

  1. Capturez la voix d’entrée utilisateur à l’aide du microphone attaché au casque immersif.
  2. Envoyez la dictée capturée au service intelligent Azure Language Understanding (LUIS).
  3. Demandez à LUIS d’extraire le sens des informations d’envoi, qui seront analysées, et de tenter de déterminer l’intention de la demande de l’utilisateur sera effectuée.

Le développement inclut la création d’une application dans laquelle l’utilisateur pourra utiliser la voix et/ou le regard pour modifier la taille et la couleur des objets dans la scène. L’utilisation de contrôleurs de mouvement ne sera pas couverte.

Dans votre application, il vous appartient de savoir comment intégrer les résultats à votre conception. Ce cours est conçu pour vous apprendre à intégrer un service Azure à votre projet Unity. C’est votre travail d’utiliser les connaissances que vous obtenez de ce cours pour améliorer votre application de réalité mixte.

Préparez-vous à entraîner LUIS plusieurs fois, ce qui est abordé dans le chapitre 12. Vous obtiendrez de meilleurs résultats plus il y a de fois que LUIS a été formé.

Prise en charge des appareils

Cours HoloLens Casques immersifs
MR et Azure 303 : Compréhension du langage naturel (LUIS) ✔️ ✔️

Notes

Bien que ce cours se concentre principalement sur Windows Mixed Reality casques immersifs (VR), vous pouvez également appliquer ce que vous avez appris dans ce cours à Microsoft HoloLens. À mesure que vous suivez le cours, vous verrez des notes sur les modifications que vous devrez peut-être utiliser pour prendre en charge HoloLens. Lorsque vous utilisez HoloLens, vous pouvez remarquer un certain écho lors de la capture vocale.

Prérequis

Notes

Ce tutoriel est conçu pour les développeurs qui ont une expérience de base avec Unity et C#. Sachez également que les conditions préalables et les instructions écrites contenues dans ce document représentent ce qui a été testé et vérifié au moment de la rédaction (mai 2018). Vous êtes libre d’utiliser les logiciels les plus récents, comme indiqué dans l’article Installer les outils , mais il ne faut pas supposer que les informations de ce cours correspondent parfaitement à ce que vous trouverez dans les logiciels plus récents que ce qui est listé ci-dessous.

Nous vous recommandons d’utiliser le matériel et les logiciels suivants pour ce cours :

Avant de commencer

  1. Pour éviter de rencontrer des problèmes lors de la création de ce projet, il est fortement recommandé de créer le projet mentionné dans ce didacticiel dans un dossier racine ou proche de la racine (les chemins de dossier longs peuvent entraîner des problèmes au moment de la génération).

  2. Pour permettre à votre ordinateur d’activer la dictée, accédez à Paramètres > Windows Confidentialité > vocale, Entrée manuscrite & Saisie et appuyez sur le bouton Activer les services vocaux et les suggestions de saisie.

  3. Le code de ce tutoriel vous permet d’enregistrer à partir du paramètre Périphérique microphone par défaut défini sur votre ordinateur. Assurez-vous que le périphérique microphone par défaut est défini comme celui que vous souhaitez utiliser pour capturer votre voix.

  4. Si votre casque dispose d’un microphone intégré, assurez-vous que l’option « Quand je porte mon casque, passer au micro du casque » est activée dans les paramètres du portail Mixed Reality.

    Configuration du casque immersif

Chapitre 1 : Configurer le portail Azure

Pour utiliser le service Language Understanding dans Azure, vous devez configurer une instance du service à mettre à la disposition de votre application.

  1. Connectez-vous au portail Azure.

    Notes

    Si vous n’avez pas encore de compte Azure, vous devez en créer un. Si vous suivez ce tutoriel dans une situation de classe ou de laboratoire, demandez à votre instructeur ou à l’un des surveillants de l’aide pour configurer votre nouveau compte.

  2. Une fois que vous êtes connecté, cliquez sur Nouveau dans le coin supérieur gauche, recherchez Language Understanding, puis cliquez sur Entrée.

    Créer une ressource LUIS

    Notes

    Le mot Nouveau a peut-être été remplacé par Créer une ressource, dans les portails plus récents.

  3. La nouvelle page à droite fournit une description du service Language Understanding. En bas à gauche de cette page, sélectionnez le bouton Créer pour créer une instance de ce service.

    Création du service LUIS - mention légale

  4. Une fois que vous avez cliqué sur Créer :

    1. Insérez le nom souhaité pour ce service instance.

    2. Sélectionnez un Abonnement.

    3. Sélectionnez le niveau tarifaire qui vous convient. Si c’est la première fois que vous créez un service LUIS, un niveau gratuit (nommé F0) doit être disponible. L’allocation gratuite devrait être plus que suffisante pour ce cours.

    4. Choisissez un groupe de ressources ou créez-en un. Un groupe de ressources permet de surveiller, de contrôler l’accès, de provisionner et de gérer la facturation d’une collection de ressources Azure. Il est recommandé de conserver tous les services Azure associés à un seul projet (par exemple, ces cours) sous un groupe de ressources commun).

      Si vous souhaitez en savoir plus sur les groupes de ressources Azure, consultez l’article sur les groupes de ressources.

    5. Déterminez l’emplacement de votre groupe de ressources (si vous créez un groupe de ressources). L’emplacement serait idéalement dans la région où l’application s’exécuterait. Certaines ressources Azure ne sont disponibles que dans certaines régions.

    6. Vous devez également confirmer que vous avez bien compris les conditions générales appliquées à ce service.

    7. Sélectionnez Create (Créer).

      Créer un service LUIS - entrée utilisateur

  5. Une fois que vous avez cliqué sur Créer, vous devrez attendre que le service soit créé, ce qui peut prendre une minute.

  6. Une notification s’affiche dans le portail une fois le service instance créé.

    Nouvelle image de notification Azure

  7. Cliquez sur la notification pour explorer votre nouveau service instance.

    Notification de création de ressource réussie

  8. Cliquez sur le bouton Accéder à la ressource dans la notification pour explorer votre nouvelle instance de service. Vous serez redirigé vers votre nouveau service LUIS instance.

    Accès aux clés LUIS

  9. Dans ce tutoriel, votre application doit effectuer des appels à votre service, ce qui est effectué à l’aide de la clé d’abonnement de votre service.

  10. Dans la page Démarrage rapide , de votre service API LUIS , accédez à la première étape, Récupérer vos clés, puis cliquez sur Clés (vous pouvez également y parvenir en cliquant sur le lien hypertexte bleu Clés, situé dans le menu de navigation des services, indiqué par l’icône de clé). Cela révélera vos clés de service.

  11. Prenez une copie de l’une des clés affichées, car vous en aurez besoin plus tard dans votre projet.

  12. Dans la page Service, cliquez sur Language Understanding portail pour être redirigé vers la page web que vous utiliserez pour créer votre nouveau service, dans l’application LUIS.

Chapitre 2 – Portail Language Understanding

Dans cette section, vous allez apprendre à créer une application LUIS sur le portail LUIS.

Important

N’oubliez pas que la configuration des entités, intentions et énoncés dans ce chapitre n’est que la première étape de la création de votre service LUIS : vous devrez également réentraîner le service, plusieurs fois, afin de le rendre plus précis. Le réentraînement de votre service est abordé dans le dernier chapitre de ce cours. Assurez-vous donc de le terminer.

  1. Lorsque vous accédez au portail Language Understanding, vous devrez peut-être vous connecter, si ce n’est déjà le cas, avec les mêmes informations d’identification que votre Portail Azure.

    Page de connexion LUIS

  2. S’il s’agit de la première fois que vous utilisez LUIS, vous devez faire défiler vers le bas de la page d’accueil pour rechercher et cliquer sur le bouton Créer une application LUIS .

    Créer une page d’application LUIS

  3. Une fois connecté, cliquez sur Mes applications (si vous n’êtes pas dans cette section actuellement). Vous pouvez ensuite cliquer sur Créer une application.

    LUIS - image mes applications

  4. Attribuez un nom à votre application.

  5. Si votre application est censée comprendre une langue différente de l’anglais, vous devez modifier la culture en la langue appropriée.

  6. Ici, vous pouvez également ajouter une description de votre nouvelle application LUIS.

    LUIS : créer une application

  7. Une fois que vous appuyez sur Terminé, vous entrez dans la page Build de votre nouvelle application LUIS .

  8. Voici quelques concepts importants à comprendre :

    • Intention, représente la méthode qui sera appelée à la suite d’une requête de l’utilisateur. Une INTENTION peut avoir une ou plusieurs ENTITÉS.
    • Entité, est un composant de la requête qui décrit les informations pertinentes pour l’INTENTION.
    • Les énoncés sont des exemples de requêtes fournies par le développeur, que LUIS utilisera pour s’entraîner lui-même.

Si ces concepts ne sont pas parfaitement clairs, ne vous inquiétez pas, car ce cours les clarifiera davantage dans ce chapitre.

Vous allez commencer par créer les entités nécessaires pour générer ce cours.

  1. Sur le côté gauche de la page, cliquez sur Entités, puis sur Créer une entité.

    Créer une entité

  2. Appelez la nouvelle couleur d’entité, définissez son type sur Simple, puis appuyez sur Terminé.

    Créer une entité simple - couleur

  3. Répétez ce processus pour créer trois (3) entités simples supplémentaires nommées :

    • upsize
    • Réduire
    • cible

Le résultat doit ressembler à l’image ci-dessous :

Résultat de la création d’entité

À ce stade, vous pouvez commencer à créer des intentions.

Avertissement

Ne supprimez pas l’intention Aucun .

  1. Sur le côté gauche de la page, cliquez sur Intentions, puis sur Créer une intention.

    Créer de nouvelles intentions

  2. Appelez le nouvel objet d’intentionChangeObjectColor.

    Important

    Ce nom d’intention est utilisé dans le code plus loin dans ce cours. Par conséquent, pour obtenir de meilleurs résultats, utilisez ce nom exactement comme indiqué.

Une fois que vous avez confirmé le nom, vous êtes dirigé vers la page Intentions.

LUIS - page intentions

Vous remarquerez qu’une zone de texte vous demande de taper 5 énoncés différents ou plus.

Notes

LUIS convertit tous les énoncés en minuscules.

  1. Insérez l’énoncé suivant dans la zone de texte supérieure (actuellement avec le type de texte environ 5 exemples... ), puis appuyez sur Entrée :
The color of the cylinder must be red

Vous remarquerez que le nouvel énoncé apparaîtra dans une liste en dessous.

Après le même processus, insérez les six (6) énoncés suivants :

make the cube black

make the cylinder color white

change the sphere to red

change it to green

make this yellow

change the color of this object to blue

Pour chaque énoncé que vous avez créé, vous devez identifier les mots qui doivent être utilisés par LUIS en tant qu’entités. Dans cet exemple, vous devez étiqueter toutes les couleurs en tant qu’entité de couleur et toutes les références possibles à une cible en tant qu’entité cible .

  1. Pour ce faire, essayez de cliquer sur le mot cylindre dans le premier énoncé et sélectionnez cible.

    Identifier les cibles d’énoncé

  2. Cliquez maintenant sur le mot rouge dans le premier énoncé et sélectionnez couleur.

    Identifier les entités d’énoncé

  3. Étiquetez également la ligne suivante, où le cube doit être une cible et le noir doit être une couleur. Notez également l’utilisation des mots « this »,« it » et « this object », que nous fournissons, afin d’avoir également des types cibles non spécifiques disponibles.

  4. Répétez le processus ci-dessus jusqu’à ce que tous les énoncés aient les entités étiquetées. Si vous avez besoin d’aide, consultez l’image ci-dessous.

    Conseil

    Lorsque vous sélectionnez des mots pour les étiqueter en tant qu’entités :

    • Pour un seul mot, cliquez dessus.
    • Pour un ensemble de deux mots ou plus, cliquez au début, puis à la fin de l’ensemble.

    Notes

    Vous pouvez utiliser le bouton bascule Vue des jetons pour basculer entre l’affichage Entités/Jetons !

  5. Les résultats doivent être comme indiqué dans les images ci-dessous, montrant la vue Entités/jetons :

    Jetons & vues Entités

  6. À ce stade, appuyez sur le bouton Train en haut à droite de la page et attendez que le petit indicateur rond sur celui-ci devienne vert. Cela indique que LUIS a été correctement formé pour reconnaître cette intention.

    Entraîner LUIS

  7. En tant qu’exercice pour vous, créez une intention appelée ChangeObjectSize, à l’aide de la cible Entities, du upsize et du downsize.

  8. Après le même processus que l’intention précédente, insérez les huit (8) énoncés suivants pour le changement de taille :

    increase the dimensions of that
    
    reduce the size of this
    
    i want the sphere smaller
    
    make the cylinder bigger
    
    size down the sphere
    
    size up the cube
    
    decrease the size of that object
    
    increase the size of this object
    
  9. Le résultat doit être semblable à celui de l’image ci-dessous :

    Configurer les jetons/entités ChangeObjectSize

  10. Une fois que Les intentions , ChangeObjectColor et ChangeObjectSize, ont été créées et entraînées, cliquez sur le bouton PUBLIER en haut de la page.

    Publier le service LUIS

  11. Dans la page Publier , vous allez finaliser et publier votre application LUIS afin qu’elle soit accessible par votre code.

    1. Définissez la liste déroulante Publier sur en tant que production.

    2. Définissez le fuseau horaire sur votre fuseau horaire.

    3. Cochez la case Inclure tous les scores d’intention prédits.

    4. Cliquez sur Publier sur l’emplacement de production.

      Paramètres de publication

  12. Dans la section Ressources et clés :

    1. Sélectionnez la région que vous définissez pour le service instance dans le portail Azure.
    2. Vous remarquerez un élément Starter_Key ci-dessous, ignorez-le.
    3. Cliquez sur Ajouter une clé et insérez la clé que vous avez obtenue dans le portail Azure lorsque vous avez créé votre instance de service. Si votre azure et le portail LUIS sont connectés au même utilisateur, des menus déroulants vous seront fournis pour le nom du locataire, le nom de l’abonnement et la clé que vous souhaitez utiliser (auront le même nom que celui que vous avez fourni précédemment dans le portail Azure.

    Important

    Sous Point de terminaison, prenez une copie du point de terminaison correspondant à la clé que vous avez insérée. Vous l’utiliserez bientôt dans votre code.

Chapitre 3 : Configurer le projet Unity

Ce qui suit est une configuration classique pour le développement avec la réalité mixte, et en tant que tel, est un bon modèle pour d’autres projets.

  1. Ouvrez Unity , puis cliquez sur Nouveau.

    Démarrez le nouveau projet Unity.

  2. Vous devez maintenant fournir un nom de projet Unity, insérer MR_LUIS. Vérifiez que le type de projet est défini sur 3D. Définissez l’emplacement sur un emplacement approprié (n’oubliez pas qu’il est préférable de se rapprocher des répertoires racines). Cliquez ensuite sur Créer un projet.

    Fournissez des détails pour le nouveau projet Unity.

  3. Avec Unity ouvert, il est utile de vérifier que l’Éditeur de script par défaut est défini sur Visual Studio. Accédez à Modifier les > préférences, puis, dans la nouvelle fenêtre, accédez à Outils externes. Remplacez Éditeur de script externe par Visual Studio 2017. Fermez la fenêtre Préférences.

    Mettre à jour la préférence de l’éditeur de script.

  4. Ensuite, accédez à Paramètres de génération de fichiers > et basculez la plateforme sur plateforme Windows universelle, en cliquant sur le bouton Changer de plateforme.

    Fenêtre Paramètres de build, basculer la plateforme vers UWP.

  5. Accédez à Paramètres > de génération de fichiers et assurez-vous que :

    1. L’appareil cible est défini sur N’importe quel appareil

      Pour le Microsoft HoloLens, définissez Appareil cible sur HoloLens.

    2. Le type de build est défini sur D3D

    3. Le KIT DE DÉVELOPPEMENT LOGICIEL (SDK) est défini sur Dernier installé

    4. La version de Visual Studio est définie sur Dernière installation

    5. Générer et exécuter est défini sur Ordinateur local

    6. Enregistrez la scène et ajoutez-la à la build.

      1. Pour ce faire, sélectionnez Ajouter des scènes ouvertes. Une fenêtre d’enregistrement s’affiche.

        Cliquez sur le bouton Ajouter des scènes ouvertes

      2. Créez un dossier pour cette scène et toute autre scène future, puis sélectionnez le bouton Nouveau dossier pour créer un dossier, nommez-le Scènes.

        Créer un dossier de scripts

      3. Ouvrez votre dossier Scenes nouvellement créé, puis dans le champ Nom de fichier : texte, tapez MR_LuisScene, puis appuyez sur Enregistrer.

        Donnez un nom à la nouvelle scène.

    7. Les paramètres restants, dans Paramètres de build, doivent être conservés par défaut pour l’instant.

  6. Dans la fenêtre Paramètres de build, cliquez sur le bouton Paramètres du lecteur pour ouvrir le panneau associé dans l’espace où se trouve l’inspecteur.

    Ouvrez les paramètres du lecteur.

  7. Dans ce panneau, quelques paramètres doivent être vérifiés :

    1. Sous l’onglet Autres paramètres :

      1. La version du runtime de script doit être stable (équivalent.NET 3.5).

      2. Le serveur principal de script doit être .NET

      3. Le niveau de compatibilité de l’API doit être .NET 4.6

        Mettez à jour d’autres paramètres.

    2. Sous l’onglet Paramètres de publication, sous Fonctionnalités, case activée :

      1. InternetClient

      2. Microphone

        Mise à jour des paramètres de publication.

    3. Plus bas dans le panneau, dans Paramètres XR (situé sous Paramètres de publication), cochez Réalité virtuelle prise en charge, assurez-vous que le Kit de développement logiciel (SDK) Windows Mixed Reality est ajouté.

      Mettez à jour les paramètres X R.

  8. Retour dans Paramètres de buildUnity C# Projects n’est plus grisé ; cochez la case en regard de ceci.

  9. Fermez la fenêtre Build Settings.

  10. Enregistrez votre scène et votre projet (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Chapitre 4 : Créer la scène

Important

Si vous souhaitez ignorer le composant Unity Set up de ce cours et continuer directement dans le code, n’hésitez pas à télécharger ce fichier .unitypackage, à l’importer dans votre projet en tant que package personnalisé, puis à continuer à partir du chapitre 5.

  1. Cliquez avec le bouton droit dans une zone vide du panneau hiérarchie, sous Objet 3D, ajoutez un plan.

    Créez un plan.

  2. N’oubliez pas que lorsque vous cliquez à nouveau avec le bouton droit dans la hiérarchie pour créer d’autres objets, si vous avez toujours le dernier objet sélectionné, l’objet sélectionné sera le parent de votre nouvel objet. Évitez ce clic gauche dans un espace vide dans la hiérarchie, puis cliquez avec le bouton droit.

  3. Répétez la procédure ci-dessus pour ajouter les objets suivants :

    1. Sphere
    2. Cylindre
    3. Cube
    4. Texte 3D
  4. La hiérarchie de scène résultante doit être semblable à celle de l’image ci-dessous :

    Configuration de la hiérarchie de scène.

  5. Cliquez avec le bouton gauche sur l’appareil photo principal pour la sélectionner. Examinez le panneau d’inspecteur pour voir l’objet Camera avec tous ses composants.

  6. Cliquez sur le bouton Ajouter un composant situé tout en bas du panneau Inspecteur.

    Ajouter une source audio

  7. Recherchez le composant audio source, comme indiqué ci-dessus.

  8. Assurez-vous également que le composant Transformer de l’appareil photo principal est défini sur (0,0,0). Pour ce faire, appuyez sur l’icône Engrenage en regard du composant Transformation de l’appareil photo et sélectionnez Réinitialiser. Le composant Transform doit alors se présenter comme suit :

    1. Position est définie sur 0, 0, 0.
    2. La rotation est définie sur 0, 0, 0.

    Notes

    Pour le Microsoft HoloLens, vous devez également modifier les éléments suivants, qui font partie du composant Caméra, qui se trouve sur votre appareil photo principal :

    • Effacer les indicateurs : Couleur unie.
    • Fond 'Black, Alpha 0' – Hex color : #000000000.
  9. Cliquez avec le bouton gauche sur plan pour le sélectionner. Dans le panneau De l’inspecteur , définissez le composant Transformer avec les valeurs suivantes :

    Axe X Axe Y Axe Z
    0 -1 0
  10. Cliquez avec le bouton gauche sur la Sphère pour la sélectionner. Dans le panneau De l’inspecteur , définissez le composant Transformer avec les valeurs suivantes :

    Axe X Axe Y Axe Z
    2 1 2
  11. Cliquez avec le bouton gauche sur le cylindre pour le sélectionner. Dans le panneau De l’inspecteur , définissez le composant Transformer avec les valeurs suivantes :

    Axe X Axe Y Axe Z
    -2 1 2
  12. Cliquez avec le bouton gauche sur le Cube pour le sélectionner. Dans le panneau De l’inspecteur , définissez le composant Transformer avec les valeurs suivantes :

Transformer - Position

X O Z
0 1 4

Transformation - Rotation

X O Z
45 45 0
  1. Cliquez avec le bouton gauche sur l’objet Nouveau texte pour le sélectionner. Dans le panneau De l’inspecteur , définissez le composant Transformer avec les valeurs suivantes :

Transformer - Position

X O Z
-2 6 9

Transformer - Mettre à l’échelle

X O Z
0.1 0.1 0.1
  1. Modifiez la taille de police dans le composant Text Mesh sur 50.

  2. Remplacez le nom de l’objet Text Mesh par Texte de dictée.

    Créer un objet Text 3D

  3. Votre structure du panneau hiérarchique doit maintenant ressembler à ceci :

    Maillage de texte en mode scène

  4. La scène finale doit ressembler à l’image ci-dessous :

    Vue de scène.

Chapitre 5 : Créer la classe MicrophoneManager

Le premier script que vous allez créer est la classe MicrophoneManager . Par la suite, vous allez créer le LuisManager, la classe Behaviours et enfin la classe De regard (n’hésitez pas à créer tout cela maintenant, bien qu’elle soit couverte à mesure que vous atteindrez chaque chapitre).

La classe MicrophoneManager est responsable des opérations suivantes :

  • Détection du périphérique d’enregistrement attaché au casque ou à l’ordinateur (selon la valeur par défaut).
  • Capturez l’audio (voix) et utilisez la dictée pour le stocker sous forme de chaîne.
  • Une fois la voix suspendue, envoyez la dictée à la classe LuisManager .

Pour créer cette classe :

  1. Cliquez avec le bouton droit dans le volet Projet, Créer un > dossier. Appelez le dossier Scripts.

    Créez le dossier Scripts.

  2. Une fois le dossier Scripts créé, double-cliquez dessus pour l’ouvrir. Ensuite, dans ce dossier, cliquez avec le bouton droit sur Créer un > script C#. Nommez le script MicrophoneManager.

  3. Double-cliquez sur MicrophoneManager pour l’ouvrir avec Visual Studio.

  4. Ajoutez les espaces de noms suivants en haut du fichier :

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. Ajoutez ensuite les variables suivantes dans la classe MicrophoneManager :

        public static MicrophoneManager instance; //help to access instance of this object
        private DictationRecognizer dictationRecognizer;  //Component converting speech to text
        public TextMesh dictationText; //a UI object used to debug dictation result
    
  6. Le code pour les méthodes Awake() et Start() doit maintenant être ajouté. Celles-ci sont appelées lorsque la classe initialise :

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
        void Start()
        {
            if (Microphone.devices.Length > 0)
            {
                StartCapturingAudio();
                Debug.Log("Mic Detected");
            }
        }
    
  7. Vous avez maintenant besoin de la méthode que l’application utilise pour démarrer et arrêter la capture vocale, et la transmettre à la classe LuisManager , que vous allez bientôt générer.

        /// <summary>
        /// Start microphone capture, by providing the microphone as a continual audio source (looping),
        /// then initialise the DictationRecognizer, which will capture spoken words
        /// </summary>
        public void StartCapturingAudio()
        {
            if (dictationRecognizer == null)
            {
                dictationRecognizer = new DictationRecognizer
                {
                    InitialSilenceTimeoutSeconds = 60,
                    AutoSilenceTimeoutSeconds = 5
                };
    
                dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
                dictationRecognizer.DictationError += DictationRecognizer_DictationError;
            }
            dictationRecognizer.Start();
            Debug.Log("Capturing Audio...");
        }
    
        /// <summary>
        /// Stop microphone capture
        /// </summary>
        public void StopCapturingAudio()
        {
            dictationRecognizer.Stop();
            Debug.Log("Stop Capturing Audio...");
        }
    
  8. Ajoutez un gestionnaire de dictée qui sera appelé lorsque la voix s’interrompt. Cette méthode transmet le texte de dictée à la classe LuisManager .

        /// <summary>
        /// This handler is called every time the Dictation detects a pause in the speech. 
        /// This method will stop listening for audio, send a request to the LUIS service 
        /// and then start listening again.
        /// </summary>
        private void DictationRecognizer_DictationResult(string dictationCaptured, ConfidenceLevel confidence)
        {
            StopCapturingAudio();
            StartCoroutine(LuisManager.instance.SubmitRequestToLuis(dictationCaptured, StartCapturingAudio));
            Debug.Log("Dictation: " + dictationCaptured);
            dictationText.text = dictationCaptured;
        }
    
        private void DictationRecognizer_DictationError(string error, int hresult)
        {
            Debug.Log("Dictation exception: " + error);
        }
    

    Important

    Supprimez la méthode Update(), car cette classe ne l’utilisera pas.

  9. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.

    Notes

    À ce stade, vous remarquerez qu’une erreur s’affiche dans le panneau de console de l’éditeur Unity. En effet, le code fait référence à la classe LuisManager que vous allez créer dans le chapitre suivant.

Chapitre 6 : Créer la classe LUISManager

Il est temps pour vous de créer la classe LuisManager , qui effectuera l’appel au service Azure LUIS.

L’objectif de cette classe est de recevoir le texte de dictée de la classe MicrophoneManager et de l’envoyer à l’API Azure Language Understanding à analyser.

Cette classe désérialise la réponse JSON et appelle les méthodes appropriées de la classe Behaviours pour déclencher une action.

Pour créer cette classe :

  1. Double-cliquez sur le dossier Scripts pour l’ouvrir.

  2. Cliquez avec le bouton droit dans le dossier Scripts , puis cliquez sur Créer un > script C#. Nommez le script LuisManager.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.

  4. Ajoutez les espaces de noms suivants en haut du fichier :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Vous allez commencer par créer trois classes dans la classe LuisManager (dans le même fichier de script, au-dessus de la méthode Start() qui représente la réponse JSON désérialisée d’Azure.

        [Serializable] //this class represents the LUIS response
        public class AnalysedQuery
        {
            public TopScoringIntentData topScoringIntent;
            public EntityData[] entities;
            public string query;
        }
    
        // This class contains the Intent LUIS determines 
        // to be the most likely
        [Serializable]
        public class TopScoringIntentData
        {
            public string intent;
            public float score;
        }
    
        // This class contains data for an Entity
        [Serializable]
        public class EntityData
        {
            public string entity;
            public string type;
            public int startIndex;
            public int endIndex;
            public float score;
        }
    
  6. Ensuite, ajoutez les variables suivantes dans la classe LuisManager :

        public static LuisManager instance;
    
        //Substitute the value of luis Endpoint with your own End Point
        string luisEndpoint = "https://westus.api.cognitive... add your endpoint from the Luis Portal";
    
  7. Veillez à placer votre point de terminaison LUIS maintenant (que vous aurez à partir de votre portail LUIS).

  8. Le code de la méthode Awake() doit maintenant être ajouté. Cette méthode est appelée lorsque la classe initialise :

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. Vous avez maintenant besoin des méthodes utilisées par cette application pour envoyer la dictée reçue de la classe MicrophoneManager à LUIS, puis recevoir et désérialiser la réponse.

  10. Une fois que la valeur de l’intention et des entités associées ont été déterminées, elles sont passées à la instance de la classe Behaviours pour déclencher l’action prévue.

        /// <summary>
        /// Call LUIS to submit a dictation result.
        /// The done Action is called at the completion of the method.
        /// </summary>
        public IEnumerator SubmitRequestToLuis(string dictationResult, Action done)
        {
            string queryString = string.Concat(Uri.EscapeDataString(dictationResult));
    
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(luisEndpoint + queryString))
            {
                yield return unityWebRequest.SendWebRequest();
    
                if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError)
                {
                    Debug.Log(unityWebRequest.error);
                }
                else
                {
                    try
                    {
                        AnalysedQuery analysedQuery = JsonUtility.FromJson<AnalysedQuery>(unityWebRequest.downloadHandler.text);
    
                        //analyse the elements of the response 
                        AnalyseResponseElements(analysedQuery);
                    }
                    catch (Exception exception)
                    {
                        Debug.Log("Luis Request Exception Message: " + exception.Message);
                    }
                }
    
                done();
                yield return null;
            }
        }
    
  11. Créez une méthode appelée AnalyseResponseElements() qui lira analyzeQuery résultant et déterminera les entités. Une fois ces entités déterminées, elles sont passées à la instance de la classe Comportements à utiliser dans les actions.

        private void AnalyseResponseElements(AnalysedQuery aQuery)
        {
            string topIntent = aQuery.topScoringIntent.intent;
    
            // Create a dictionary of entities associated with their type
            Dictionary<string, string> entityDic = new Dictionary<string, string>();
    
            foreach (EntityData ed in aQuery.entities)
            {
                entityDic.Add(ed.type, ed.entity);
            }
    
            // Depending on the topmost recognized intent, read the entities name
            switch (aQuery.topScoringIntent.intent)
            {
                case "ChangeObjectColor":
                    string targetForColor = null;
                    string color = null;
    
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForColor = pair.Value;
                        }
                        else if (pair.Key == "color")
                        {
                            color = pair.Value;
                        }
                    }
    
                    Behaviours.instance.ChangeTargetColor(targetForColor, color);
                    break;
    
                case "ChangeObjectSize":
                    string targetForSize = null;
                    foreach (var pair in entityDic)
                    {
                        if (pair.Key == "target")
                        {
                            targetForSize = pair.Value;
                        }
                    }
    
                    if (entityDic.ContainsKey("upsize") == true)
                    {
                        Behaviours.instance.UpSizeTarget(targetForSize);
                    }
                    else if (entityDic.ContainsKey("downsize") == true)
                    {
                        Behaviours.instance.DownSizeTarget(targetForSize);
                    }
                    break;
            }
        }
    

    Important

    Supprimez les méthodes Start() et Update(), car cette classe ne les utilisera pas.

  12. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.

Notes

À ce stade, vous remarquerez que plusieurs erreurs apparaissent dans le panneau de la console de l’éditeur Unity. En effet, le code fait référence à la classe Behaviours que vous allez créer dans le chapitre suivant.

Chapitre 7 : Créer la classe Comportements

La classe Behaviours déclenche les actions à l’aide des entités fournies par la classe LuisManager .

Pour créer cette classe :

  1. Double-cliquez sur le dossier Scripts pour l’ouvrir.

  2. Cliquez avec le bouton droit dans le dossier Scripts , puis cliquez sur Créer un > script C#. Nommez le script Comportements.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.

  4. Ajoutez ensuite les variables suivantes à l’intérieur de la classe Behaviours :

        public static Behaviours instance;
    
        // the following variables are references to possible targets
        public GameObject sphere;
        public GameObject cylinder;
        public GameObject cube;
        internal GameObject gazedTarget;
    
  5. Ajoutez le code de la méthode Awake(). Cette méthode est appelée lorsque la classe initialise :

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. Les méthodes suivantes sont appelées par la classe LuisManager (que vous avez créée précédemment) pour déterminer quel objet est la cible de la requête, puis déclencher l’action appropriée.

        /// <summary>
        /// Changes the color of the target GameObject by providing the name of the object
        /// and the name of the color
        /// </summary>
        public void ChangeTargetColor(string targetName, string colorName)
        {
            GameObject foundTarget = FindTarget(targetName);
            if (foundTarget != null)
            {
                Debug.Log("Changing color " + colorName + " to target: " + foundTarget.name);
    
                switch (colorName)
                {
                    case "blue":
                        foundTarget.GetComponent<Renderer>().material.color = Color.blue;
                        break;
    
                    case "red":
                        foundTarget.GetComponent<Renderer>().material.color = Color.red;
                        break;
    
                    case "yellow":
                        foundTarget.GetComponent<Renderer>().material.color = Color.yellow;
                        break;
    
                    case "green":
                        foundTarget.GetComponent<Renderer>().material.color = Color.green;
                        break;
    
                    case "white":
                        foundTarget.GetComponent<Renderer>().material.color = Color.white;
                        break;
    
                    case "black":
                        foundTarget.GetComponent<Renderer>().material.color = Color.black;
                        break;
                }          
            }
        }
    
        /// <summary>
        /// Reduces the size of the target GameObject by providing its name
        /// </summary>
        public void DownSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale -= new Vector3(0.5F, 0.5F, 0.5F);
        }
    
        /// <summary>
        /// Increases the size of the target GameObject by providing its name
        /// </summary>
        public void UpSizeTarget(string targetName)
        {
            GameObject foundTarget = FindTarget(targetName);
            foundTarget.transform.localScale += new Vector3(0.5F, 0.5F, 0.5F);
        }
    
  7. Ajoutez la méthode FindTarget() pour déterminer lequel des GameObjects est la cible de l’intention actuelle. Par défaut, la cible est « regardée » si aucune cible explicite n’est définie dans les entités.

        /// <summary>
        /// Determines which object reference is the target GameObject by providing its name
        /// </summary>
        private GameObject FindTarget(string name)
        {
            GameObject targetAsGO = null;
    
            switch (name)
            {
                case "sphere":
                    targetAsGO = sphere;
                    break;
    
                case "cylinder":
                    targetAsGO = cylinder;
                    break;
    
                case "cube":
                    targetAsGO = cube;
                    break;
    
                case "this": // as an example of target words that the user may use when looking at an object
                case "it":  // as this is the default, these are not actually needed in this example
                case "that":
                default: // if the target name is none of those above, check if the user is looking at something
                    if (gazedTarget != null) 
                    {
                        targetAsGO = gazedTarget;
                    }
                    break;
            }
            return targetAsGO;
        }
    

    Important

    Supprimez les méthodes Start() et Update(), car cette classe ne les utilisera pas.

  8. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.

Chapitre 8 : Créer la classe De regard

La dernière classe dont vous aurez besoin pour terminer cette application est la classe Regard. Cette classe met à jour la référence au GameObject actuellement dans le focus visuel de l’utilisateur.

Pour créer cette classe :

  1. Double-cliquez sur le dossier Scripts pour l’ouvrir.

  2. Cliquez avec le bouton droit dans le dossier Scripts , puis cliquez sur Créer un > script C#. Nommez le script Gaze.

  3. Double-cliquez sur le script pour l’ouvrir avec Visual Studio.

  4. Insérez le code suivant pour cette classe :

        using UnityEngine;
    
        public class Gaze : MonoBehaviour
        {        
            internal GameObject gazedObject;
            public float gazeMaxDistance = 300;
    
            void Update()
            {
                // Uses a raycast from the Main Camera to determine which object is gazed upon.
                Vector3 fwd = gameObject.transform.TransformDirection(Vector3.forward);
                Ray ray = new Ray(Camera.main.transform.position, fwd);
                RaycastHit hit;
                Debug.DrawRay(Camera.main.transform.position, fwd);
    
                if (Physics.Raycast(ray, out hit, gazeMaxDistance) && hit.collider != null)
                {
                    if (gazedObject == null)
                    {
                        gazedObject = hit.transform.gameObject;
    
                        // Set the gazedTarget in the Behaviours class
                        Behaviours.instance.gazedTarget = gazedObject;
                    }
                }
                else
                {
                    ResetGaze();
                }         
            }
    
            // Turn the gaze off, reset the gazeObject in the Behaviours class.
            public void ResetGaze()
            {
                if (gazedObject != null)
                {
                    Behaviours.instance.gazedTarget = null;
                    gazedObject = null;
                }
            }
        }
    
  5. Veillez à enregistrer vos modifications dans Visual Studio avant de revenir à Unity.

Chapitre 9 : Fin de la configuration de la scène

  1. Pour terminer la configuration de la scène, faites glisser chaque script que vous avez créé à partir du dossier Scripts vers l’objet Caméra principale dans le panneau Hiérarchie.

  2. Sélectionnez la caméra principale et examinez le panneau d’inspecteur. Vous devriez pouvoir voir chaque script que vous avez joint, et vous remarquerez que des paramètres ne sont pas encore définis sur chaque script.

    Définition des cibles de référence de l’appareil photo.

  3. Pour définir ces paramètres correctement, suivez ces instructions :

    1. MicrophoneManager :

      • À partir du panneau Hiérarchie, faites glisser l’objet Texte de dictée dans la zone valeur du paramètre Texte de dictée .
    2. Comportements, à partir du panneau hiérarchie :

      • Faites glisser l’objet Sphere dans la zone cible de référence Sphere .
      • Faites glisser le cylindre dans la zone cible de référence cylindre .
      • Faites glisser le cube dans la zone cible de référence du cube .
    3. Regard :

      • Définissez la distance maximale du regard sur 300 (si ce n’est pas déjà le cas).
  4. Le résultat doit ressembler à l’image ci-dessous :

    Montrant les cibles de référence de la caméra, désormais définies.

Chapitre 10 : Tester dans l’éditeur Unity

Vérifiez que la configuration de la scène est correctement implémentée.

Assurez-vous que :

  • Tous les scripts sont attachés à l’objet Main Camera .
  • Tous les champs du panneau principal de l’inspecteur de la caméra sont attribués correctement.
  1. Appuyez sur le bouton Lecture dans l’éditeur Unity. L’application doit s’exécuter dans le casque immersif attaché.

  2. Essayez quelques énoncés, tels que :

    make the cylinder red
    
    change the cube to yellow
    
    I want the sphere blue
    
    make this to green
    
    change it to white
    

    Notes

    Si vous voyez une erreur dans la console Unity concernant la modification du périphérique audio par défaut, la scène peut ne pas fonctionner comme prévu. Cela est dû à la façon dont le portail de réalité mixte traite des microphones intégrés pour les casques qui en ont. Si vous voyez cette erreur, il vous suffit d’arrêter la scène et de la redémarrer pour que les choses fonctionnent comme prévu.

Chapitre 11 : Générer et charger de manière indépendante la solution UWP

Une fois que vous avez vérifié que l’application fonctionne dans l’éditeur Unity, vous êtes prêt à générer et à déployer.

Pour générer :

  1. Enregistrez la scène actuelle en cliquant sur Enregistrer le fichier>.

  2. Accédez à Paramètres de génération de fichiers>.

  3. Cochez la case intitulée Unity C# Projects (utile pour voir et déboguer votre code une fois le projet UWP créé.

  4. Cliquez sur Ajouter des scènes ouvertes, puis sur Générer.

    Fenêtre Paramètres de build

  5. Vous serez invité à sélectionner le dossier dans lequel vous souhaitez générer la solution.

  6. Créez un dossier BUILDS et, dans ce dossier, créez un autre dossier avec le nom approprié de votre choix.

  7. Cliquez sur Sélectionner un dossier pour commencer la génération à cet emplacement.

    Créer un dossier BuildsSélectionner le dossier Builds

  8. Une fois la génération terminée (cela peut prendre un certain temps), Unity doit ouvrir une fenêtre de Explorateur de fichiers à l’emplacement de votre build.

Pour déployer sur un ordinateur local :

  1. Dans Visual Studio, ouvrez le fichier solution qui a été créé dans le chapitre précédent.

  2. Dans Plateforme de solution, sélectionnez x86, Ordinateur local.

  3. Dans configuration de la solution , sélectionnez Déboguer.

    Pour le Microsoft HoloLens, il peut être plus facile de définir ce paramètre sur Remote Machine, afin de ne pas être attaché à votre ordinateur. Toutefois, vous devez également effectuer les opérations suivantes :

    • Connaissez l’adresse IP de votre HoloLens, qui se trouve dans les paramètres > réseau & Internet > Wi-Fi > Options avancées ; L’adresse IPv4 est l’adresse que vous devez utiliser.
    • Vérifiez que le mode développeur est Activé ; trouvé dans Paramètres > Mise à jour & sécurité > pour les développeurs.

    Déployer une application

  4. Accédez au menu Générer et cliquez sur Déployer la solution pour charger l’application sur votre ordinateur.

  5. Votre application doit maintenant apparaître dans la liste des applications installées, prêtes à être lancées !

  6. Une fois lancée, l’application vous invite à autoriser l’accès au microphone. Utilisez les contrôleurs de mouvement, l’entrée vocale ou le clavier pour appuyer sur le bouton OUI .

Chapitre 12 : Amélioration de votre service LUIS

Important

Ce chapitre est extrêmement important et peut nécessiter une itération à plusieurs reprises, car il vous aidera à améliorer la précision de votre service LUIS : veillez à effectuer cette opération.

Pour améliorer le niveau de compréhension fourni par LUIS, vous devez capturer de nouveaux énoncés et les utiliser pour réentraîner votre application LUIS.

Par exemple, vous avez peut-être entraîné LUIS à comprendre « Augmenter » et « Augmenter la taille », mais ne voulez-vous pas que votre application comprenne également des mots tels que « Agrandir » ?

Une fois que vous avez utilisé votre application à plusieurs reprises, tout ce que vous avez dit sera collecté par LUIS et disponible dans le PORTAIL LUIS.

  1. Accédez à votre application portail en suivant ce LIEN, puis connectez-vous.

  2. Une fois connecté avec vos informations d’identification MS, cliquez sur le nom de votre application.

  3. Cliquez sur le bouton Vérifier les énoncés de point de terminaison à gauche de la page.

    Passer en revue les énoncés

  4. Vous verrez une liste des énoncés qui ont été envoyés à LUIS par votre application de réalité mixte.

    Liste des énoncés

Vous remarquerez certaines entités en surbrillance.

En pointant sur chaque mot mis en surbrillance, vous pouvez passer en revue chaque énoncé et déterminer quelle entité a été reconnue correctement, quelles entités sont incorrectes et quelles entités sont manquées.

Dans l’exemple ci-dessus, il a été constaté que le mot « spear » avait été mis en surbrillance en tant que cible. Il est donc nécessaire de corriger l’erreur, ce qui est fait en pointant sur le mot avec la souris et en cliquant sur Supprimer l’étiquette.

Vérifier les énoncésSupprimer l’image d’étiquette

  1. Si vous trouvez des énoncés complètement incorrects, vous pouvez les supprimer à l’aide du bouton Supprimer sur le côté droit de l’écran.

    Supprimer des énoncés incorrects

  2. Ou si vous pensez que LUIS a interprété correctement l’énoncé, vous pouvez valider sa compréhension à l’aide du bouton Ajouter à l’intention alignée .

    Ajouter à une intention alignée

  3. Une fois que vous avez trié tous les énoncés affichés, essayez et rechargez la page pour voir si d’autres sont disponibles.

  4. Il est très important de répéter ce processus autant de fois que possible pour améliorer la compréhension de votre application.

En avant !

Votre application LUIS Intégrée terminée

Félicitations, vous avez créé une application de réalité mixte qui tire parti d’Azure Language Understanding Intelligence Service pour comprendre ce que dit un utilisateur et agir sur ces informations.

Résultats du labo

Exercices bonus

Exercice 1

Lors de l’utilisation de cette application, vous remarquerez peut-être que si vous regardez l’objet Floor et demandez à changer sa couleur, il le fera. Pouvez-vous savoir comment empêcher votre application de modifier la couleur du plancher ?

Exercice 2

Essayez d’étendre les fonctionnalités LUIS et App, en ajoutant des fonctionnalités supplémentaires pour les objets dans la scène ; par exemple, créez de nouveaux objets au point d’accès du regard, en fonction de ce que l’utilisateur dit, puis pouvez utiliser ces objets avec des objets de scène actuels, avec les commandes existantes.