HoloLens (1e generatie) en Azure 303: Begrip van natuurlijke taal (LUIS)


Notitie

De Mixed Reality Academy-zelfstudies zijn ontworpen met het oog op HoloLens (1e generatie) en Mixed Reality Immersive Headsets. Daarom vinden we het belangrijk om deze zelfstudies te laten staan voor ontwikkelaars die nog steeds op zoek zijn naar hulp bij het ontwikkelen van deze apparaten. Deze zelfstudies worden niet bijgewerkt met de nieuwste hulpprogrammasets of interacties die worden gebruikt voor HoloLens 2. Ze worden onderhouden om te blijven werken op de ondersteunde apparaten. Er komt een nieuwe reeks zelfstudies die in de toekomst worden gepost, waarin wordt gedemonstreerd hoe u kunt ontwikkelen voor HoloLens 2. Deze kennisgeving wordt bijgewerkt met een koppeling naar deze zelfstudies wanneer deze worden gepost.


In deze cursus leert u hoe u Language Understanding integreert in een mixed reality-toepassing met behulp van Azure Cognitive Services, met behulp van de Language Understanding API.

Labresultaat

Language Understanding (LUIS) is een Microsoft Azure-service, die toepassingen de mogelijkheid biedt om betekenis te geven aan gebruikersinvoer, bijvoorbeeld door in hun eigen woorden te extraheren wat een persoon mogelijk wil. Dit wordt bereikt door middel van machine learning, dat de invoergegevens begrijpt en leert, en vervolgens kan reageren met gedetailleerde, relevante informatie. Ga naar de pagina Azure Language Understanding (LUIS) voor meer informatie.

Nadat u deze cursus hebt voltooid, hebt u een mixed reality immersive headset-toepassing die het volgende kan doen:

  1. Leg spraak van gebruikersinvoer vast met behulp van de microfoon die is aangesloten op de immersive headset.
  2. Verzend de vastgelegde dicteerfunctie de Azure Language Understanding Intelligent Service (LUIS).
  3. Laat LUIS betekenis extraheren uit de verzendinformatie, die wordt geanalyseerd en probeer de intentie van de aanvraag van de gebruiker te bepalen.

De ontwikkeling omvat het maken van een app waarin de gebruiker spraak en/of staren kan gebruiken om de grootte en de kleur van de objecten in de scène te wijzigen. Het gebruik van bewegingscontrollers wordt niet behandeld.

In uw toepassing bepaalt u zelf hoe u de resultaten integreert met uw ontwerp. Deze cursus is ontworpen om u te leren hoe u een Azure-service kunt integreren met uw Unity-project. Het is uw taak om de kennis die u uit deze cursus opdoet te gebruiken om uw mixed reality-toepassing te verbeteren.

Wees voorbereid om LUIS meerdere keren te trainen, wat wordt behandeld in Hoofdstuk 12. U krijgt betere resultaten naar des te vaker LUIS is getraind.

Ondersteuning voor apparaten

Cursus HoloLens Immersive headsets
MR en Azure 303: Begrip van natuurlijke taal (LUIS) ✔️ ✔️

Notitie

Hoewel deze cursus zich voornamelijk richt op Windows Mixed Reality immersive (VR)-headsets, kunt u wat u in deze cursus leert ook toepassen op Microsoft HoloLens. Terwijl u de cursus volgt, ziet u notities over eventuele wijzigingen die u mogelijk moet doorvoeren om HoloLens te ondersteunen. Wanneer u HoloLens gebruikt, ziet u mogelijk wat echo tijdens het vastleggen van spraak.

Vereisten

Notitie

Deze zelfstudie is bedoeld voor ontwikkelaars die basiservaring hebben met Unity en C#. Houd er ook rekening mee dat de vereisten en schriftelijke instructies in dit document overeenkomen met wat is getest en geverifieerd op het moment van schrijven (mei 2018). U bent vrij om de nieuwste software te gebruiken, zoals vermeld in het artikel over het installeren van de hulpprogramma's , hoewel niet mag worden aangenomen dat de informatie in deze cursus perfect overeenkomt met wat u in nieuwere software vindt dan wat hieronder wordt vermeld.

Voor deze cursus raden we de volgende hardware en software aan:

Voordat u begint

  1. Om problemen met het bouwen van dit project te voorkomen, wordt u sterk aangeraden het project te maken dat in deze zelfstudie wordt vermeld in een hoofdmap of een bijna-hoofdmap (lange mappaden kunnen problemen veroorzaken tijdens het bouwen).

  2. Als u wilt toestaan dat uw computer dicteren kan inschakelen, gaat u naar Windows-instellingen > Privacy > spraak, handschrift & Typen en drukt u op de knop Spraakservices en typsuggesties inschakelen.

  3. Met de code in deze zelfstudie kunt u opnemen vanaf het standaardmicrofoonapparaat dat is ingesteld op uw computer. Zorg ervoor dat het standaardmicrofoonapparaat is ingesteld als het apparaat dat u wilt gebruiken om uw stem vast te leggen.

  4. Als uw headset een ingebouwde microfoon heeft, controleert u of de optie 'Wanneer ik mijn headset draag, schakel over naar headsetmicrofoon' is ingeschakeld in de instellingen van de Mixed Reality Portal.

    Insluitende headset instellen

Hoofdstuk 1: Azure Portal instellen

Als u de Language Understanding-service in Azure wilt gebruiken, moet u een exemplaar van de service configureren dat beschikbaar moet worden gesteld aan uw toepassing.

  1. Meld u aan bij Azure Portal.

    Notitie

    Als u nog geen Azure-account hebt, moet u er een maken. Als u deze zelfstudie volgt in een leslokaal- of labsituatie, vraagt u uw docent of een van de docenten om hulp bij het instellen van uw nieuwe account.

  2. Zodra u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek, zoekt u Language Understanding en klikt u op Enter.

    LUIS-resources maken

    Notitie

    Het woord Nieuw is mogelijk vervangen door Een resource maken in nieuwere portals.

  3. De nieuwe pagina aan de rechterkant bevat een beschrijving van de Language Understanding service. Selecteer linksonder op deze pagina de knop Maken om een exemplaar van deze service te maken.

    Luis-service maken - juridische kennisgeving

  4. Nadat u op Maken hebt geklikt:

    1. Voeg de gewenste naam in voor dit service-exemplaar.

    2. Selecteer een Abonnement.

    3. Selecteer de prijscategorie die geschikt is voor u. Als dit de eerste keer is dat u een LUIS-service maakt, moet er een gratis laag (met de naam F0) voor u beschikbaar zijn. De gratis toewijzing moet meer dan voldoende zijn voor deze cursus.

    4. Kies een resourcegroep of maak een nieuwe. Een resourcegroep biedt een manier om een verzameling Azure-assets te bewaken, toegang te beheren, in te richten en facturering te beheren. Het wordt aanbevolen om alle Azure-services die zijn gekoppeld aan één project (bijvoorbeeld deze cursussen) onder een gemeenschappelijke resourcegroep te houden.

      Als u meer wilt lezen over Azure-resourcegroepen, gaat u naar het artikel over resourcegroepen.

    5. Bepaal de locatie voor uw resourcegroep (als u een nieuwe resourcegroep maakt). De locatie bevindt zich idealiter in de regio waar de toepassing wordt uitgevoerd. Sommige Azure-assets zijn alleen beschikbaar in bepaalde regio's.

    6. U moet ook bevestigen dat u de voorwaarden hebt begrepen die van toepassing zijn op deze Service.

    7. Selecteer Maken.

      LUIS-service maken - gebruikersinvoer

  5. Nadat u op Maken hebt geklikt, moet u wachten tot de service is gemaakt. Dit kan een minuut duren.

  6. Er wordt een melding weergegeven in de portal zodra het service-exemplaar is gemaakt.

    Installatiekopieën voor nieuwe Azure-meldingen

  7. Klik op de melding om uw nieuwe service-exemplaar te verkennen.

    Melding dat de resource is gemaakt

  8. Klik op de knop Ga naar resource in de melding om uw nieuwe service-exemplaar te verkennen. U wordt naar uw nieuwe LUIS-service-exemplaar gebracht.

    Toegang tot LUIS-sleutels

  9. In deze zelfstudie moet uw toepassing uw service aanroepen doen. Dit gebeurt met behulp van de abonnementssleutel van uw service.

  10. Ga op de pagina Snel starten van uw LUIS API-service naar de eerste stap, Uw sleutels ophalen en klik op Sleutels (u kunt dit ook doen door te klikken op de blauwe hyperlink Sleutels in het navigatiemenu van de services, aangegeven met het sleutelpictogram). Hiermee worden uw servicesleutels weergegeven.

  11. Maak een kopie van een van de weergegeven sleutels, omdat u deze later in uw project nodig hebt.

  12. Klik op de pagina Service op Language Understanding Portal om te worden omgeleid naar de webpagina die u gaat gebruiken om uw nieuwe service te maken, in de LUIS-app.

Hoofdstuk 2 : De Language Understanding Portal

In deze sectie leert u hoe u een LUIS-app maakt in de LUIS-portal.

Belangrijk

Houd er rekening mee dat het instellen van de entiteiten, intenties en utterances in dit hoofdstuk slechts de eerste stap is bij het bouwen van uw LUIS-service: u moet de service ook meerdere keren opnieuw trainen, zodat u deze nauwkeuriger wilt maken. Het opnieuw trainen van uw service wordt behandeld in het laatste hoofdstuk van deze cursus, dus zorg ervoor dat u deze voltooit.

  1. Wanneer u de Language Understanding Portal bereikt, moet u zich mogelijk aanmelden, als u dat nog niet bent, met dezelfde referenties als uw Azure Portal.

    LUIS-aanmeldingspagina

  2. Als dit de eerste keer is dat u LUIS gebruikt, moet u omlaag schuiven naar de onderkant van de welkomstpagina om de knop LUIS-app maken te zoeken en erop te klikken.

    Pagina LUIS-app maken

  3. Wanneer u bent aangemeld, klikt u op Mijn apps (als u zich momenteel niet in die sectie bevindt). Klik vervolgens op Nieuwe app maken.

    LUIS - mijn apps-afbeelding

  4. Geef uw app een naam.

  5. Als uw app een andere taal moet begrijpen dan Engels, moet u cultuur wijzigen in de juiste taal.

  6. Hier kunt u ook een beschrijving van uw nieuwe LUIS-app toevoegen.

    LUIS - een nieuwe app maken

  7. Zodra u op Gereed drukt, gaat u naar de pagina Build van uw nieuwe LUIS-toepassing .

  8. Er zijn hier enkele belangrijke concepten die u moet begrijpen:

    • Intent, vertegenwoordigt de methode die wordt aangeroepen na een query van de gebruiker. Een INTENT kan een of meer ENTITEITEN hebben.
    • Entiteit, is een onderdeel van de query waarin informatie wordt beschreven die relevant is voor de INTENT.
    • Utterances zijn voorbeelden van query's die door de ontwikkelaar worden geleverd en die LUIS gebruikt om zichzelf te trainen.

Als deze concepten niet helemaal duidelijk zijn, maakt u zich geen zorgen, want deze cursus zal ze verder verduidelijken in dit hoofdstuk.

U begint met het maken van de entiteiten die nodig zijn om deze cursus te bouwen.

  1. Klik aan de linkerkant van de pagina op Entiteiten en klik vervolgens op Nieuwe entiteit maken.

    Nieuwe entiteit maken

  2. Roep de nieuwe entiteitskleur aan, stel het type in op Eenvoudig en druk vervolgens op Gereed.

    Eenvoudige entiteit maken - kleur

  3. Herhaal dit proces om drie (3) meer Simple-entiteiten te maken met de naam:

    • Converteren
    • Krimpen
    • Doel

Het resultaat moet eruitzien zoals in de onderstaande afbeelding:

Resultaat van het maken van een entiteit

Nu kunt u beginnen met het maken van intenties.

Waarschuwing

Verwijder de intentie None niet.

  1. Klik aan de linkerkant van de pagina op Intenties en klik vervolgens op Nieuwe intentie maken.

    Nieuwe intenties maken

  2. Roep de nieuwe intentChangeObjectColor aan.

    Belangrijk

    Deze intentienaam wordt later in deze cursus in de code gebruikt, dus gebruik deze naam voor de beste resultaten precies zoals opgegeven.

Zodra u de naam hebt bevestigd, wordt u omgeleid naar de pagina Intenties.

LUIS - intents-pagina

U ziet dat er een tekstvak is waarin u wordt gevraagd om 5 of meer verschillende uitingen te typen.

Notitie

LUIS converteert alle uitingen naar kleine letters.

  1. Voeg de volgende uiting in het bovenste tekstvak in (momenteel met de tekst Type ongeveer 5 voorbeelden... ) en druk op Enter:
The color of the cylinder must be red

U ziet dat de nieuwe Utterance wordt weergegeven in een lijst eronder.

Voeg na hetzelfde proces de volgende zes (6) uitingen in:

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

Voor elke uiting die u hebt gemaakt, moet u bepalen welke woorden door LUIS als entiteiten moeten worden gebruikt. In dit voorbeeld moet u alle kleuren labelen als een kleurenentiteit en alle mogelijke verwijzingen naar een doel als een doelentiteit .

  1. Als u dit wilt doen, klikt u op het woord cilinder in de eerste uiting en selecteert u doel.

    Uitingsdoelen identificeren

  2. Klik nu op het woord rood in de eerste uiting en selecteer kleur.

    Uitingsentiteiten identificeren

  3. Label ook de volgende regel, waarbij kubus een doel moet zijn en zwart een kleur moet zijn. U ziet ook het gebruik van de woorden 'dit', 'het' en 'dit object', die we bieden, zodat er ook niet-specifieke doeltypen beschikbaar zijn.

  4. Herhaal het bovenstaande proces totdat alle Utterances de entiteiten hebben gelabeld. Zie de onderstaande afbeelding als u hulp nodig hebt.

    Tip

    Bij het selecteren van woorden om ze als entiteiten te labelen:

    • Voor enkele woorden klikt u erop.
    • Voor een set van twee of meer woorden klikt u aan het begin en vervolgens op het einde van de set.

    Notitie

    U kunt de wisselknop Tokensweergave gebruiken om te schakelen tussen entiteiten/tokensweergave.

  5. De resultaten moeten worden weergegeven zoals in de onderstaande afbeeldingen, met de weergave Entiteiten/Tokens:

    Tokens & entiteitenweergaven

  6. Druk nu op de knop Trainen rechtsboven op de pagina en wacht tot de kleine ronde indicator groen wordt. Dit geeft aan dat LUIS is getraind om deze intentie te herkennen.

    LUIS trainen

  7. Als een oefening voor u maakt u een nieuwe intentie met de naam ChangeObjectSize, met behulp van het doel entiteiten, upsize en downsize.

  8. Volgens hetzelfde proces als de vorige intent voegt u de volgende acht (8) utterances in voor groottewijziging :

    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. Het resultaat moet er ongeveer uitzien zoals in de onderstaande afbeelding:

    De ChangeObjectSize-tokens/entiteiten instellen

  10. Zodra beide Intents, ChangeObjectColor en ChangeObjectSize, zijn gemaakt en getraind, klikt u op de knop PUBLICEREN boven aan de pagina.

    LUIS-service publiceren

  11. Op de pagina Publiceren voltooit en publiceert u uw LUIS-app, zodat deze door uw code kan worden geopend.

    1. Stel de vervolgkeuzelijst Publiceren naar in als Productie.

    2. Stel de tijdzone in op uw tijdzone.

    3. Schakel het selectievakje Alle voorspelde intentiescores opnemen in.

    4. Klik op Publiceren naar productiesite.

      Publicatie-instellingen

  12. In de sectie Resources en sleutels:

    1. Selecteer de regio die u hebt ingesteld voor het service-exemplaar in Azure Portal.
    2. Hieronder ziet u een Starter_Key element, negeer dit.
    3. Klik op Sleutel toevoegen en voeg de sleutel in die u hebt verkregen in de Azure-portal tijdens het maken van uw service-exemplaar. Als uw Azure en de LUIS-portal zijn aangemeld bij dezelfde gebruiker, krijgt u vervolgkeuzelijsten voor Tenantnaam, Abonnementsnaam en de sleutel die u wilt gebruiken (hebben dezelfde naam als die u eerder hebt opgegeven in de Azure-portal.

    Belangrijk

    Maak onder Eindpunt een kopie van het eindpunt dat overeenkomt met de sleutel die u hebt ingevoegd. U zult dit binnenkort in uw code gebruiken.

Hoofdstuk 3: Het Unity-project instellen

Het volgende is een typische configuratie voor het ontwikkelen met de mixed reality en is als zodanig een goede sjabloon voor andere projecten.

  1. Open Unity en klik op Nieuw.

    Start een nieuw Unity-project.

  2. U moet nu de naam van een Unity-project opgeven en MR_LUIS invoegen. Zorg ervoor dat het projecttype is ingesteld op 3D. Stel de Locatie in op een locatie die geschikt is voor u (denk eraan dat dichter bij hoofdmappen beter is). Klik vervolgens op Project maken.

    Geef details op voor het nieuwe Unity-project.

  3. Als Unity is geopend, is het de moeite waard om te controleren of de standaardscripteditor is ingesteld op Visual Studio. Ga naar Voorkeuren bewerken > en navigeer vervolgens vanuit het nieuwe venster naar Externe hulpprogramma's. Wijzig External Script Editor in Visual Studio 2017. Sluit het venster Voorkeuren .

    Voorkeur van scripteditor bijwerken.

  4. Ga vervolgens naar Instellingen voor bestandsopbouw > en zet het platform over op Universeel Windows-platform door op de knop Platform wisselen te klikken.

    Venster Build-instellingen, platform overschakelen naar UWP.

  5. Ga naar Instellingen voor het maken > van bestanden en controleer of:

    1. Doelapparaat is ingesteld op Elk apparaat

      Stel doelapparaat voor de Microsoft HoloLens in op HoloLens.

    2. Buildtype is ingesteld op D3D

    3. SDK is ingesteld op Laatst geïnstalleerd

    4. Visual Studio-versie is ingesteld op Laatst geïnstalleerd

    5. Bouwen en uitvoeren is ingesteld op Lokale computer

    6. Sla de scène op en voeg deze toe aan de build.

      1. Dit doet u door Open scènes toevoegen te selecteren. Er wordt een venster voor opslaan weergegeven.

        Klik op de knop Geopende scènes toevoegen

      2. Maak een nieuwe map voor deze en eventuele toekomstige scènes en selecteer vervolgens de knop Nieuwe map om een nieuwe map te maken, geef deze de naam Scènes.

        Nieuwe map met scripts maken

      3. Open de zojuist gemaakte map Scènes en typ in het tekstveld Bestandsnaam: MR_LuisScene en druk op Opslaan.

        Geef een naam op voor de nieuwe scène.

    7. De overige instellingen, in Build-instellingen, moeten voorlopig als standaard worden gelaten.

  6. Klik in het venster Build-instellingen op de knop Spelerinstellingen . Hiermee opent u het gerelateerde deelvenster in de ruimte waar de Inspector zich bevindt.

    Spelerinstellingen openen.

  7. In dit deelvenster moeten enkele instellingen worden geverifieerd:

    1. Op het tabblad Overige instellingen :

      1. Scripting Runtime-versie moet stabiel zijn (.NET 3.5-equivalent).

      2. De back-end van scripts moet .NET zijn

      3. API-compatibiliteitsniveau moet .NET 4.6 zijn

        Andere instellingen bijwerken.

    2. Schakel op het tabblad Publicatie-instellingen onder Mogelijkheden het volgende in:

      1. InternetClient

      2. Microfoon

        Publicatie-instellingen bijwerken.

    3. Verderop in het deelvenster, in XR-instellingen (onder Publicatie-instellingen), vinkt u Virtual Reality Ondersteund aan en controleert u of de Windows Mixed Reality SDK is toegevoegd.

      Werk de X R-instellingen bij.

  8. Terug in build-instellingenunity C# -projecten wordt niet langer grijs weergegeven; schakel het selectievakje naast dit selectievakje in.

  9. Sluit het venster Build Settings.

  10. Sla uw scène en project op (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Hoofdstuk 4 : De scène maken

Belangrijk

Als u het onderdeel Unity Instellen van deze cursus wilt overslaan en direct wilt doorgaan met code, kunt u dit .unitypackage downloaden, het als een aangepast pakket importeren in uw project en vervolgens doorgaan vanaf Hoofdstuk 5.

  1. Klik met de rechtermuisknop in een leeg gebied van het deelvenster Hiërarchie onder 3D-object en voeg een vlak toe.

    Een vliegtuig maken.

  2. Houd er rekening mee dat wanneer u opnieuw met de rechtermuisknop in de hiërarchie klikt om meer objecten te maken, het geselecteerde object het bovenliggende object van het nieuwe object is als u nog steeds het laatste object hebt geselecteerd. Vermijd dit linksklikken in een lege ruimte in de hiërarchie en klik vervolgens met de rechtermuisknop.

  3. Herhaal de bovenstaande procedure om de volgende objecten toe te voegen:

    1. Sphere
    2. Cilinder
    3. Kubus
    4. 3D-tekst
  4. De resulterende scènehiërarchie moet er ongeveer zo uitzien als in de onderstaande afbeelding:

    Scènehiërarchie instellen.

  5. Klik met de linkermuisknop op de hoofdcamera om deze te selecteren, kijk naar het deelvenster Inspector u ziet het cameraobject met alle bijbehorende onderdelen.

  6. Klik op de knop Onderdeel toevoegen helemaal onderaan het deelvenster Inspector.

    Audiobron toevoegen

  7. Zoek naar het onderdeel met de naam Audiobron, zoals hierboven wordt weergegeven.

  8. Zorg er ook voor dat het onderdeel Transformeren van de hoofdcamera is ingesteld op (0,0,0). Dit kan door op het tandwielpictogram naast het onderdeel Transformeren van de camera te drukken en Opnieuw instellen te selecteren. Het onderdeel Transformeren moet er dan als volgt uitzien:

    1. Positie is ingesteld op 0, 0, 0.
    2. Draaien is ingesteld op 0, 0, 0.

    Notitie

    Voor de Microsoft HoloLens moet u ook het volgende wijzigen, dat deel uitmaakt van het onderdeel Camera, dat zich op uw hoofdcamera bevindt:

    • Markeringen wissen: Effen kleur.
    • Achtergrond 'Black, Alpha 0' – Hex color: #00000000.
  9. Klik met de linkermuisknop op het vliegtuig om het te selecteren. Stel in het deelvenster Inspector het onderdeel Transformeren in met de volgende waarden:

    X-as Y-as Z-as
    0 -1 0
  10. Klik met de linkermuisknop op de Bol om deze te selecteren. Stel in het deelvenster Inspector het onderdeel Transformeren in met de volgende waarden:

    X-as Y-as Z-as
    2 1 2
  11. Klik met de linkermuisknop op de cilinder om deze te selecteren. Stel in het deelvenster Inspector het onderdeel Transformeren in met de volgende waarden:

    X-as Y-as Z-as
    -2 1 2
  12. Klik met de linkermuisknop op de kubus om deze te selecteren. Stel in het deelvenster Inspector het onderdeel Transformeren in met de volgende waarden:

Transformeren - Positie

X Y Z
0 1 4

Transformeren - draaien

X Y Z
45 45 0
  1. Klik met de linkermuisknop op het object Nieuwe tekst om het te selecteren. Stel in het deelvenster Inspector het onderdeel Transformeren in met de volgende waarden:

Transformeren - Positie

X Y Z
-2 6 9

Transformeren - Schalen

X Y Z
0,1 0,1 0,1
  1. Wijzig Tekengrootte in het onderdeel Text Mesh in 50.

  2. Wijzig de naam van het Object Text Mesh in Dicteertekst.

    3D-tekstobject maken

  3. De structuur van het deelvenster Hiërarchie moet er nu als volgt uitzien:

    tekstgaas in de scèneweergave

  4. De laatste scène moet eruitzien zoals in de onderstaande afbeelding:

    De scèneweergave.

Hoofdstuk 5: de klasse MicrophoneManager maken

Het eerste script dat u gaat maken, is de klasse MicrophoneManager . Hierna maakt u de LuisManager, de klasse Behaviors en ten slotte de Gaze-klasse (u kunt deze nu allemaal maken, hoewel deze worden behandeld wanneer u elk hoofdstuk bereikt).

De klasse MicrophoneManager is verantwoordelijk voor:

  • Detecteren van het opnameapparaat dat is aangesloten op de headset of machine (afhankelijk van wat het standaardapparaat is).
  • Leg de audio (stem) vast en gebruik de dicteerfunctie om deze op te slaan als een tekenreeks.
  • Zodra de stem is onderbroken, verzendt u het dicteren naar de luismanager-klasse .

Ga als volgt te werk om deze klasse te maken:

  1. Klik met de rechtermuisknop in het deelvenster Project op Map maken>. Roep de map Scripts aan.

    Maak de map Scripts.

  2. Terwijl de map Scripts is gemaakt, dubbelklikt u erop om het bestand te openen. Klik vervolgens in die map met de rechtermuisknop op C#-script maken>. Geef het script de naam MicrophoneManager.

  3. Dubbelklik op MicrophoneManager om deze te openen met Visual Studio.

  4. Voeg de volgende naamruimten toe aan het begin van het bestand:

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. Voeg vervolgens de volgende variabelen toe in de klasse 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. Code voor de methoden Awake() en Start() moet nu worden toegevoegd. Deze worden aangeroepen wanneer de klasse initialiseert:

        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. Nu hebt u de methode nodig die de app gebruikt om de spraakopname te starten en te stoppen en door te geven aan de klasse LuisManager , die u binnenkort gaat bouwen.

        /// <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. Voeg een dicteerhandler toe die wordt aangeroepen wanneer de stem wordt onderbroken. Met deze methode wordt de dicteertekst doorgegeven aan de klasse 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);
        }
    

    Belangrijk

    Verwijder de methode Update() omdat deze niet door deze klasse wordt gebruikt.

  9. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

    Notitie

    Op dit moment ziet u een fout die wordt weergegeven in het consolepaneel van de Unity-editor. Dit komt doordat de code verwijst naar de klasse LuisManager die u in het volgende hoofdstuk gaat maken.

Hoofdstuk 6: de klasse LUISManager maken

Het is tijd om de klasse LuisManager te maken, waarmee de Azure LUIS-service wordt aangeroepen.

Het doel van deze klasse is om de dicteertekst van de klasse MicrophoneManager te ontvangen en deze naar de Azure Language Understanding-API te verzenden om te worden geanalyseerd.

Deze klasse deserialiseert het JSON-antwoord en roept de juiste methoden van de klasse Behaviors aan om een actie te activeren.

Ga als volgt te werk om deze klasse te maken:

  1. Dubbelklik op de map Scripts om deze te openen.

  2. Klik met de rechtermuisknop in de map Scripts en klik op C#-script maken>. Noem het script LuisManager.

  3. Dubbelklik op het script om het te openen met Visual Studio.

  4. Voeg de volgende naamruimten toe aan het begin van het bestand:

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. U begint met het maken van drie klassen in de klasse LuisManager (in hetzelfde scriptbestand, boven de methode Start() die het gedeserialiseerde JSON-antwoord van Azure vertegenwoordigen.

        [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. Voeg vervolgens de volgende variabelen toe in de klasse 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. Zorg ervoor dat u uw LUIS-eindpunt nu in plaatst (dat u hebt vanuit uw LUIS-portal).

  8. Code voor de methode Awake() moet nu worden toegevoegd. Deze methode wordt aangeroepen wanneer de klasse initialiseert:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. Nu hebt u de methoden nodig die deze toepassing gebruikt om de dicteerfunctie die is ontvangen van de klasse MicrophoneManager naar LUIS te verzenden en vervolgens het antwoord te ontvangen en te deserialiseren.

  10. Zodra de waarde van de intentie en de bijbehorende entiteiten zijn bepaald, worden ze doorgegeven aan het exemplaar van de klasse Behaviors om de beoogde actie te activeren.

        /// <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. Maak een nieuwe methode met de naam AnalyseResponseElements() waarmee de resulterendeAnalysisQuery wordt gelezen en de entiteiten worden bepaald. Zodra deze entiteiten zijn bepaald, worden ze doorgegeven aan het exemplaar van de klasse Behaviors voor gebruik in de acties.

        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;
            }
        }
    

    Belangrijk

    Verwijder de methoden Start() en Update(), omdat deze klasse ze niet gebruikt.

  12. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

Notitie

Op dit moment ziet u verschillende fouten die worden weergegeven in het consolepaneel van de Unity-editor. Dit komt doordat de code verwijst naar de klasse Behaviors die u in het volgende hoofdstuk gaat maken.

Hoofdstuk 7 : De klasse Behaviors maken

De klasse Behaviors activeert de acties met behulp van de entiteiten die worden geleverd door de klasse LuisManager .

Ga als volgt te werk om deze klasse te maken:

  1. Dubbelklik op de map Scripts om deze te openen.

  2. Klik met de rechtermuisknop in de map Scripts en klik op C#-script maken>. Noem het script Behaviors.

  3. Dubbelklik op het script om het te openen met Visual Studio.

  4. Voeg vervolgens de volgende variabelen toe aan de klasse Behaviors :

        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. Voeg de code van de methode Awake() toe. Deze methode wordt aangeroepen wanneer de klasse initialiseert:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. De volgende methoden worden aangeroepen door de klasse LuisManager (die u eerder hebt gemaakt) om te bepalen welk object het doel van de query is en vervolgens de juiste actie te activeren.

        /// <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. Voeg de methode FindTarget() toe om te bepalen welk van de GameObjects het doel is van de huidige Intent. Met deze methode wordt het doel standaard ingesteld op het GameObject dat wordt 'gazed' als er geen expliciet doel is gedefinieerd in de entiteiten.

        /// <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;
        }
    

    Belangrijk

    Verwijder de methoden Start() en Update(), omdat deze klasse ze niet gebruikt.

  8. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

Hoofdstuk 8 : De Gaze-klasse maken

De laatste klasse die u nodig hebt om deze app te voltooien, is de Gaze-klasse . Met deze klasse wordt de verwijzing bijgewerkt naar het GameObject dat zich momenteel in de visuele focus van de gebruiker bevindt.

Deze klasse maken:

  1. Dubbelklik op de map Scripts om deze te openen.

  2. Klik met de rechtermuisknop in de map Scripts en klik op C#-script maken>. Noem het script Gaze.

  3. Dubbelklik op het script om het te openen met Visual Studio.

  4. Voeg de volgende code in voor deze klasse:

        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. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

Hoofdstuk 9 : De scène-instelling voltooien

  1. Als u de installatie van de scène wilt voltooien, sleept u elk script dat u hebt gemaakt van de map Scripts naar het object Hoofdcamera in het deelvenster Hiërarchie.

  2. Selecteer de hoofdcamera en kijk naar het deelvenster Inspector. U moet elk script kunnen zien dat u hebt gekoppeld en u zult zien dat er parameters voor elk script zijn die nog moeten worden ingesteld.

    De referentiedoelen voor de camera instellen.

  3. Volg deze instructies om deze parameters correct in te stellen:

    1. MicrophoneManager:

      • Sleep vanuit het deelvenster Hiërarchie het object Dicteertekst naar het vak Parameterwaarde Dicteertekst .
    2. Gedrag in het deelvenster Hiërarchie:

      • Sleep het sphere-object naar het vak Sphere-verwijzingsdoel.
      • Sleep de Cilinder naar het vak Cilinderreferentiedoel .
      • Sleep de kubus naar het vak Kubusreferentiedoel .
    3. Blik:

      • Stel de Gaze Max Distance in op 300 (als dit nog niet het beste is).
  4. Het resultaat moet eruitzien zoals in de onderstaande afbeelding:

    De camerareferentiedoelen worden weergegeven, nu ingesteld.

Hoofdstuk 10 : Testen in de Unity-editor

Test of de scène-installatie correct is geïmplementeerd.

U moet het volgende hebben gedaan:

  • Alle scripts zijn gekoppeld aan het object Hoofdcamera .
  • Alle velden in het deelvenster Hoofdcameracontrole zijn correct toegewezen.
  1. Druk op de knop Afspelen in de Unity-editor. De app moet worden uitgevoerd in de gekoppelde immersive headset.

  2. Probeer een paar utterances, zoals:

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

    Notitie

    Als u in de Unity-console een fout ziet over het wijzigen van het standaardaudioapparaat, werkt de scène mogelijk niet zoals verwacht. Dit komt door de manier waarop de mixed reality-portal omgaat met ingebouwde microfoons voor headsets die deze hebben. Als u deze fout ziet, stopt u de scène en start u deze opnieuw en werkt alles zoals verwacht.

Hoofdstuk 11 : De UWP-oplossing bouwen en sideloaden

Zodra u ervoor hebt gezorgd dat de toepassing werkt in de Unity-editor, bent u klaar om te bouwen en te implementeren.

Ga als volgende te werk om te bouwen:

  1. Sla de huidige scène op door op Bestand > opslaan te klikken.

  2. Ga naar Instellingen voor het maken > van bestanden.

  3. Schakel het selectievakje Unity C#-projecten in (handig om uw code te bekijken en fouten op te sporen nadat het UWP-project is gemaakt).

  4. Klik op Open scènes toevoegen en klik vervolgens op Bouwen.

    Venster Build-instellingen

  5. U wordt gevraagd de map te selecteren waarin u de oplossing wilt bouwen.

  6. Maak een MAP BUILDS en maak in die map een andere map met de juiste naam van uw keuze.

  7. Klik op Map selecteren om de build op die locatie te starten.

    Buildmap maken: map Builds selecteren

  8. Zodra Unity klaar is met bouwen (dit kan enige tijd duren), wordt er een Bestandenverkenner venster geopend op de locatie van uw build.

Implementeren op lokale computer:

  1. Open in Visual Studio het oplossingsbestand dat in het vorige hoofdstuk is gemaakt.

  2. Selecteer in solution platformx86, Lokale computer.

  3. Selecteer foutopsporing in oplossingsconfiguratie.

    Voor de Microsoft HoloLens kunt u deze mogelijk gemakkelijker instellen op Externe computer, zodat u niet aan uw computer bent gekoppeld. U moet echter ook het volgende doen:

    • Ken het IP-adres van uw HoloLens, dat u kunt vinden in het Instellingennetwerk > & Internet > Wi-Fi > Geavanceerde opties; de IPv4 is het adres dat u moet gebruiken.
    • Zorg ervoor dat de ontwikkelaarsmodus is ingeschakeld; gevonden in Instellingen > Update & Beveiliging > voor ontwikkelaars.

    App implementeren

  4. Ga naar het menu Bouwen en klik op Oplossing implementeren om de toepassing naar uw computer te sideloaden.

  5. Uw app wordt nu weergegeven in de lijst met geïnstalleerde apps, klaar om te worden gestart.

  6. Zodra de app is gestart, wordt u gevraagd toegang tot de microfoon te autoriseren. Gebruik de bewegingscontrollers, spraakinvoer of het toetsenbord om op de knop JA te drukken.

Hoofdstuk 12 : Uw LUIS-service verbeteren

Belangrijk

Dit hoofdstuk is ongelooflijk belangrijk en moet mogelijk meerdere keren worden herhaald, omdat het helpt de nauwkeurigheid van uw LUIS-service te verbeteren: zorg ervoor dat u dit voltooit.

Als u het kennisniveau van LUIS wilt verbeteren, moet u nieuwe uitingen vastleggen en deze gebruiken om uw LUIS-app opnieuw te trainen.

Misschien hebt u LUIS bijvoorbeeld getraind om 'Verhogen' en 'Upsize' te begrijpen, maar wilt u niet dat uw app ook woorden als 'Vergroten' begrijpt?

Zodra u uw toepassing een paar keer hebt gebruikt, wordt alles wat u hebt gezegd verzameld door LUIS en beschikbaar in de LUIS-PORTAL.

  1. Ga naar uw portaltoepassing via deze KOPPELING en meld u aan.

  2. Zodra u bent aangemeld met uw MS-referenties, klikt u op de naam van uw app.

  3. Klik op de knop Eindpuntuitingen controleren aan de linkerkant van de pagina.

    Utterances controleren

  4. U krijgt een lijst te zien van de uitingen die door uw mixed reality-toepassing naar LUIS zijn verzonden.

    Lijst met utterances

U ziet enkele gemarkeerde entiteiten.

Door de muisaanwijzer op elk gemarkeerd woord te bewegen, kunt u elke uiting controleren en bepalen welke entiteit correct is herkend, welke entiteiten verkeerd zijn en welke entiteiten worden gemist.

In het bovenstaande voorbeeld is vastgesteld dat het woord 'speer' is gemarkeerd als een doel, dus het is noodzakelijk om de fout te corrigeren. Dit wordt gedaan door de muisaanwijzer over het woord te bewegen en op Label verwijderen te klikken.

Uitingen controleren Labelafbeelding verwijderen

  1. Als u uitingen vindt die helemaal verkeerd zijn, kunt u deze verwijderen met de knop Verwijderen aan de rechterkant van het scherm.

    Verkeerde utterances verwijderen

  2. Of als u denkt dat LUIS de uiting correct heeft geïnterpreteerd, kunt u het begrip ervan valideren met behulp van de knop Toevoegen aan uitgelijnde intentie .

    Toevoegen aan uitgelijnde intentie

  3. Nadat u alle weergegeven utterances hebt gesorteerd, probeert u de pagina opnieuw te laden om te zien of er meer beschikbaar zijn.

  4. Het is erg belangrijk om dit proces zo vaak mogelijk te herhalen om uw toepassing beter te begrijpen.

Veel plezier!

Uw voltooide geïntegreerde LUIS-toepassing

Gefeliciteerd, u hebt een mixed reality-app gebouwd die gebruikmaakt van de Azure Language Understanding Intelligence Service, om te begrijpen wat een gebruiker zegt en om te reageren op die informatie.

Labresultaat

Bonusoefeningen

Oefening 1

Tijdens het gebruik van deze toepassing ziet u mogelijk dat als u naar het object Floor staar en vraagt om de kleur ervan te wijzigen, dit gebeurt. Kunt u instellen hoe u kunt voorkomen dat uw toepassing de vloerkleur wijzigt?

Oefening 2

Probeer de luis- en app-mogelijkheden uit te breiden en voeg extra functionaliteit toe voor objecten in de scène; Maak bijvoorbeeld nieuwe objecten op het gaze-trefferpunt, afhankelijk van wat de gebruiker zegt, en kan deze objecten vervolgens naast de huidige scèneobjecten worden gebruikt met de bestaande opdrachten.