Sdílet prostřednictvím


HoloLens (1. generace) a Azure 303: Rozpoznávání přirozeného jazyka (LUIS)


Poznámka

Kurzy Mixed Reality Academy byly navrženy s ohledem na HoloLens (1. generace) a Mixed Reality Asistivní náhlavní soupravy. Proto se domníváme, že je důležité ponechat tyto kurzy pro vývojáře, kteří stále hledají pokyny k vývoji pro tato zařízení. Tyto kurzy nebudou aktualizovány nejnovějšími sadami nástrojů nebo interakcemi používanými pro HoloLens 2. Budou zachovány, aby mohly pokračovat v práci na podporovaných zařízeních. V budoucnu bude k dispozici nová série kurzů, které předvedou, jak vyvíjet pro HoloLens 2. Toto oznámení bude aktualizováno odkazem na tyto kurzy, jakmile budou publikovány.


V tomto kurzu se dozvíte, jak integrovat Language Understanding do aplikace hybridní reality pomocí služeb Azure Cognitive Services pomocí rozhraní API Language Understanding.

Výsledek testovacího prostředí

Language Understanding (LUIS) je služba Microsoft Azure, která poskytuje aplikacím schopnost vyjádřit význam ze vstupu uživatele, například extrahováním toho, co by osoba mohla chtít, jejich vlastními slovy. Toho se dosahuje prostřednictvím strojového učení, které rozumí vstupním informacím a učí se je a pak může odpovědět podrobnými a relevantními informacemi. Další informace najdete na stránce Azure Language Understanding (LUIS).

Po dokončení tohoto kurzu budete mít imerzivní aplikaci náhlavní soupravy pro hybridní realitu, která bude umět následující:

  1. Zachyťte vstup uživatele pomocí mikrofonu připojeného k imerzivní náhlavní soupravě.
  2. Zaznamenaný diktování odešlete do služby Azure Language Understanding Intelligent Service (LUIS).
  3. Nechte službu LUIS extrahovat význam z odesílaných informací, které budou analyzovány, a pokusí se určit záměr požadavku uživatele.

Vývoj bude zahrnovat vytvoření aplikace, ve které bude uživatel moct pomocí hlasu nebo pohledu změnit velikost a barvu objektů ve scéně. Použití ovladačů pohybu nebude pokryto.

Ve vaší aplikaci je na vás, jak do návrhu integrujete výsledky. Tento kurz je navržený tak, aby vás naučil integrovat službu Azure s projektem Unity. Vaším úkolem je využít znalosti, které z tohoto kurzu získáte, k vylepšení aplikace hybridní reality.

Buďte připraveni trénovat službu LUIS několikrát, což je popsáno v kapitole 12. Lepších výsledků dosáhnete, čím vícekrát bude služba LUIS natrénována.

Podpora zařízení

Kurz HoloLens Imerzivní náhlavní soupravy
MR a Azure 303: Rozpoznávání přirozeného jazyka (LUIS) ✔️ ✔️

Poznámka

I když se tento kurz primárně zaměřuje na Windows Mixed Reality imerzivní náhlavní soupravy (VR), můžete také použít to, co se v tomto kurzu naučíte, na Microsoft HoloLens. V průběhu kurzu uvidíte poznámky ke všem změnám, které budete muset použít k podpoře HoloLensu. Při používání HoloLensu si můžete všimnout určité ozvěny během zachytávání hlasu.

Požadavky

Poznámka

Tento kurz je určený pro vývojáře, kteří mají základní zkušenosti s Unity a C#. Mějte také na paměti, že požadavky a písemné pokyny v tomto dokumentu představují to, co bylo testováno a ověřeno v době psaní tohoto dokumentu (květen 2018). Můžete používat nejnovější software, jak je uvedeno v článku instalace nástrojů , i když by se nemělo předpokládat, že informace v tomto kurzu budou dokonale odpovídat tomu, co najdete v novějším softwaru, než je uvedeno níže.

Pro tento kurz doporučujeme následující hardware a software:

Než začnete

  1. Aby nedocházelo k problémům při sestavování tohoto projektu, důrazně doporučujeme vytvořit projekt uvedený v tomto kurzu v kořenové nebo téměř kořenové složce (dlouhé cesty ke složkám můžou způsobovat problémy v době sestavení).

  2. Pokud chcete svému počítači povolit diktování, přejděte na Nastavení > Windows Ochrana osobních údajů > Řeč, Rukopis & Psaní a stiskněte tlačítko Zapnout hlasové služby a návrhy psaní.

  3. Kód v tomto kurzu vám umožní nahrávat z výchozího mikrofonního zařízení nastaveného na vašem počítači. Ujistěte se, že je výchozí mikrofonní zařízení nastavené jako zařízení, které chcete použít k zachycení hlasu.

  4. Pokud má náhlavní souprava vestavěný mikrofon, ujistěte se, že je v nastavení portálu Mixed Reality zapnutá možnost "Když nosím náhlavní soupravu, přepněte na mikrofon náhlavní soupravy".

    Nastavení imerzivní náhlavní soupravy

Kapitola 1 – Nastavení webu Azure Portal

Pokud chcete používat službu Language Understanding v Azure, budete muset nakonfigurovat instanci služby tak, aby byla k dispozici vaší aplikaci.

  1. Přihlaste se k webu Azure Portal.

    Poznámka

    Pokud ještě účet Azure nemáte, budete si ho muset vytvořit. Pokud tento kurz sledujete v situaci ve třídě nebo v testovacím prostředí, požádejte o pomoc s nastavením nového účtu svého instruktora nebo některého z proktorů.

  2. Po přihlášení klikněte v levém horním rohu na Nový, vyhledejte Language Understanding a klikněte na Enter.

    Vytvoření prostředku LUIS

    Poznámka

    Slovo Nový mohlo být na novějších portálech nahrazeno slovem Vytvořit prostředek.

  3. Na nové stránce napravo najdete popis služby Language Understanding. V levém dolním rohu této stránky vyberte tlačítko Vytvořit a vytvořte instanci této služby.

    Vytvoření služby LUIS – právní upozornění

  4. Po kliknutí na Vytvořit:

    1. Vložte požadovaný název pro tuto instanci služby.

    2. Vyberte předplatné.

    3. Vyberte cenovou úroveň , která je pro vás vhodná. Pokud vytváříte službu LUIS poprvé, měla by vám být k dispozici bezplatná úroveň (s názvem F0). Bezplatné přidělení by pro tento kurz mělo více než stačit.

    4. Zvolte skupinu prostředků nebo vytvořte novou. Skupina prostředků poskytuje způsob, jak monitorovat, řídit přístup, zřizovat a spravovat fakturaci kolekce prostředků Azure. Doporučujeme ponechat všechny služby Azure přidružené k jednomu projektu (např. tyto kurzy) ve společné skupině prostředků.

      Pokud si chcete přečíst další informace o skupinách prostředků Azure, navštivte prosím článek o skupinách prostředků.

    5. Určete umístění vaší skupiny prostředků (pokud vytváříte novou skupinu prostředků). Umístění by v ideálním případě bylo v oblasti, kde by aplikace běžela. Některé prostředky Azure jsou dostupné jenom v určitých oblastech.

    6. Budete také muset potvrdit, že rozumíte podmínkám a ujednáním, které se na tuto službu vztahují.

    7. Vyberte Vytvořit.

      Vytvoření služby LUIS – uživatelský vstup

  5. Po kliknutí na Vytvořit budete muset počkat na vytvoření služby, což může chvíli trvat.

  6. Po vytvoření instance služby se na portálu zobrazí oznámení.

    Obrázek nového oznámení Azure

  7. Kliknutím na oznámení prozkoumejte novou instanci služby.

    Oznámení o úspěšném vytvoření prostředku

  8. Kliknutím na tlačítko Přejít k prostředku v oznámení prozkoumejte novou instanci služby. Budete přesměrováni do nové instance služby LUIS.

    Přístup ke klíčům LUIS

  9. V rámci tohoto kurzu bude vaše aplikace muset volat do vaší služby, což se provádí pomocí klíče předplatného vaší služby.

  10. Na stránce Rychlý start služby LUIS API přejděte k prvnímu kroku Chytit klíče a klikněte na Klíče (můžete toho dosáhnout také tak, že kliknete na modrý hypertextový odkaz Klíče, který se nachází v navigační nabídce služeb a který je označen ikonou klíče). Tím se odhalí vaše klíče služby.

  11. Pořiďte si kopii jednoho ze zobrazených klíčů, protože ho budete potřebovat později v projektu.

  12. Na stránce Služba klikněte na Language Understanding Portal a přesměrujte se na webovou stránku, kterou použijete k vytvoření nové služby v aplikaci LUIS.

Kapitola 2 – Portál Language Understanding

V této části se dozvíte, jak vytvořit aplikaci LUIS na portálu LUIS.

Důležité

Mějte na paměti, že nastavení entit, záměrů a promluv v rámci této kapitoly je pouze prvním krokem při vytváření služby LUIS: budete také muset službu několikrát znovu vytrénovat , aby byla přesnější. Přetrénování služby je popsáno v poslední kapitole tohoto kurzu, takže se ujistěte, že jste ji dokončili.

  1. Po dosažení portálu Language Understanding se možná budete muset přihlásit pomocí stejných přihlašovacích údajů, jako máte Azure Portal.

    Přihlašovací stránka služby LUIS

  2. Pokud službu LUIS používáte poprvé, budete se muset posunout dolů do dolní části úvodní stránky, abyste našli tlačítko Vytvořit aplikaci LUIS a klikněte na něm.

    Stránka Vytvoření aplikace LUIS

  3. Po přihlášení klikněte na Moje aplikace (pokud v této části momentálně nejste). Potom můžete kliknout na Vytvořit novou aplikaci.

    LUIS – obrázek mých aplikací

  4. Pojmenujte aplikaci.

  5. Pokud má vaše aplikace rozumět jinému jazyku než angličtina, měli byste jazykovou verzi změnit na příslušný jazyk.

  6. Tady můžete také přidat popis nové aplikace LUIS.

    LUIS – vytvoření nové aplikace

  7. Po stisknutí tlačítka Hotovo přejdete na stránku Sestavení nové aplikace LUIS .

  8. Existuje několik důležitých konceptů, které je potřeba pochopit:

    • Intent představuje metodu, která bude volána po dotazu od uživatele. ZÁMĚR může mít jednu nebo více ENTIT.
    • Entita je komponenta dotazu, která popisuje informace relevantní pro ZÁMĚR.
    • Promluvy jsou příklady dotazů poskytovaných vývojářem, které služba LUIS použije k trénování.

Pokud tyto koncepty nejsou zcela jasné, nemusíte se obávat, protože tento kurz je dále objasní v této kapitole.

Začnete vytvořením entit potřebných k sestavení tohoto kurzu.

  1. Na levé straně stránky klikněte na Entity a pak klikněte na Vytvořit novou entitu.

    Vytvoření nové entity

  2. Zavolejte novou barvu entity, nastavte její typ na Jednoduchý a pak stiskněte Hotovo.

    Vytvoření jednoduché entity – barva

  3. Opakováním tohoto postupu vytvořte tři (3) další jednoduché entity s názvem:

    • Přenesení
    • Zmenšit
    • Cíl

Výsledek by měl vypadat jako na následujícím obrázku:

Výsledek vytvoření entity

V tomto okamžiku můžete začít vytvářet záměry.

Upozornění

Neodstraňovat záměr Žádné .

  1. Na levé straně stránky klikněte na Intents (Záměry) a pak klikněte na Create new intent (Vytvořit nový záměr).

    Vytvoření nových záměrů

  2. Zavolejte nový záměrChangeObjectColor.

    Důležité

    Tento název záměru se použije v kódu později v tomto kurzu, takže pokud chcete dosáhnout nejlepších výsledků, použijte tento název přesně tak, jak je uvedeno.

Po potvrzení názvu budete přesměrováni na stránku Záměry.

LUIS – stránka záměrů

Všimněte si, že existuje textové pole s výzvou k zadání 5 nebo více různých promluv.

Poznámka

Luis převede všechny promluvy na malá písmena.

  1. Do horního textového pole vložte následující promluvu (aktuálně s textem Type asi 5 příkladů... ) a stiskněte Enter:
The color of the cylinder must be red

Všimněte si, že se nová promluva zobrazí v seznamu dole.

Podle stejného postupu vložte následujících šest (6) promluv:

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

Pro každou promluvu, kterou jste vytvořili, musíte určit, která slova má služba LUIS používat jako entity. V tomto příkladu musíte všechny barvy označit jako barevnou entitu a všechny možné odkazy na cíl jako cílovou entitu.

  1. Uděláte to tak, že v první promluvě kliknete na slovo válec a vyberete cíl.

    Identifikace cílů promluv

  2. Teď klikněte na slovo červené v první promluvě a vyberte barvu.

    Identifikace entit promluvy

  3. Označte také další řádek, kde datová krychle by měla být cílem a černá by měla být barva. Všimněte si také použití slov "this", "it" a "this object", které poskytujeme, aby byly dostupné také nespecifická cílová typy.

  4. Opakujte výše uvedený postup, dokud nebudou mít všechny promluvy označené entitami. Pokud potřebujete pomoct, podívejte se na následující obrázek.

    Tip

    Při výběru slov, která chcete označit jako entity:

    • Pokud chcete jednotlivá slova, stačí na ně kliknout.
    • Pokud chcete získat sadu dvou nebo více slov, klikněte na začátek a potom na konec sady.

    Poznámka

    Pomocí přepínacího tlačítka Zobrazení tokenů můžete přepínat mezi zobrazením entit nebo tokenů.

  5. Výsledky by měly být vidět na následujících obrázcích s zobrazením Entit / tokenů:

    Tokeny & zobrazení entit

  6. V tomto okamžiku stiskněte tlačítko Trénovat v pravém horním rohu stránky a počkejte, až se malý kruhový indikátor na něm změní na zelenou. To znamená, že služba LUIS byla úspěšně vytrénována tak, aby tento záměr rozpoznala.

    Trénovat službu LUIS

  7. Jako cvičení pro vás vytvořte nový záměr s názvem ChangeObjectSize pomocí cílů Entity, upsize a downsize.

  8. Podle stejného postupu jako u předchozího záměru vložte následujících osm (8) promluv pro změnu velikosti :

    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. Výsledek by měl vypadat jako na následujícím obrázku:

    Nastavení tokenů a entit ChangeObjectSize

  10. Po vytvoření a trénování obou objektů Intents, ChangeObjectColor a ChangeObjectSize klikněte na tlačítko PUBLISH ( PUBLIKOVAT ) v horní části stránky.

    Publikování služby LUIS

  11. Na stránce Publikovat dokončíte a publikujete aplikaci LUIS, aby k ní měl přístup váš kód.

    1. Nastavte rozevírací seznam Publikovat do jako produkční.

    2. Nastavte časové pásmo na vaše časové pásmo.

    3. Zaškrtněte políčko Zahrnout všechna předpovězená skóre záměru.

    4. Klikněte na Publikovat do produkčního slotu.

      Nastavení publikování

  12. V části Prostředky a klíče:

    1. Na webu Azure Portal vyberte oblast, kterou jste nastavili pro instanci služby.
    2. Níže si všimnete prvku Starter_Key , ignorujte ho.
    3. Klikněte na Přidat klíč a vložte klíč , který jste získali na webu Azure Portal při vytváření instance služby. Pokud jsou vaše služba Azure a portál LUIS přihlášené ke stejnému uživateli, zobrazí se rozevírací nabídky s názvem tenanta, názvem předplatného a klíčem , který chcete použít (budou mít stejný název, jaký jste zadali dříve na webu Azure Portal.

    Důležité

    Pod koncovým bodem si pořiďte kopii koncového bodu odpovídající klíči, který jste vložili, a brzy ho použijete v kódu.

Kapitola 3 – Nastavení projektu Unity

Následující příklad je typickým nastavením pro vývoj s hybridní realitou a jako takový je dobrou šablonou pro jiné projekty.

  1. Otevřete Unity a klikněte na Nový.

    Spusťte nový projekt Unity.

  2. Teď budete muset zadat název projektu Unity, vložit MR_LUIS. Ujistěte se, že je typ projektu nastavený na 3D. Nastavte umístění na místo, které je pro vás vhodné (nezapomeňte, že lepší je blíž ke kořenovým adresářům). Pak klikněte na Vytvořit projekt.

    Zadejte podrobnosti o novém projektu Unity.

  3. Když je Unity otevřená, stojí za to zkontrolovat, jestli je výchozí Editor skriptů nastavený na Visual Studio. Přejděte na Upravit > předvolby a v novém okně přejděte na Externí nástroje. Změňte Editor externích skriptů na Visual Studio 2017. Zavřete okno Předvolby .

    Aktualizujte předvolbu editoru skriptů.

  4. Pak přejděte na Nastavení sestavení souboru > a kliknutím na tlačítko Přepnout platformu přepněte na Univerzální platforma Windows.

    Okno Nastavení sestavení, přepněte platformu na UPW.

  5. Přejděte na Nastavení sestavení souboru > a ujistěte se, že:

    1. Cílové zařízení je nastavené na Všechna zařízení.

      Pro Microsoft HoloLens nastavte Cílové zařízení na HoloLens.

    2. Typ sestavení je nastavený na D3D.

    3. Sada SDK je nastavená na nejnovější nainstalovanou verzi.

    4. Verze sady Visual Studio je nastavená na nejnovější nainstalovanou verzi

    5. Sestavení a spuštění je nastavené na místní počítač.

    6. Uložte scénu a přidejte ji do sestavení.

      1. Uděláte to tak, že vyberete Přidat otevřené scény. Zobrazí se okno pro uložení.

        Klikněte na tlačítko Přidat otevřené scény.

      2. Vytvořte novou složku pro tuto a jakoukoli budoucí scénu a pak vyberte tlačítko Nová složka a vytvořte novou složku s názvem Scény.

        Vytvořit novou složku scripts

      3. Otevřete nově vytvořenou složku Scény , do textového pole Název souboru: zadejte MR_LuisScene a stiskněte Uložit.

        Pojmenujte novou scénu.

    7. Zbývající nastavení v nastavení sestavení by prozatím měla zůstat ve výchozím nastavení.

  6. V okně Build Settings (Nastavení sestavení ) klikněte na tlačítko Player Settings (Nastavení přehrávače ). Tím se otevře související panel v prostoru, kde se inspektor nachází.

    Otevřete nastavení přehrávače.

  7. Na tomto panelu je potřeba ověřit několik nastavení:

    1. Na kartě Další nastavení :

      1. Verze modulu runtime skriptování by měla být stabilní (ekvivalentní verze .NET 3.5).

      2. Skriptovací back-end by měl být .NET.

      3. Úroveň kompatibility rozhraní API by měla být .NET 4.6.

        Aktualizujte další nastavení.

    2. Na kartě Nastavení publikování v části Schopnosti zaškrtněte:

      1. InternetClient

      2. Mikrofon

        Aktualizuje se nastavení publikování.

    3. Dále na panelu v Nastavení XR (najdete pod nastavením publikování) zaškrtněte možnost Virtuální realita podporována a ujistěte se, že je přidaná sada SDK Windows Mixed Reality.

      Aktualizujte nastavení X R.

  8. Zpět v nastavení sestaveníProjekty Unity C# už nejsou neaktivní; zaškrtněte políčko vedle této položky.

  9. Zavřete okno Nastavení sestavení.

  10. Uložte scénu a projekt (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Kapitola 4 – Vytvoření scény

Důležité

Pokud chcete v tomto kurzu přeskočit komponentu Unity Set up a pokračovat přímo do kódu, můžete si stáhnout tento soubor .unitypackage, naimportovat ho do projektu jako vlastní balíček a pak pokračovat od Kapitoly 5.

  1. Klikněte pravým tlačítkem do prázdné oblasti panelu hierarchie a v části 3D objekt přidejte rovinu.

    Vytvořte rovinu.

  2. Mějte na paměti, že když znovu kliknete pravým tlačítkem myši na hierarchii a vytvoříte další objekty, pokud máte stále vybraný poslední objekt, bude vybraný objekt nadřazeným objektem nového objektu. Vyhněte se kliknutí levým tlačítkem na prázdné místo v hierarchii a následnému kliknutí pravým tlačítkem.

  3. Opakováním výše uvedeného postupu přidejte následující objekty:

    1. Sphere
    2. Válce
    3. Datová krychle
    4. 3D text
  4. Výsledná scéna Hierarchy by měla vypadat jako na následujícím obrázku:

    Nastavení hierarchie scén.

  5. Klikněte levým tlačítkem na hlavní kameru ji vyberte, podívejte se na panel inspektoru uvidíte objekt Kamera se všemi jeho součástmi.

  6. Klikněte na tlačítko Přidat komponentu umístěné v dolní části panelu inspektorů.

    Přidat zdroj zvuku

  7. Vyhledejte komponentu s názvem Zdroj zvuku, jak je znázorněno výše.

  8. Ujistěte se také, že je komponenta Transform hlavní kamery nastavená na hodnotu (0,0,0). Můžete to provést stisknutím ikony ozubeného kola vedle komponenty Transform (Transformace fotoaparátu) a výběrem možnosti Resetovat. Komponenta Transformace by pak měla vypadat takto:

    1. Pozice je nastavená na 0, 0, 0.
    2. Otočení je nastaveno na 0, 0, 0.

    Poznámka

    U Microsoft HoloLens budete také muset změnit následující položky, které jsou součástí komponenty Kamera, která je v hlavní kameře:

    • Vymazat příznaky: Plná barva.
    • Pozadí "Černá, alfa 0" – šestnáctková barva: #00000000.
  9. Klikněte levým tlačítkem na Rovinu a vyberte ji. Na panelu inspektorů nastavte komponentu Transform s následujícími hodnotami:

    Osa X Osa Y Osa Z
    0 -1 0
  10. Klikněte levým tlačítkem na kouli , abyste ji vybrali. Na panelu inspektorů nastavte komponentu Transform s následujícími hodnotami:

    Osa X Osa Y Osa Z
    2 1 2
  11. Klikněte levým tlačítkem na cylindr a vyberte ho. Na panelu inspektorů nastavte komponentu Transform s následujícími hodnotami:

    Osa X Osa Y Osa Z
    -2 1 2
  12. Kliknutím levým tlačítkem na datová krychle ji vyberte. Na panelu inspektorů nastavte komponentu Transform s následujícími hodnotami:

Transformace – pozice

X Y Z
0 1 4

Transformace – otočení

X Y Z
45 45 0
  1. Klikněte levým tlačítkem na objekt New Text a vyberte ho. Na panelu inspektorů nastavte komponentu Transform s následujícími hodnotami:

Transformace – pozice

X Y Z
-2 6 9

Transformace – škálování

X Y Z
0.1 0.1 0.1
  1. Změňte Velikost písma v komponentě Text Mesh na 50.

  2. Změňte název objektu Textové sítě na Text diktování.

    Vytvoření objektu 3D textu

  3. Struktura hierarchických panelů by teď měla vypadat takto:

    text mesh in scene view

  4. Závěrečná scéna by měla vypadat jako na následujícím obrázku:

    Zobrazení scény.

Kapitola 5 – Vytvoření třídy MicrophoneManager

První skript, který vytvoříte, je třída MicrophoneManager . Potom vytvoříte LuisManager, třídu Behaviors a nakonec třídu Gaze (nebojte se vytvořit všechny tyto položky, i když budou pokryty, až se dostanete ke každé kapitole).

Třída MicrophoneManager zodpovídá za:

  • Zjištění záznamového zařízení připojeného k náhlavní soupravě nebo zařízení (podle toho, které nastavení je výchozí).
  • Zachyťte zvuk (hlas) a pomocí diktování ho uložte jako řetězec.
  • Jakmile se hlas pozastaví, odešlete diktování do třídy LuisManager .

Vytvoření této třídy:

  1. Klikněte pravým tlačítkem myši na panel Projekt, Vytvořit > složku. Volejte složku Scripts.

    Vytvořit složku Scripts

  2. Poklikáním na vytvořenou složku Scripts otevřete. Potom v této složce klikněte pravým tlačítkem na Vytvořit > skript C#. Pojmenujte skript MicrophoneManager.

  3. Poklikáním na MicrophoneManager ho otevřete v sadě Visual Studio.

  4. Na začátek souboru přidejte následující obory názvů:

        using UnityEngine;
        using UnityEngine.Windows.Speech;
    
  5. Pak do třídy MicrophoneManager přidejte následující proměnné:

        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. Teď je potřeba přidat kód pro metody Awake() a Start(). Budou volána při inicializaci třídy:

        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. Teď potřebujete metodu, kterou aplikace používá ke spuštění a zastavení záznamu hlasu a předání do třídy LuisManager , kterou brzy vytvoříte.

        /// <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. Přidejte obslužnou rutinu diktování , která se vyvolá, když se hlas pozastaví. Tato metoda předá text diktování do třídy 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);
        }
    

    Důležité

    Odstraňte metodu Update(), protože tato třída ji nebude používat.

  9. Před návratem do Unity nezapomeňte uložit změny v sadě Visual Studio.

    Poznámka

    V tomto okamžiku se na panelu konzoly Unity Editoru zobrazí chyba. Je to proto, že kód odkazuje na třídu LuisManager , kterou vytvoříte v další kapitole.

Kapitola 6 – Vytvoření třídy LUISManager

Je čas vytvořit třídu LuisManager , která provede volání služby Azure LUIS.

Účelem této třídy je přijmout text diktování z třídy MicrophoneManager a odeslat ho do rozhraní Api azure Language Understanding k analýze.

Tato třída deserializuje odpověď JSON a zavolá příslušné metody třídy Behaviors k aktivaci akce.

Vytvoření této třídy:

  1. Poklikáním na složku Scripts ji otevřete.

  2. Klikněte pravým tlačítkem do složky Scripts (Skripty ) a klikněte na Create C# Script (Vytvořit > skript jazyka C#). Pojmenujte skript LuisManager.

  3. Poklikáním na skript ho otevřete v sadě Visual Studio.

  4. Na začátek souboru přidejte následující obory názvů:

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Začnete vytvořením tří tříd uvnitř třídy LuisManager (ve stejném souboru skriptu nad metodou Start(), které budou představovat deserializovanou odpověď JSON z 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. Dále do třídy LuisManager přidejte následující proměnné:

        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. Nezapomeňte teď umístit koncový bod služby LUIS (který budete mít na portálu LUIS).

  8. Teď je potřeba přidat kód metody Awake(). Tato metoda bude volána, když třída inicializuje:

        private void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  9. Nyní potřebujete metody, které tato aplikace používá k odeslání diktování přijaté z MicrophoneManager třídy luis a poté přijmout a deserializovat odpověď.

  10. Jakmile se určí hodnota Intent a přidružených entit, předají se instanci třídy Behaviors , aby se aktivovala zamýšlená akce.

        /// <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. Vytvořte novou metodu s názvem AnalyzeResponseElements(), která přečte výslednou metodu AnalyzeQuery a určí entity. Jakmile jsou tyto entity určeny, předají se instanci třídy Behaviors , která se použije v akcích.

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

    Důležité

    Odstraňte metody Start() a Update(), protože tato třída je nebude používat.

  12. Před návratem do Unity nezapomeňte uložit změny v sadě Visual Studio.

Poznámka

V tomto okamžiku se na panelu konzoly Unity Editoru zobrazí několik chyb. Je to proto, že kód odkazuje na třídu Behaviors , kterou vytvoříte v další kapitole.

Kapitola 7 – Vytvoření třídy Behaviors

Třída Behaviors aktivuje akce pomocí entit poskytovaných třídou LuisManager .

Vytvoření této třídy:

  1. Poklikáním na složku Scripts ji otevřete.

  2. Klikněte pravým tlačítkem do složky Scripts (Skripty ) a klikněte na Create C# Script (Vytvořit > skript jazyka C#). Skript pojmenujte Behaviors.

  3. Poklikáním na skript ho otevřete v sadě Visual Studio.

  4. Pak do třídy Behaviors přidejte následující proměnné:

        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. Přidejte kód metody Awake(). Tato metoda bude volána, když třída inicializuje:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. Následující metody jsou volána třídou LuisManager (kterou jste vytvořili dříve) k určení objektu, který je cílem dotazu, a poté aktivovat příslušnou akci.

        /// <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. Přidejte metodu FindTarget() a určete, která z objektů GameObjects je cílem aktuálního záměru. Tato metoda nastaví výchozí cíl GameObject "pohledu", pokud není definován žádný explicitní cíl v Entities.

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

    Důležité

    Odstraňte metody Start() a Update(), protože tato třída je nebude používat.

  8. Před návratem do Unity nezapomeňte uložit změny v sadě Visual Studio.

Kapitola 8 – Vytvoření třídy Gaze

Poslední třídou, kterou budete potřebovat k dokončení této aplikace, je třída Gaze . Tato třída aktualizuje odkaz na GameObject , který je aktuálně ve vizuálním fokusu uživatele.

Vytvoření této třídy:

  1. Poklikáním na složku Scripts ji otevřete.

  2. Klikněte pravým tlačítkem do složky Scripts (Skripty ) a klikněte na Create C# Script (Vytvořit > skript jazyka C#). Pojmenujte skript Gaze.

  3. Poklikáním na skript ho otevřete v sadě Visual Studio.

  4. Vložte následující kód pro tuto třídu:

        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. Před návratem do Unity nezapomeňte uložit změny v sadě Visual Studio.

Kapitola 9 – Dokončení nastavení scény

  1. Chcete-li dokončit nastavení scény, přetáhněte každý skript, který jste vytvořili ze složky Scripts, do objektu Hlavní kamera na panelu hierarchie.

  2. Vyberte hlavní kameru a podívejte se na panel inspektoru. Měli byste vidět každý skript, který jste připojili, a uvidíte, že u každého skriptu jsou parametry, které ještě nejsou nastavené.

    Nastavení referenčních cílů kamery.

  3. Pokud chcete tyto parametry správně nastavit, postupujte podle těchto pokynů:

    1. MicrophoneManager:

      • Z panelu hierarchie přetáhněte objekt Text diktování do pole Hodnota parametru Diktování Text .
    2. Chování z panelu hierarchie:

      • Přetáhněte objekt Sphere do pole Cíl odkazu Sphere .
      • Přetáhněte válec do pole Referenční cíl válce .
      • Přetáhněte datovou krychli do pole referenčního cíle datové krychle .
    3. Pohled:

      • Nastavte maximální vzdálenost pohledu na 300 (pokud ještě není).
  4. Výsledek by měl vypadat jako na následujícím obrázku:

    Zobrazuje se teď nastavené referenční cíle kamery.

Kapitola 10 – Testování v editoru Unity

Otestujte, že je správně implementováno nastavení scény.

Zajistěte následující:

  • Všechny skripty jsou připojeny k objektu Hlavní kamera .
  • Všechna pole na hlavním panelu kontroly kamery jsou správně přiřazená.
  1. Stiskněte tlačítko Přehrát v Editoru Unity. Aplikace by měla běžet v připojené imerzivní náhlavní soupravě.

  2. Vyzkoušejte několik promluv, například:

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

    Poznámka

    Pokud se v konzole Unity zobrazí chyba týkající se změny výchozího zvukového zařízení, scéna nemusí fungovat podle očekávání. Důvodem je způsob, jakým portál hybridní reality pracuje s integrovanými mikrofony pro náhlavní soupravy, které je mají. Pokud se zobrazí tato chyba, jednoduše zastavte scénu a spusťte ji znovu a vše by mělo fungovat podle očekávání.

Kapitola 11 – Sestavení a zkušební načtení řešení PRO UPW

Jakmile zajistíte, že aplikace funguje v Editoru Unity, jste připraveni k sestavení a nasazení.

Sestavení:

  1. Kliknutím na Uložit soubor >uložte aktuální scénu.

  2. Přejděte na Nastavení sestavení souboru>.

  3. Zaškrtněte políčko Projekty Unity C# (užitečné pro zobrazení a ladění kódu po vytvoření projektu UPW.

  4. Klikněte na Add Open Scenes (Přidat otevřené scény) a pak klikněte na Build (Sestavit).

    Okno Nastavení sestavení

  5. Zobrazí se výzva k výběru složky, ve které chcete vytvořit řešení.

  6. Vytvořte složku BUILDS a v této složce vytvořte další složku s odpovídajícím názvem podle vašeho výběru.

  7. Kliknutím na Vybrat složku spusťte sestavení v daném umístění.

    Vytvořit složku Builds (Vytvořit buildy)Vyberte složku Builds (Sestavení)

  8. Jakmile Unity dokončí sestavení (může to nějakou dobu trvat), mělo by se v umístění vašeho buildu otevřít okno Průzkumník souborů.

Nasazení na místním počítači:

  1. V sadě Visual Studio otevřete soubor řešení, který byl vytvořen v předchozí kapitole.

  2. Na platformě řešení vyberte x86, Místní počítač.

  3. V části Konfigurace řešení vyberte Ladit.

    Pro Microsoft HoloLens může být jednodušší nastavit tuto možnost na Vzdálený počítač, abyste nebyli připojení k počítači. Budete ale muset také provést následující akce:

    • Znát IP adresu vašeho HoloLensu, kterou najdete v nastavení > sítě & internetu > Wi-Fi > Upřesnit možnosti. IPv4 je adresa, kterou byste měli použít.
    • Ujistěte se, že vývojářský režim je Zapnuto; najdete v části Aktualizace nastavení > & zabezpečení > pro vývojáře.

    Nasazení aplikace

  4. Přejděte do nabídky Sestavení a kliknutím na Nasadit řešení načtěte aplikaci do počítače bokem.

  5. Vaše aplikace by se teď měla zobrazit v seznamu nainstalovaných aplikací a měla by být připravená ke spuštění.

  6. Po spuštění vás aplikace vyzve k autorizaci přístupu k mikrofonu. Pomocí ovladačů pohybu, hlasového vstupu nebo klávesnice stiskněte tlačítko ANO .

Kapitola 12 – Vylepšení služby LUIS

Důležité

Tato kapitola je neuvěřitelně důležitá a může být potřeba ji několikrát opakovat, protože vám pomůže zlepšit přesnost vaší služby LUIS: ujistěte se, že ji dokončíte.

Pokud chcete zlepšit úroveň porozumění poskytované službou LUIS, musíte zaznamenávat nové promluvy a používat je k opětovnému trénování aplikace LUIS.

Například jste službu LUIS vytrénovali, aby rozuměla slovům "Zvětšení" a "Upsize", ale nechcete, aby vaše aplikace také rozuměla slovům jako "Zvětšit"?

Jakmile aplikaci několikrát použijete, všechno, co jste řekli, bude shromažďováno službou LUIS a dostupné na portálu LUIS.

  1. Přejděte do portálové aplikace pomocí tohoto ODKAZU a přihlaste se.

  2. Po přihlášení pomocí přihlašovacích údajů MS klikněte na název aplikace.

  3. Klikněte na tlačítko Zkontrolovat promluvy koncového bodu na levé straně stránky.

    Kontrola promluv

  4. Zobrazí se seznam promluv, které vaše aplikace hybridní reality odeslala službě LUIS.

    Seznam promluv

Všimněte si některých zvýrazněných entit.

Když najedete myší na každé zvýrazněné slovo, můžete zkontrolovat jednotlivé promluvy a určit, která entita byla rozpoznána správně, které entity jsou nesprávné a které entity se zmeškaly.

Ve výše uvedeném příkladu bylo zjištěno, že slovo "kopí" bylo zvýrazněno jako cíl, takže je nutné chybu opravit, což se provede tak, že na toto slovo najedete myší a kliknete na Odebrat popisek.

Kontrola promluvOdebrání obrázku popisku

  1. Pokud najdete úplně chybné promluvy, můžete je odstranit pomocí tlačítka Odstranit na pravé straně obrazovky.

    Odstranění nesprávných promluv

  2. Nebo pokud máte pocit, že služba LUIS interpretovala promluvu správně, můžete její pochopení ověřit pomocí tlačítka Přidat do zarovnaného záměru .

    Přidat do zarovnaného záměru

  3. Jakmile seřadíte všechny zobrazené promluvy, zkuste stránku znovu načíst, abyste zjistili, jestli jsou k dispozici další.

  4. Je velmi důležité tento proces opakovat co nejvícekrát, abyste zlepšili porozumění aplikacím.

Bav se!

Dokončená integrovaná aplikace LUIS

Blahopřejeme, vytvořili jste aplikaci pro hybridní realitu, která využívá službu Azure Language Understanding Intelligence Service, abyste pochopili, co uživatel říká, a na základě této informace reagovali.

Výsledek testovacího prostředí

Bonusová cvičení

Cvičení 1

Při používání této aplikace si můžete všimnout, že pokud se podíváte na objekt Floor a požádáte o změnu jeho barvy, udělá to. Můžete zjistit, jak aplikaci zabránit ve změně barvy podlahy?

Cvičení 2

Zkuste rozšířit funkce LUIS a Aplikace a přidat další funkce pro objekty ve scéně. Můžete například vytvořit nové objekty v bodě přístupu Gaze v závislosti na tom, co uživatel řekne, a pak můžete tyto objekty používat společně s objekty aktuální scény s existujícími příkazy.