HoloLens (1. generációs) és Azure 303: Természetes nyelvfelismerés (LUIS)
Megjegyzés
A Mixed Reality Academy oktatóanyagait a HoloLens (1. generációs) és Mixed Reality modern headsetekkel tervezték. Ezért fontosnak tartjuk, hogy ezeket az oktatóanyagokat megtartsuk azoknak a fejlesztőknek, akik továbbra is útmutatást keresnek az eszközök fejlesztéséhez. Ezek az oktatóanyagok nem frissülnek az HoloLens 2 legújabb eszközkészleteivel vagy interakcióival. A támogatott eszközökön való munka folytatásához megmaradnak. A jövőben egy új oktatóanyag-sorozat jelenik meg, amely bemutatja, hogyan fejleszthet HoloLens 2. Ezt az értesítést a közzétételükkor az oktatóanyagokra mutató hivatkozással frissítjük.
Ebben a tanfolyamban megtudhatja, hogyan integrálhatja a Language Understanding egy vegyes valósági alkalmazásba az Azure Cognitive Services használatával, a Language Understanding API-val.
A Language Understanding (LUIS) egy Microsoft Azure-szolgáltatás, amely lehetővé teszi az alkalmazások számára, hogy a felhasználói bevitelből , például a személy által kívánt tartalom kinyerésével, saját szavaikból nyerjék ki a kívánt értéket. Ez a gépi tanulással érhető el, amely megérti és megtanulja a bemeneti információkat, majd részletes, releváns információkkal válaszolhat. További információt az Azure Language Understanding (LUIS) oldalán talál.
A tanfolyam elvégzése után vegyes valóságú, magával ragadó headset-alkalmazással rendelkezik, amely a következőket fogja tudni elvégezni:
- Rögzítse a felhasználói beviteli beszédet a modern headsethez csatlakoztatott mikrofonnal.
- Küldje el a rögzített diktálást az Azure Language Understanding Intelligent Service (LUIS) számára.
- Kérje meg a LUIS-t, hogy kinyerje a küldési információk jelentését, amelyet elemezni fog, és megkísérli meghatározni a felhasználó kérésének szándékát.
A fejlesztés magában foglalja egy alkalmazás létrehozását, amelyben a felhasználó hang és/vagy tekintet használatával módosíthatja a jelenet objektumainak méretét és színét. A mozgásvezérlők használata nem terjed ki.
Az alkalmazásban ön múlik, hogyan fogja integrálni az eredményeket a tervével. Ez a kurzus arra szolgál, hogy megtanítsa, hogyan integrálhat egy Azure-szolgáltatást a Unity Projecttel. Az Ön feladata, hogy felhasználja a tanfolyamból megszerzett tudást a vegyes valóság alkalmazásának továbbfejlesztéséhez.
Készüljön fel többször a LUIS betanítása gombra, amelyről a 12. fejezet foglalkozik. Jobb eredményeket fog kapni annál többször, amikor a LUIS betanítása megtörtént.
Eszköztámogatás
Tanfolyam | HoloLens | Modern headsetek |
---|---|---|
MR és Azure 303: Természetes nyelvfelismerés (LUIS) | ✔️ | ✔️ |
Megjegyzés
Bár ez a kurzus elsősorban Windows Mixed Reality magával ragadó (VR) headsetekkel foglalkozik, a tanfolyam során tanultakat a Microsoft HoloLens is alkalmazhatja. Ahogy a tanfolyamot is követi, a HoloLens támogatásához esetleg szükséges módosításokkal kapcsolatos megjegyzéseket fog látni. A HoloLens használatakor a hangrögzítés során némi visszhangot tapasztalhat.
Előfeltételek
Megjegyzés
Ez az oktatóanyag olyan fejlesztőknek készült, akik alapszintű tapasztalattal rendelkeznek a Unityben és a C#-ben. Felhívjuk a figyelmét arra is, hogy a jelen dokumentumban foglalt előfeltételek és írásos utasítások az írás időpontjában (2018. május) tesztelt és ellenőrzött adatokat jelölik. Szabadon használhatja a legújabb szoftvert, ahogy az az eszközök telepítéséről szóló cikkben szerepel, bár nem szabad feltételezni, hogy a tanfolyam információi tökéletesen megfelelnek az újabb szoftverekben található információknak, mint az alább felsoroltak.
A tanfolyamhoz a következő hardvereket és szoftvereket ajánljuk:
- A modern (VR) headset fejlesztéséhez használható Windows Mixed Reality kompatibilis fejlesztőszámítógép
- Windows 10 Fall Creators Update (vagy újabb) a fejlesztői mód engedélyezésével
- A legújabb Windows 10 SDK
- Unity 2017.4
- Visual Studio 2017
- Egy Windows Mixed Reality modern (VR) headset vagy Microsoft HoloLens, amelyen engedélyezve van a fejlesztői mód
- Beépített mikrofonnal ellátott fejhallgatókészlet (ha a mikrofonos fejhallgató nem rendelkezik beépített mikrofonnal és hangszórókkal)
- Internet-hozzáférés az Azure beállításához és a LUIS lekéréséhez
Előkészületek
A projekt létrehozásával kapcsolatos problémák elkerülése érdekében javasoljuk, hogy hozza létre az oktatóanyagban említett projektet egy gyökér- vagy gyökérmappában (a hosszú mappaútvonalak buildeléskor problémákat okozhatnak).
Ha engedélyezni szeretné a gép számára a diktálás engedélyezését, lépjen a Windows-beállítások > Adatvédelmi > beszédfelismerés, a Tintakészítés & Gépelés területre, és nyomja le a Beszédszolgáltatások bekapcsolása és a gépelési javaslatok gombot.
Az oktatóanyagban szereplő kód lehetővé teszi a számítógépen beállított alapértelmezett mikrofoneszköz rögzítését. Győződjön meg arról, hogy az alapértelmezett mikrofoneszköz van beállítva a hang rögzítéséhez használni kívánt eszközként.
Ha a mikrofonos fejhallgató beépített mikrofonnal rendelkezik, győződjön meg arról, hogy a "Ha a mikrofonos fejhallgatót viselem, váltson mikrofonos mikrofonra" beállítás be van kapcsolva a Mixed Reality Portál beállításai között.
1. fejezet – Az Azure Portal beállítása
Az azure-beli Language Understanding szolgáltatás használatához konfigurálnia kell a szolgáltatás egy példányát, hogy elérhetővé legyen téve az alkalmazás számára.
Jelentkezzen be az Azure Portalra.
Megjegyzés
Ha még nem rendelkezik Azure-fiókkal, létre kell hoznia egyet. Ha ezt az oktatóanyagot osztályteremben vagy laborhelyzetben követi, kérjen segítséget az oktatótól vagy az egyik proktortól az új fiók beállításához.
Miután bejelentkezett, kattintson a bal felső sarokban az Új elemre, keresse meg a Language Understanding, majd kattintson az Enter gombra.
Megjegyzés
Előfordulhat, hogy az Új szót lecserélték az Erőforrás létrehozása elemre az újabb portálokon.
A jobb oldalon található új oldal a Language Understanding szolgáltatás leírását adja meg. A lap bal alsó részén kattintson a Létrehozás gombra a szolgáltatás példányának létrehozásához.
Miután a Létrehozás gombra kattintott:
Szúrja be a kívánt nevet ehhez a szolgáltatáspéldányhoz.
Válasszon ki egy előfizetést.
Válassza ki az Önnek megfelelő tarifacsomagot , ha ez az első alkalom, hogy létrehoz egy LUIS-szolgáltatást, akkor egy ingyenes (F0 nevű) szintnek kell elérhetőnek lennie. Az ingyenes foglalásnak több mint elegendőnek kell lennie ehhez a kurzushoz.
Válasszon egy erőforráscsoportot , vagy hozzon létre egy újat. Az erőforráscsoportok lehetővé teszi az Azure-eszközök gyűjteményéhez tartozó számlázás monitorozását, vezérlését, kiépítését és kezelését. Javasoljuk, hogy az egyetlen projekthez (például a tanfolyamokhoz) társított összes Azure-szolgáltatást egy közös erőforráscsoportban tartsa.
Ha többet szeretne megtudni az Azure-erőforráscsoportokról, tekintse meg az erőforráscsoportról szóló cikket.
Határozza meg az erőforráscsoport helyét (ha új erőforráscsoportot hoz létre). A hely ideális esetben abban a régióban lenne, ahol az alkalmazás futna. Egyes Azure-eszközök csak bizonyos régiókban érhetők el.
Azt is meg kell erősítenie, hogy megértette a szolgáltatásra vonatkozó feltételeket.
Válassza a Létrehozás lehetőséget.
Miután a Létrehozás gombra kattintott, meg kell várnia a szolgáltatás létrehozását, ez eltarthat egy percig.
A szolgáltatáspéldány létrehozása után megjelenik egy értesítés a portálon.
Kattintson az értesítésre az új szolgáltatáspéldány megismeréséhez.
Az értesítésben kattintson az Erőforrás megnyitása gombra az új szolgáltatáspéldány megismeréséhez. A rendszer az új LUIS-szolgáltatáspéldányra nyitja meg.
Ebben az oktatóanyagban az alkalmazásnak hívásokat kell kezdeményeznie a szolgáltatáshoz, amelyet a szolgáltatás előfizetési kulcsának használatával kell elvégeznie.
A LUIS API-szolgáltatásgyors kezdőoldalán lépjen az első lépésre, a Kulcsok megragadása, majd a Kulcsok elemre (ezt a szolgáltatások navigációs menüjében található, a kulcs ikonnal jelölhető kék hivatkozásra kattintva is elérheti). Ekkor megjelennek a szolgáltatáskulcsok.
Készítsen másolatot az egyik megjelenített kulcsról, mert erre később szüksége lesz a projektben.
A Szolgáltatás lapon kattintson a Language Understanding portálra, hogy átirányítsa az új szolgáltatás létrehozásához használni kívánt weblapra a LUIS-alkalmazásban.
2. fejezet – A Language Understanding portál
Ebben a szakaszban megtudhatja, hogyan hozhat létre LUIS-alkalmazást a LUIS-portálon.
Fontos
Vegye figyelembe, hogy az entitások, szándékok és kimondott szövegek beállítása ebben a fejezetben csak az első lépés a LUIS-szolgáltatás kiépítésében: a szolgáltatás többszöri újratanítására is szükség lesz, hogy pontosabb legyen. A szolgáltatás újratanításáról a tanfolyam utolsó fejezete foglalkozik, ezért győződjön meg arról, hogy elvégezte.
A Language Understanding portál elérésekor előfordulhat, hogy be kell jelentkeznie, ha még nem tette meg, ugyanazokkal a hitelesítő adatokkal, mint a Azure Portal.
Ha most először használja a LUIS-t, görgessen le az üdvözlőlap aljára, és kattintson a LUIS-alkalmazás létrehozása gombra.
Miután bejelentkezett, kattintson a Saját alkalmazások elemre (ha jelenleg nem ebben a szakaszban van). Ezután kattintson az Új alkalmazás létrehozása elemre.
Adjon nevet az alkalmazásnak.
Ha az alkalmazásnak az angoltól eltérő nyelvet kell értenie, akkor a kulturális környezetet a megfelelő nyelvre kell módosítania.
Itt hozzáadhatja az új LUIS-alkalmazás leírását is.
Miután lenyomta a Kész gombot, beírja az új LUIS-alkalmazásBuild (Build) lapját.
Itt néhány fontos fogalmat kell megértenie:
- Az Intent (Szándék) azt a metódust jelöli, amelyet a rendszer a felhasználó lekérdezése alapján hív meg. A SZÁNDÉKok egy vagy több ENTITÁST tartalmazhatnak.
- Az entitás a lekérdezés egyik összetevője, amely az INTENT-hez kapcsolódó információkat írja le.
- A kimondott szövegek a fejlesztő által biztosított lekérdezések példái, amelyeket a LUIS saját betanítására fog használni.
Ha ezek a fogalmak nem teljesen világosak, ne aggódjon, mivel ez a kurzus tovább tisztázza őket ebben a fejezetben.
Először hozza létre a kurzus létrehozásához szükséges entitásokat .
A lap bal oldalán kattintson az Entitások elemre, majd az Új entitás létrehozása elemre.
Hívja meg az új Entitás színt, állítsa a típusát Egyszerű értékre, majd nyomja le a Kész gombot.
Ismételje meg ezt a folyamatot három (3) nevű egyszerű entitás létrehozásához:
- Továbbfejleszteni
- Csökkentse
- Cél
Az eredménynek az alábbi képhez hasonlóan kell kinéznie:
Ekkor megkezdheti a szándékok létrehozását.
Figyelmeztetés
Ne törölje a Nincs szándékot.
A lap bal oldalán kattintson a Szándékok elemre, majd az Új szándék létrehozása elemre.
Hívja meg az új SzándékváltozásObjectColor elemet.
Fontos
Ezt a szándéknevet a tanfolyam későbbi részében használjuk a kódban, így a legjobb eredmény érdekében ezt a nevet pontosan a megadott módon használjuk.
Miután megerősítette a nevet, a rendszer átirányítja az Szándékok lapra.
Megfigyelheti, hogy van egy szövegmező, amely 5 vagy több különböző kimondott szöveg beírását kéri.
Megjegyzés
A LUIS az összes kimondott szöveget kisbetűssé alakítja.
- Szúrja be a következő kimondott szöveget a felső szövegmezőbe (jelenleg a Típus körülbelül 5 példa... szöveggel), majd nyomja le az Enter billentyűt:
The color of the cylinder must be red
Megfigyelheti, hogy az új kimondott szöveg megjelenik az alatta lévő listában.
Ugyanezt a folyamatot követve szúrja be a következő hat (6) kimondott szöveget:
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
Minden létrehozott kimondott szöveghez meg kell határoznia, hogy a LUIS mely szavakat használja entitásként. Ebben a példában az összes színt fel kell címkézni egy színentitásként, és minden lehetséges hivatkozást a célra célentitásként.
Ehhez kattintson a henger szóra az első kimondott szövegben, és válassza ki a célértéket.
Most kattintson a piros szóra az első kimondott szövegben, és válassza ki a színt.
Jelölje meg a következő sort is, ahol a kockánakcélnak kell lennie, a feketénekpedig színnek kell lennie. Figyelje meg az "ez", "it" és "ez az objektum" szavak használatát is, amelyeket biztosítunk, hogy a nem specifikus céltípusok is elérhetők legyenek.
Ismételje meg a fenti folyamatot, amíg az összes kimondott szöveghez meg nem címkézték az Entitásokat. Ha segítségre van szüksége, tekintse meg az alábbi képet.
Tipp
Amikor kijelöli a szavakat, hogy entitásként címkézze őket:
- Egyetlen szó esetén kattintson rájuk.
- Két vagy több szóból álló halmaz esetén kattintson a halmaz elejére, majd végére.
Megjegyzés
A Jogkivonatok nézet váltógombbal válthat az Entitások / Jogkivonatok nézet között!
Az eredményeknek az alábbi képeken láthatónak kell lenniük, amelyeken az Entitások / Jogkivonatok nézet látható:
Ezen a ponton nyomja le a Betanítása gombot az oldal jobb felső sarkában, és várja meg, amíg a kis kerek jelző zöldre vált. Ez azt jelzi, hogy a LUIS-t sikeresen betanították a szándék felismerésére.
Gyakorlatként hozzon létre egy changeObjectSize nevű új szándékot az Entitások cél, a fel- és leméreteztetés használatával.
Az előző szándékkal megegyező folyamatot követve szúrja be a következő nyolc (8) kimondott szöveget a méretváltozáshoz :
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
Az eredménynek az alábbi képen láthatóhoz hasonlónak kell lennie:
Miután létrejött és betanította mindkét szándékot, a ChangeObjectColor és a ChangeObjectSize objektumot, kattintson a lap tetején található PUBLISH gombra.
A Közzététel lapon véglegesíti és közzéteszi a LUIS-alkalmazást, hogy a kóddal elérhető legyen.
Állítsa be a publish to as Production (Közzététel élesként) legördülő listát.
Állítsa az időzóna értékét az időzónára.
Jelölje be az Összes előrejelzett szándékpont belefoglalása jelölőnégyzetet.
Kattintson a Közzététel éles környezetben pontra.
Az Erőforrások és kulcsok szakaszban:
- Válassza ki a szolgáltatáspéldányhoz beállított régiót az Azure Portalon.
- Az alábbiakban egy Starter_Key elemet fog látni, hagyja figyelmen kívül.
- Kattintson a Kulcs hozzáadása elemre, és szúrja be az Azure Portalon a szolgáltatáspéldány létrehozásakor beszerzett kulcsot . Ha az Azure-beli és a LUIS-portál ugyanabba a felhasználóba van bejelentkezve, a bérlő neve, az előfizetés neve és a használni kívánt kulcs legördülő menüje (ugyanazzal a névvel fog rendelkezni, mint korábban az Azure Portalon).
Fontos
A Végpont alatt készítsen másolatot a beszúrt kulcsnak megfelelő végpontról, amelyet hamarosan használni fog a kódban.
3. fejezet – A Unity-projekt beállítása
Az alábbiak egy tipikusan a vegyes valósággal való fejlesztésre szolgálnak, és mint ilyen, jó sablon más projektekhez.
Nyissa meg a Unityt , és kattintson az Új gombra.
Most meg kell adnia a Unity-projekt nevét, be kell szúrnia MR_LUIS. Győződjön meg arról, hogy a projekt típusa 3D. Állítsa a Hely értékét az Ön számára megfelelő helyre (ne feledje, a gyökérkönyvtárakhoz való közelebb jobb). Ezután kattintson a Projekt létrehozása elemre.
Ha a Unity nyitva van, érdemes ellenőrizni, hogy az alapértelmezett szkriptszerkesztőVisual Studióra van-e állítva. Lépjen a Beállítások szerkesztése > elemre, majd az új ablakból lépjen a Külső eszközök elemre. Módosítsa a Külső szkriptszerkesztőtVisual Studio 2017-re. Zárja be a Beállítások ablakot.
Ezután lépjen a Fájlkészítési > beállítások területre, és váltson a platformra Univerzális Windows-platform, és kattintson a Platformváltás gombra.
Lépjen a Fájl > buildelési beállításai területre , és győződjön meg arról, hogy:
A céleszközbármely eszközre van állítva
A Microsoft HoloLens állítsa a Céleszköz értékét HoloLens értékre.
A build típusaD3D értékre van állítva
Az SDK a Legújabb telepített értékre van állítva
A Visual Studio verziója a Legújabb telepítve értékre van állítva
A buildelés és a futtatáshelyi gépre van állítva
Mentse a jelenetet, és adja hozzá a buildhez.
Ehhez válassza a Nyitott jelenetek hozzáadása lehetőséget. Ekkor megjelenik egy mentési ablak.
Hozzon létre egy új mappát ehhez, és minden jövőbeni jelenethez, majd az Új mappa gombra kattintva hozzon létre egy új mappát, és adja neki a Jelenetek nevet.
Nyissa meg az újonnan létrehozott Jelenetek mappát, majd a Fájlnév: szöveg mezőbe írja be a MR_LuisScene, majd nyomja le a Mentés gombot.
A buildbeállításokban lévő többi beállításnak egyelőre alapértelmezettnek kell lennie.
A Build Settings (Összeállítási beállítások ) ablakban kattintson a Lejátszó beállításai gombra, ezzel megnyitja a kapcsolódó panelt abban a térben, ahol az Inspector található.
Ebben a panelen ellenőrizni kell néhány beállítást:
Az Egyéb beállítások lapon:
A szkriptelési futtatókörnyezet verziójánakstabilnak kell lennie (.NET 3.5-ös egyenértékű).
A szkriptelési háttérrendszernek.NET-nek kell lennie
Az API-kompatibilitási szintnek.NET 4.6-osnak kell lennie
A Közzétételi beállítások lapon, a Képességek területen ellenőrizze a következőt:
InternetClient
Mikrofon
A panelen lejjebb, az XR-beállítások területen (amely a Közzétételi beállítások alatt található) jelölje be a Támogatott virtuális valóság jelölőnégyzetet, és győződjön meg arról, hogy a Windows Mixed Reality SDK hozzá van adva.
A buildbeállításokban a Unity C#-projektek már nem szürkén jelennek meg; jelölje be a mellette lévő jelölőnégyzetet.
Zárja be a Létrehozási beállítások ablakot.
Mentse a jelenetet és a projektet (FILE > SAVE SCENE /FILE > SAVE PROJECT).
4. fejezet – A jelenet létrehozása
Fontos
Ha ki szeretné hagyni a kurzus Unity Set up összetevőjét, és közvetlenül a kódba szeretne lépni, nyugodtan töltse le ezt a .unitypackage csomagot, importálja a projektbe egyéni csomagként, majd folytassa az 5. fejezettel.
Kattintson a jobb gombbal a Hierarchia panel üres területére a 3D objektum területen, és adjon hozzá egy síkot.
Vegye figyelembe, hogy ha a jobb gombbal ismét a hierarchián belülre kattint, hogy több objektumot hozzon létre, ha még mindig az utolsó objektum van kijelölve, a kijelölt objektum lesz az új objektum szülője. Ne kattintson a bal gombbal a hierarchia üres területére, majd kattintson a jobb gombbal.
Ismételje meg a fenti eljárást a következő objektumok hozzáadásához:
- Sphere
- Henger
- Köbre emelés
- Térhatású szöveg
Az eredményként kapott jelenetnek a hierarchia az alábbi képen láthatóhoz hasonlónak kell lennie:
A fő kamera kiválasztásához kattintson a bal gombbal a Fő kamerára , és nézze meg az Inspector Panelt , amelyen a Kamera objektum látható az összes összetevővel együtt.
Kattintson az Összetevő hozzáadása gombra, amely az Inspector panel alján található.
Keresse meg a Hangforrás nevű összetevőt a fent látható módon.
Győződjön meg arról is, hogy a Fő kamera Átalakítás összetevője (0,0,0) értékre van állítva. Ehhez nyomja le a Fogaskerék ikont a Kamera Átalakítás összetevője mellett, és válassza az Alaphelyzetbe állítás lehetőséget. Az Átalakítás összetevőnek ezután a következőképpen kell kinéznie:
- A pozíció értéke 0, 0, 0.
- A forgatás értéke 0, 0, 0.
Megjegyzés
A Microsoft HoloLens a következőket is módosítania kell, amelyek a Fő kamerán található Kamera összetevő részét képezik:
- Jelzők törlése: Egyszínű.
- Háttér "Fekete, Alfa 0" – Hexa szín: #00000000.
A kijelöléshez kattintson a bal gombbal a síkra . Az Inspector panelen állítsa be az Átalakítás összetevőt a következő értékekkel:
X tengely Y tengely Z tengely 0 -1 0 A kijelöléshez kattintson a bal gombbal a gömbre . Az Inspector panelen állítsa be az Átalakítás összetevőt a következő értékekkel:
X tengely Y tengely Z tengely 2 1 2 Kattintson a bal gombbal a hengerre a kiválasztásához. Az Inspector panelen állítsa be az Átalakítás összetevőt a következő értékekkel:
X tengely Y tengely Z tengely -2 1 2 Kattintson a bal gombbal a kockára a kijelöléshez. Az Inspector panelen állítsa be az Átalakítás összetevőt a következő értékekkel:
Átalakítás – Pozíció
X | Y | Z |
---|---|---|
0 | 1 | 4 |
Átalakítás – Forgatás
X | Y | Z |
---|---|---|
45 | 45 | 0 |
- A kijelöléshez kattintson a bal gombbal az Új szöveg objektumra. Az Inspector panelen állítsa be az Átalakítás összetevőt a következő értékekkel:
Átalakítás – Pozíció
X | Y | Z |
---|---|---|
-2 | 6 | 9 |
Átalakítás – Skálázás
X | Y | Z |
---|---|---|
0.1 | 0.1 | 0.1 |
Módosítsa a Szövegháló összetevő betűméretét50-esre.
Módosítsa a Text Mesh objektum nevétdiktálási szövegre.
A hierarchiapanel struktúrájának a következőképpen kell kinéznie:
Az utolsó jelenetnek az alábbi képhez hasonlóan kell kinéznie:
5. fejezet – A MicrophoneManager osztály létrehozása
Az első létrehozandó szkript a MicrophoneManager osztály. Ezt követően létre fogja hozni a LuisManagert, a Viselkedések osztályt, végül pedig a Gaze osztályt (nyugodtan hozza létre most ezeket, bár ez az egyes fejezetek elérésekor lesz lefedve).
A MicrophoneManager osztály feladata:
- A mikrofonos fejhallgatóhoz vagy géphez csatlakoztatott rögzítőeszköz észlelése (amelyik az alapértelmezett).
- Rögzítse a hangot (hang), és diktálás használatával sztringként tárolja.
- A hang szüneteltetése után küldje el a diktálást a LuisManager osztálynak.
Az osztály létrehozása:
Kattintson a jobb gombbal a Projekt panelMappa létrehozása > elemére. Hívja meg a Szkriptek mappát.
A Szkriptek mappa létrehozása után kattintson rá duplán a megnyitásához. Ezután a mappában kattintson a jobb gombbal a Create C# Script (C#-szkript létrehozása > ) elemre. Nevezze el a MicrophoneManager szkriptet.
Kattintson duplán a MicrophoneManager elemre a Visual Studióval való megnyitásához.
Adja hozzá a következő névtereket a fájl elejéhez:
using UnityEngine; using UnityEngine.Windows.Speech;
Ezután adja hozzá a következő változókat a MicrophoneManager osztályban:
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
Az Awake() és a Start() metódusok kódját most már hozzá kell adni. Ezek a következők lesznek meghívva, amikor az osztály inicializálódik:
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"); } }
Most már szüksége van arra a módszerre, amelyet az alkalmazás a hangrögzítés elindításához és leállításához használ, majd átadja azt a LuisManager osztálynak, amelyet hamarosan létrehoz.
/// <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..."); }
Adjon hozzá egy diktálási kezelőt , amely a hang szüneteltetésekor lesz meghívva. Ez a metódus átadja a diktálási szöveget a LuisManager osztálynak.
/// <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); }
Fontos
Törölje az Update() metódust, mivel ez az osztály nem fogja használni.
Mielőtt visszatér a Unitybe, mentse a módosításokat a Visual Studióban.
Megjegyzés
Ekkor hibaüzenet jelenik meg a Unity Szerkesztő konzolpaneljén. Ennek az az oka, hogy a kód a következő fejezetben létrehozott LuisManager osztályra hivatkozik.
6. fejezet – A LUISManager osztály létrehozása
Itt az ideje, hogy létrehozza a LuisManager osztályt, amely meghívja az Azure LUIS szolgáltatást.
Ennek az osztálynak az a célja, hogy megkapja a diktálási szöveget a MicrophoneManager osztályból, és elküldje azt az Elemezendő Azure Language Understanding API-nak.
Ez az osztály deszerializálja a JSON-választ , és meghívja a Viselkedések osztály megfelelő metódusait egy művelet elindításához.
Az osztály létrehozása:
Kattintson duplán a Szkriptek mappára a megnyitásához.
Kattintson a jobb gombbal a Szkriptek mappába, majd kattintson a C# szkript létrehozása > parancsra. Nevezze el a LuisManager szkriptet.
Kattintson duplán a szkriptre a Visual Studióval való megnyitásához.
Adja hozzá a következő névtereket a fájl elejéhez:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking;
Első lépésként hozzon létre három osztályt a LuisManagerosztályban (ugyanabban a szkriptfájlban, a Start() metódus fölött, amely az Azure deszerializált JSON-válaszát jelöli.
[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; }
Ezután adja hozzá a következő változókat a LuisManager osztályban:
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";
Győződjön meg arról, hogy most helyezi el a LUIS-végpontot (amely a LUIS-portálról lesz).
Az Awake() metódus kódját most hozzá kell adni. Ez a metódus a osztály inicializálásakor lesz meghívva:
private void Awake() { // allows this class instance to behave like a singleton instance = this; }
Most már szüksége van az alkalmazás által a MicrophoneManager osztálytól kapott diktálás LUIS-ba való küldéséhez használt módszerekre, majd fogadja és deszerializálja a választ.
A szándék és a társított entitások értékének meghatározása után a rendszer átadja őket a Viselkedések osztály példányának a kívánt művelet aktiválásához.
/// <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; } }
Hozzon létre egy új, AnalyseResponseElements() nevű metódust , amely beolvassa az eredményül kapott AnalysedQueryt , és meghatározza az entitásokat. Az entitások meghatározása után a rendszer átadja azokat a Viselkedések osztály példányának, amelyet a műveletekben használni fog.
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; } }
Fontos
Törölje a Start() és Update() metódusokat, mivel ez a osztály nem fogja használni őket.
Mielőtt visszatér a Unitybe, mentse a módosításokat a Visual Studióban.
Megjegyzés
Ezen a ponton számos hiba jelenik meg a Unity Szerkesztő konzolpaneljén. Ennek az az oka, hogy a kód a következő fejezetben létrehozott Viselkedések osztályra hivatkozik.
7. fejezet – A Viselkedések osztály létrehozása
A Viselkedések osztály a LuisManager osztály által biztosított entitások használatával aktiválja a műveleteket.
Az osztály létrehozása:
Kattintson duplán a Szkriptek mappára a megnyitásához.
Kattintson a jobb gombbal a Szkriptek mappába, majd kattintson a C# szkript létrehozása > parancsra. Nevezze el a szkript viselkedését.
Kattintson duplán a szkriptre a Visual Studióval való megnyitásához.
Ezután adja hozzá a következő változókat a Behaviors osztályba:
public static Behaviours instance; // the following variables are references to possible targets public GameObject sphere; public GameObject cylinder; public GameObject cube; internal GameObject gazedTarget;
Adja hozzá az Awake() metóduskódot. Ez a metódus a osztály inicializálásakor lesz meghívva:
void Awake() { // allows this class instance to behave like a singleton instance = this; }
Az alábbi metódusokat a LuisManager osztály hívja meg (amelyet korábban létrehozott), hogy megállapítsa, melyik objektum a lekérdezés célja, majd aktiválja a megfelelő műveletet.
/// <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); }
Adja hozzá a FindTarget() metódust annak meghatározásához, hogy a GameObjects melyik célja az aktuális szándéknak. Ez a metódus alapértelmezés szerint a GameObject célértékét "megtekinti", ha az entitásokban nincs explicit cél definiálva.
/// <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; }
Fontos
Törölje a Start() és Update() metódusokat, mivel ez a osztály nem fogja használni őket.
Mielőtt visszatér a Unitybe, mentse a módosításokat a Visual Studióban.
8. fejezet – A tekintetosztály létrehozása
Az alkalmazás befejezéséhez az utolsó osztály a Gaze osztály. Ez az osztály frissíti a felhasználó vizuális fókuszában lévő GameObjectre mutató hivatkozást.
Az osztály létrehozása:
Kattintson duplán a Szkriptek mappára a megnyitásához.
Kattintson a jobb gombbal a Szkriptek mappába, és válassza a C#-szkript létrehozása > parancsot. Nevezze el a szkriptet Gaze névvel.
Kattintson duplán a szkriptre a Visual Studióval való megnyitásához.
Szúrja be a következő kódot ehhez az osztályhoz:
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; } } }
Ne felejtse el menteni a módosításokat a Visual Studióban , mielőtt visszatér a Unitybe.
9. fejezet – A jelenet beállításának befejezése
A jelenet beállításának befejezéséhez húzza az összes létrehozott szkriptet a Szkriptek mappából a Hierarchia panelFő kamerája objektumába.
Válassza ki a Fő kamerát , és tekintse meg az Inspector panelt, látnia kell az egyes csatolt szkripteket, és megfigyelheti, hogy minden szkripten vannak paraméterek, amelyeket még be kell állítani.
A paraméterek helyes beállításához kövesse az alábbi utasításokat:
MicrophoneManager:
- A Hierarchia panelen húzza a Diktálási szöveg objektumot a Diktálási szöveg paraméter értékmezőbe.
Viselkedések a Hierarchia panelről:
- Húzza a Sphere objektumot a Sphere hivatkozási célmezőbe.
- Húzza a hengert a Henger referencia célmezőbe.
- Húzza a kockát a Kockahivatkozás célmezőbe.
Tekintet:
- Állítsa a Tekintet maximális távolságát300-ra (ha még nem tette meg).
Az eredménynek az alábbi képhez hasonlóan kell kinéznie:
10. fejezet – Tesztelés a Unity Szerkesztőben
Ellenőrizze, hogy a Jelenet beállítása megfelelően van-e implementálva.
Győződjön meg a következőkről:
- Az összes szkript a Fő kamera objektumhoz van csatolva.
- A Fő kamerafelügyelő panel összes mezője megfelelően van hozzárendelve.
Nyomja le a Lejátszás gombot a Unity-szerkesztőben. Az alkalmazásnak a csatlakoztatott modern headseten belül kell futnia.
Próbáljon ki néhány kimondott szöveget, például:
make the cylinder red change the cube to yellow I want the sphere blue make this to green change it to white
Megjegyzés
Ha hibaüzenetet lát a Unity-konzolon az alapértelmezett hangeszköz módosításával kapcsolatban, előfordulhat, hogy a jelenet nem a várt módon működik. Ennek az az oka, hogy a vegyes valóság portálja a beépített mikrofonokkal foglalkozik azokkal rendelkező headsetekhez. Ha ezt a hibát látja, egyszerűen állítsa le a jelenetet, és indítsa újra, és a dolgok a várt módon működjenek.
11. fejezet – Az UWP-megoldás felépítése és közvetlen betöltése
Miután meggyőződett arról, hogy az alkalmazás működik a Unity Szerkesztőben, készen áll a buildelésre és üzembe helyezésre.
Buildelés:
Mentse az aktuális jelenetet a Fájl > mentése gombra kattintva.
Lépjen a Fájl > buildelési beállításai területre.
Jelölje be a Unity C# Projects (Unity C#-projektek ) nevű jelölőnégyzetet (ez hasznos a kód megtekintéséhez és hibakereséséhez az UWP-projekt létrehozása után.
Kattintson a Nyitott jelenetek hozzáadása, majd a Build elemre.
A rendszer kérni fogja, hogy válassza ki azt a mappát, amelyben létre szeretné tenni a megoldást.
Hozzon létre egy BUILDS mappát, és a mappán belül hozzon létre egy másik mappát a kívánt névvel.
Kattintson a Mappa kiválasztása gombra a build ezen a helyen való megkezdéséhez.
Miután a Unity befejezte az építést (eltarthat egy ideig), meg kell nyitnia egy Fájlkezelő ablakot a build helyén.
Üzembe helyezés helyi gépen:
Nyissa meg az előző fejezetben létrehozott megoldásfájlt a Visual Studióban.
A Megoldásplatformon válassza az x86, Helyi gép lehetőséget.
A Megoldás konfigurációja területen válassza a Hibakeresés lehetőséget.
A Microsoft HoloLens egyszerűbben beállíthatja távoli gépre, hogy ne legyen a számítógéphez kötve. Azonban a következőket is el kell végeznie:
- Ismerje meg a HoloLens IP-címét , amely a Beállítások > hálózat & az Internet > Wi-Fi > Speciális beállítások területen található; az IPv4 a használni kívánt cím.
- Győződjön meg arról, hogy a fejlesztői módbe van kapcsolva; A következőt találja: Gépházban > Frissítés & Biztonsági beállítások > fejlesztőknek.
Nyissa meg a Build (Build) menüt , és kattintson a Deploy Solution (Megoldás üzembe helyezése ) elemre az alkalmazás gépre való közvetlen telepítéséhez.
Az alkalmazásnak most már meg kell jelennie a telepített alkalmazások listájában, készen áll az indításra!
Az indítás után az alkalmazás kérni fogja, hogy engedélyezze a mikrofonhoz való hozzáférést. A Mozgásvezérlők, a Hangbemenet vagy a Billentyűzet segítségével nyomja le az IGEN gombot.
12. fejezet – A LUIS-szolgáltatás fejlesztése
Fontos
Ez a fejezet rendkívül fontos, és előfordulhat, hogy többször is meg kell ismételnünk, mivel ez segít a LUIS-szolgáltatás pontosságának javításában: győződjön meg arról, hogy ezt elvégezte.
A LUIS által biztosított megértési szint javításához új kimondott szövegeket kell rögzítenie, és azokkal újra be kell tanítania a LUIS-alkalmazást.
Előfordulhat például, hogy betanította a LUIS-t a "Növelés" és az "Upsize" megértéséhez, de nem szeretné, hogy az alkalmazás megértse az olyan szavakat is, mint a "Nagyítás"?
Miután néhányszor használta az alkalmazást, a LUIS összegyűjti és elérhetővé teszi azokat a LUIS-portálon, amelyeket ön mondott.
Nyissa meg a portálalkalmazást a hivatkozás után, és jelentkezzen be.
Miután bejelentkezett az MS hitelesítő adataival, kattintson az alkalmazás nevére.
Kattintson a végponti kimondott szövegek áttekintése gombra az oldal bal oldalán.
Megjelenik azoknak a kimondott szövegeknek a listája, amelyeket a vegyes valósági alkalmazás küldött a LUIS-nak.
Megfigyelhet néhány kiemelt entitást.
Ha az egérmutatót az egyes kiemelt szavak fölé viszi, áttekintheti az egyes kimondott szövegeket, és megállapíthatja, hogy melyik entitás lett helyesen felismerve, mely entitások hibásak, és mely entitások hiányoznak.
A fenti példában azt találták, hogy a "lándzsás" szó ki van emelve célként, ezért ki kell javítani a hibát, ami úgy történik, hogy az egérrel rámutat a szóra, és a Címke eltávolítása gombra kattint.
Ha teljesen helytelen kimondott szövegeket talál, törölheti őket a képernyő jobb oldalán található Törlés gombbal.
Vagy ha úgy érzi, hogy a LUIS helyesen értelmezte a kimondott szöveget, az Igazított szándék hozzáadása gombbal ellenőrizheti annak megértését.
Az összes megjelenített kimondott szöveg rendezése után próbálja meg újra betölteni a lapot, és ellenőrizze, hogy vannak-e továbbiak.
Nagyon fontos, hogy a lehető legtöbb alkalommal megismételjük ezt a folyamatot az alkalmazás megértésének javítása érdekében.
Jó munkát!
A kész LUIS integrált alkalmazás
Gratulálunk, olyan vegyes valósági alkalmazást készített, amely az Azure Language Understanding Intelligence Service-t használja, hogy megértse, mit mond egy felhasználó, és reagáljon az információkra.
Soron kívüli gyakorlatok
1. gyakorlat
Az alkalmazás használata során észreveheti, hogy ha a Floor objektumra néz, és megkéri, hogy módosítsa a színét, akkor ezt fogja tenni. Meg tudja akadályozni, hogy az alkalmazás módosítsa a Floor színét?
2. gyakorlat
Próbálja kiterjeszteni a LUIS és az alkalmazás képességeit, és adjon hozzá további funkciókat a jelenetben lévő objektumokhoz; Például hozzon létre új objektumokat a Tekintet találati ponton attól függően, hogy mit mond a felhasználó, majd használhatja ezeket az objektumokat az aktuális jelenetobjektumokkal együtt a meglévő parancsokkal.