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 HoloLensem (1. generace) a imerzivními náhlavními soupravami hybridní reality. Proto máme pocit, že je důležité nechat tyto kurzy zavedené pro vývojáře, kteří stále hledají pokyny při vývoji těchto zařízení. Tyto kurzy nebudou aktualizovány nejnovějšími sadami nástrojů ani interakcemi používanými pro HoloLens 2. Budou zachovány, aby pokračovaly v práci na podporovaných zařízeních. Bude k dispozici nová série kurzů, které budou publikovány v budoucnu, které předvádějí, jak vyvíjet pro HoloLens 2. Toto oznámení se při publikování aktualizuje odkazem na tyto kurzy.


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

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 může osoba chtít, ve vlastních slovech. Toho se dosahuje prostřednictvím strojového učení, které rozumí vstupním informacím a učí je, a pak může odpovídat s podrobnými, relevantními informacemi. Další informace najdete na stránce Azure Language Understanding (LUIS).

Po dokončení tohoto kurzu budete mít aplikaci pro imerzivní náhlavní soupravu hybridní reality, která bude schopná provést následující akce:

  1. Zachyťte řeč vstupu uživatele pomocí mikrofonu připojeného k imerzivní náhlavní soupravě.
  2. Odešle zachycené diktování službě Azure Language Understanding Intelligent Service (LUIS).
  3. Vyextrahujte ze služby LUIS význam odesílaných informací, které se budou analyzovat, a pokuste se určit záměr požadavku uživatele.

Vývoj bude zahrnovat vytvoření aplikace, ve které bude moct uživatel používat hlas nebo pohled na změnu velikosti a barvy objektů ve scéně. Použití ovladačů pohybu nebude pokryto.

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

Připravte se na trénovat službu LUIS několikrát, která je popsána v kapitole 12. Lepších výsledků dosáhnete tím, kolikrát byla služba LUIS natrénována.

Podpora zařízení

Kurz HoloLens Imerzivní náhlavní soupravy
MR a Azure 303: Luis (Natural Language Understanding) ✔️ ✔️

Poznámka:

I když se tento kurz primárně zaměřuje na imerzivní náhlavní soupravy Windows Mixed Reality (VR), můžete také použít to, co se v tomto kurzu naučíte, na Microsoft HoloLens. Při sledování kurzu uvidíte poznámky o všech změnách, které možná budete potřebovat k podpoře HoloLensu. Při použití HoloLensu si můžete během hlasového zachycení všimnout určité ozvěny.

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 otestováno a ověřeno v době psaní (květen 2018). Můžete používat nejnovější software, jak je uvedeno v článku o instalaci 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. Abyste se vyhnuli 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 počítači povolit diktování, přejděte do nastavení Windows Privacy > Speech, rukopis a psaní a stiskněte tlačítko Zapnout hlasové služby a psát návrhy>.

  3. Kód v tomto kurzu vám umožní zaznamená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á vaše náhlavní souprava vestavěný mikrofon, ujistěte se, že je v nastavení portálu hybridní reality zapnutá možnost "Když nosím náhlavní soupravu, přepnout na mikrofon".

    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, aby byla pro vaši aplikaci dostupná.

  1. Přihlaste se k webu Azure Portal.

    Poznámka:

    Pokud ještě nemáte účet Azure, budete ho muset vytvořit. Pokud tento kurz sledujete v situaci v učebně nebo testovacím prostředí, požádejte svého instruktora nebo některého z proktorů, aby vám pomohli nastavit nový účet.

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

    Vytvoření prostředku LUIS

    Poznámka:

    Slovo Nový mohlo být nahrazeno vytvořením prostředku na novějších portálech.

  3. Nová stránka vpravo poskytne 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í oznámení

  4. Po kliknutí na Vytvořit:

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

    2. Vyberte nějaké předplatné.

    3. Vyberte cenovou úroveň, která je pro vás vhodná, pokud se jedná o první vytvoření služby LUIS, měla by vám být dostupná bezplatná úroveň (s názvem F0). Bezplatné přidělení by pro tento kurz mělo být více než dostatečné.

    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 pro kolekci prostředků Azure. Doporučujeme zachovat všechny služby Azure přidružené k jednomu projektu (např. tyto kurzy) v rámci společné skupiny prostředků).

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

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

    6. Budete také muset potvrdit, že jste porozuměli podmínkám a ujednáním použitým pro tuto službu.

    7. Vyberte Vytvořit.

      Vytvoření služby LUIS – vstup uživatele

  5. Jakmile kliknete na Vytvořit, budete muset počkat, až se služba vytvoří, může to 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í můžete prozkoumat 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í můžete prozkoumat novou instanci služby. Přejdete do nové instance služby LUIS.

    Přístup ke klíčům LUIS

  9. V tomto kurzu bude vaše aplikace muset volat vaši službu, která se provádí pomocí klíče předplatného vaší služby.

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

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

  12. Na stránce Služby klikněte na portál Language Understanding, který se má přesměrovat na webovou stránku, kterou použijete k vytvoření nové služby v rámci aplikace 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 jediným 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řeučování služby je popsáno v poslední kapitole tohoto kurzu, takže se ujistěte, že ji dokončíte.

  1. Když se dostanete na portál Language Understanding, možná se budete muset přihlásit, pokud ještě nejste, se stejnými přihlašovacími údaji jako na webu Azure Portal.

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

  2. Pokud službu LUIS používáte poprvé, budete se muset posunout dolů na úvodní stránku a najít a kliknout na tlačítko Vytvořit aplikaci LUIS.

    Stránka vytvoření aplikace LUIS

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

    LUIS – image mých aplikací

  4. Pojmenujte aplikaci.

  5. Pokud má vaše aplikace rozumět jazyku, který se liší od angličtiny, měli byste změnit jazykovou verzi na příslušný jazyk.

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

    LUIS – vytvoření nové aplikace

  7. Jakmile stisknete hotovo, zadáte stránku Sestavení nové aplikace LUIS .

  8. Tady je několik důležitých konceptů:

    • Záměr představuje metodu, která bude volána za dotazem od uživatele. ZÁMĚR může mít jednu nebo více ENTIT.
    • Entita je součástí 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 dokonale jasné, nedělejte si starosti, protože tento kurz je dále v této kapitole objasní.

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 stiskněte Hotovo.

    Vytvoření jednoduché entity – barva

  3. Opakováním tohoto procesu vytvořte tři (3) více jednoduchých entit 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 tuto chvíli můžete začít vytvářet záměry.

Upozorňující

Neodstraňovat záměr None (Žádný).

  1. Na levé straně stránky klikněte na Záměry a potom klikněte na Vytvořit nový záměr.

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

  2. Volejte nový záměr ChangeObjectColor.

    Důležité

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

Jakmile potvrdíte název, 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, abyste zadali 5 nebo více různých promluv.

Poznámka:

Služba LUIS převede všechny promluvy na malá písmena.

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

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

Za stejným postupem vložte následující š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 vytvořenou promluvu musíte určit, která slova by měla služba LUIS používat jako entity. V tomto příkladu potřebujete označit všechny barvy jako barevnou entitu a všechny možné odkazy na cíl jako cílovou entitu.

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

    Identifikace cílů promluvy

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

    Identifikace entit promluvy

  3. Označte také další řádek, kde by měla být datová krychle cíl a černá by měla být barva. Všimněte si také použití slov "this", "it" a "this object", které poskytujeme, takže k dispozici nejsou specifické cílové typy.

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

    Tip

    Při výběru slov, která mají být označena jako entity:

    • U jednoho slova stačí kliknout na ně.
    • U sady dvou nebo více slov klikněte na začátek a potom na konci sady.

    Poznámka:

    Pomocí přepínače 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, které znázorňují zobrazení Entity / Tokeny:

    Zobrazení tokenů a entit

  6. V tomto okamžiku stiskněte tlačítko Train (Trénovat ) v pravém horním rohu stránky a počkejte, až se malý kruhový indikátor na stránce změní na zelenou barvu. To znamená, že služba LUIS byla úspěšně natrénována k rozpoznání tohoto záměru.

    Trénovat službu LUIS

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

  8. Za stejným procesem jako u předchozího záměru vložte následující 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 výsledek na následujícím obrázku:

    Nastavení tokenů a entit ChangeObjectSize

  10. Jakmile jsou záměry, ChangeObjectColor a ChangeObjectSize vytvořené a natrénované, klikněte na tlačítko 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í mohl přistupovat váš kód.

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

    2. Nastavte časové pásmo na č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. Všimněte si Starter_Key prvku níže, 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 se váš Azure a portál LUIS přihlásí ke stejnému uživateli, zobrazí se rozevírací nabídky pro název tenanta, název předplatného a klíč, který chcete použít (bude mít stejný název, jako jste zadali dříve na webu Azure Portal.

    Důležité

    Pod koncovým bodem položte kopii koncového bodu odpovídající klíči, který jste vložili, brzy ho použijete ve svém kódu.

Kapitola 3 – Nastavení projektu Unity

Následuje typická sada pro vývoj s hybridní realitou a jako taková je vhodná šablona 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 blíže ke kořenovým adresářům je lepší). Potom klikněte na Vytvořit projekt.

    Zadejte podrobnosti o novém projektu Unity.

  3. Při otevření Unity stojí za to zkontrolovat, jestli je výchozí editor skriptů nastavený na Visual Studio. Přejděte na Upravit > předvolby a pak 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. Dále přejděte do Nastavení sestavení souborů > a přepněte platformu na Univerzální platforma Windows kliknutím na tlačítko Přepnout platformu.

    Okno Nastavení sestavení, přepnutí platformy na UPW

  5. Přejděte do nastavení sestavení souborů > a ujistěte se, že:

    1. Cílové zařízení je nastavené na libovolné 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í.

        Kliknutí na tlačítko Pro přidání otevřených scén

      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, pojmenujte ji Scény.

        Vytvoření nové složky skriptů

      3. Otevřete nově vytvořenou složku Scény a potom 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 teď měla zůstat ve výchozím nastavení.

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

    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. Skriptovací verze modulu runtime by měla být stabilní (ekvivalent .NET 3.5).

      2. Back-end skriptování 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 Možnosti zaškrtněte:

      1. InternetClient

      2. Mikrofon

        Aktualizace nastavení publikování

    3. Dále na panelu v nastavení XR (v části Nastavení publikování níže) zaškrtněte možnost Podpora virtuální reality a ujistěte se, že je přidaná sada SDK pro Windows Mixed Reality.

      Aktualizujte nastavení X R.

  8. Zpět v projektech Unity Nastavení sestavení v jazyce C# se už nezobrazuje šedě. Zaškrtněte políčko vedle tohoto příkazu.

  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 přeskočit komponentu Nastavení Unity v tomto kurzu a pokračovat přímo do kódu, můžete si stáhnout tento balíček .unitypackage, importovat ho do projektu jako vlastní balíček a pokračovat z kapitoly 5.

  1. Klikněte pravým tlačítkem myši do prázdné oblasti panelu hierarchie v části 3D Objekt přidat rovinu.

    Vytvořte rovinu.

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

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

    1. Sféra
    2. Válec
    3. Krychle
    4. 3D text
  4. Výsledná hierarchie scény by měla vypadat jako na následujícím obrázku:

    Nastavení hierarchie scény

  5. Kliknutím na hlavní kameru ho vyberte, podívejte se na panel inspektoru, kde uvidíte objekt Fotoaparát se všemi jeho součástmi.

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

    Přidat zdroj zvuku

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

  8. Také se ujistěte, že je součást Transformace hlavní kamery nastavena na (0,0,0), to lze provést stisknutím ikony ozubeného kola vedle součásti Transformace fotoaparátu a výběrem možnosti Obnovit. Komponenta Transform 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:

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

    • Vymazat příznaky: plná barva.
    • Pozadí "Černá, Alfa 0" – šestnáctkové barvy: #00000000.
  9. Kliknutím levým tlačítkem na rovinu ji vyberte. Na panelu inspektoru nastavte komponentu Transformace s následujícími hodnotami:

    Osa X Osa Y Osa Z
    0 -1 0
  10. Kliknutím levým tlačítkem na Sphere ho vyberte. Na panelu inspektoru nastavte komponentu Transformace s následujícími hodnotami:

    Osa X Osa Y Osa Z
    2 1 2
  11. Kliknutím levým tlačítkem na válci ho vyberte. Na panelu inspektoru nastavte komponentu Transformace s následujícími hodnotami:

    Osa X Osa Y Osa Z
    -2 1 2
  12. Kliknutím vlevo vyberte datová krychle . Na panelu inspektoru nastavte komponentu Transformace s následujícími hodnotami:

Transformace – pozice

X Y Z
0 1 4

Transformace – otočení

X Y Z
45 45 0
  1. Kliknutím vlevo vyberte objekt Nový text . Na panelu inspektoru nastavte komponentu Transformace 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 Text Mesh na text diktování.

    Vytvoření 3D textového objektu

  3. Struktura panelu hierarchie by teď měla vypadat takto:

    text mesh in scene view

  4. Koneč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ím skriptem, který vytvoříte, je třída MicrophoneManager . Za tímto účelem vytvoříte LuisManager, třídu Chování a nakonec třídu Gaze (nebojte se vytvořit všechny tyto nyní, i když bude pokryta, jak se dostanete ke každé kapitole).

Třída MicrophoneManager zodpovídá za:

  • Zjištění nahrávacího zařízení připojeného k náhlavní soupravě nebo počítači (podle toho, co je výchozí).
  • Zachyťte zvuk (hlas) a pomocí diktování ho uložte jako řetězec.
  • Po pozastavení hlasu odešlete diktování do třídy LuisManager .

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

  1. Klikněte pravým tlačítkem na panelu projektu a vytvořte > složku. Volejte skripty složky.

    Vytvořte složku Skripty.

  2. Když jste vytvořili složku Scripts , poklikejte na ni a otevřete ji. Potom v této složce klikněte pravým tlačítkem myši na příkaz Vytvořit > skript jazyka C#. Pojmenujte skript MicrophoneManager.

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

  4. Do horní části 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(). Tyto se budou volat 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í zachytávání hlasu, a předat ji do třídy LuisManager , kterou brzy sestaví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á při pozastavení hlasu. 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. Než se vrátíte do Unity, nezapomeňte změny uložit v sadě Visual Studio.

    Poznámka:

    V tuto chvíli si všimnete chyby, která se zobrazí na panelu konzoly Unity Editoru. Důvodem je to, ž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í do 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 služby Azure Language Understanding, které se má analyzovat.

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 otevřete složku Skripty .

  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. Do horní části 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á bude 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 přidejte do třídy LuisManager 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 umístit koncový bod služby LUIS do této chvíle (který budete mít na portálu LUIS).

  8. Teď je potřeba přidat kód pro metodu Awake(). Tato metoda bude volána při inicializaci třídy:

        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 pak přijmout a deserializovat odpověď.

  10. Jakmile se určí hodnota záměru a přidružených entit, předají se instanci třídy Behaviors , aby aktivovaly zamýšlenou akci.

        /// <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ýsledný analyzovanýquery a určí entity. Jakmile se tyto entity určí, předají se instanci třídy Chování , 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. Než se vrátíte do Unity, nezapomeňte změny uložit v sadě Visual Studio.

Poznámka:

V tuto chvíli si všimnete několika chyb, které se zobrazí na panelu konzoly Unity Editoru. Je to proto, že kód odkazuje na třídu Chování , kterou vytvoříte v další kapitole.

Kapitola 7 – Vytvoření třídy chování

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

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

  1. Poklikáním otevřete složku Skripty .

  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 chování skriptu.

  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 při inicializaci třídy:

        void Awake()
        {
            // allows this class instance to behave like a singleton
            instance = this;
        }
    
  6. Následující metody jsou volána službou LuisManager třídy (kterou jste vytvořili dříve) k určení, který objekt je cílem dotazu, a pak aktivujte 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() pro určení, která z GameObjects je cílem aktuálního záměru. Tato metoda nastaví cíl na Objekt GameObject , který je "prohlížený", pokud není definován žádný explicitní cíl v entitách.

        /// <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. Než se vrátíte do Unity, nezapomeňte změny uložit v sadě Visual Studio.

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

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

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

  1. Poklikáním otevřete složku Skripty .

  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. Než se vrátíte do Unity, nezapomeňte změny uložit 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 být schopni zobrazit každý skript, který jste připojili, a všimněte si, že u každého skriptu, který ještě není nastavený, existují parametry.

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

  3. Chcete-li správně nastavit tyto parametry, postupujte podle těchto pokynů:

    1. MicrophoneManager:

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

      • Přetáhněte objekt Sphere do referenčního cílového pole Sphere.
      • Přetáhněte válci do cílového cílového pole válců.
      • Přetáhněte datovou krychli do cílového pole odkaz na datovou krychli.
    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:

    Zobrazení referenčních cílů fotoaparátu, které je teď nastavené.

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řipojené k objektu Hlavní kamera .
  • Všechna pole na hlavním panelu kontroly kamery jsou správně přiřazena.
  1. Stiskněte tlačítko Přehrát v Unity Editoru. 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 výchozí změny 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 mělo by to fungovat podle očekávání.

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

Jakmile ověříte, že aplikace funguje v Unity Editoru, jste připraveni sestavovat a nasazovat.

Sestavení:

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

  2. Přejděte do nastavení sestavení souboru>.

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

  4. Klikněte na Přidat otevřené scény a potom klikněte na Sestavit.

    Okno Nastavení sestavení

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

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

  7. Kliknutím na vybrat složku zahájíte sestavení v daném umístění.

    Vytvořit složku buildůVýběr složky Sestavení

  8. Po dokončení sestavování Unity (může to nějakou dobu trvat) by se mělo otevřít okno Průzkumník souborů v umístění sestavení.

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 konfiguraci řešení vyberte Ladit.

    U Microsoft HoloLensu může být jednodušší nastavit tento počítač na vzdálený počítač, takže nejste připojení k počítači. I když budete muset udělat toto:

    • Znát IP adresu vašeho HoloLensu, který najdete v rozšířených možnostech sítě Nastavení > a Internetu > Wi-Fi>. Protokol IPv4 je adresa, kterou byste měli použít.
    • Ujistěte se, že je režim vývojáře zapnutý, najdete v části Aktualizace nastavení > a 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í připravených ke spuštění.

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

Kapitola 12 – Zlepš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 iteovat, protože vám pomůže zlepšit přesnost služby LUIS: zajistěte, abyste to dokončili.

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

Možná jste například vytrénovali službu LUIS, abyste porozuměli slovům "Zvětšit" a "Přenést", ale nechcete, aby vaše aplikace také rozuměla slovům, jako je "Zvětšit"?

Jakmile aplikaci několikrát použijete, služba LUIS bude shromažďovat vše, co jste řekli, a bude k dispozici na portálu LUIS.

  1. Přejděte k portálové aplikaci 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é 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 chybné a které entity se zmeškaly.

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

Kontrola promluvOdebrat obrázek popisku

  1. Pokud zjistíte, že se promluvy úplně nepovedlo, 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 správně interpretovala promluvu, můžete její porozumění ověřit pomocí tlačítka Přidat do zarovnaného záměru.

    Přidání 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 tolikrát, kolikrát je to možné, aby se zlepšilo porozumění vaší aplikaci.

Bav se!

Hotová integrovaná aplikace LUIS

Blahopřejeme, vytvořili jste aplikaci hybridní reality, která využívá službu Azure Language Understanding Intelligence Service, abyste pochopili, co uživatel říká, a reagovali na tyto informace.

Výsledek testovacího prostředí

Bonusová cvičení

Cvičení 1

Při použití 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, provede to. Můžete si vyzkoušet, jak aplikaci zastavit v změně barvy podlahy?

Cvičení 2

Zkuste rozšířit možnosti služby LUIS a aplikace a přidat další funkce pro objekty ve scéně; Například v závislosti na tom, co uživatel říká, můžete vytvářet nové objekty v bodě přístupového bodu Gaze a pak tyto objekty používat společně s objekty aktuální scény s existujícími příkazy.