Urządzenia HoloLens (1. generacji) i Azure 303: rozpoznawanie języka naturalnego (LUIS)
Uwaga
Samouczki Mixed Reality Academy zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji) i Mixed Reality immersywnych zestawów słuchawkowych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków w miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania dla tych urządzeń. Te samouczki nie zostaną zaktualizowane o najnowsze zestawy narzędzi ani interakcje używane na potrzeby HoloLens 2. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. W przyszłości zostanie opublikowana nowa seria samouczków, które pokażą, jak opracowywać na potrzeby HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.
Z tego kursu dowiesz się, jak zintegrować Language Understanding z aplikacją rzeczywistości mieszanej przy użyciu usług Azure Cognitive Services z interfejsem API Language Understanding.
Language Understanding (LUIS) to usługa platformy Microsoft Azure, która zapewnia aplikacjom możliwość tworzenia znaczenia z danych wejściowych użytkownika, takich jak wyodrębnianie tego, czego może chcieć dana osoba, w swoich słowach. Jest to realizowane za pomocą uczenia maszynowego, które rozumie i uczy się informacji wejściowych, a następnie może odpowiedzieć za pomocą szczegółowych, istotnych informacji. Aby uzyskać więcej informacji, odwiedź stronę usługi Azure Language Understanding (LUIS).
Po ukończeniu tego kursu będziesz mieć aplikację immersywną rzeczywistości mieszanej, która będzie mogła wykonać następujące czynności:
- Przechwyć mowę wejściową użytkownika przy użyciu mikrofonu dołączonego do immersywnego zestawu nagłownego.
- Wyślij przechwycone dyktowanie w usłudze Azure Language Understanding Intelligent Service (LUIS).
- Poproś usługę LUIS o wyodrębnienie znaczenia z informacji o wysyłaniu, które zostaną przeanalizowane, i podjęcie próby określenia intencji żądania użytkownika.
Programowanie będzie obejmować tworzenie aplikacji, w której użytkownik będzie mógł używać głosu i/lub spojrzenia w celu zmiany rozmiaru i koloru obiektów w scenie. Korzystanie z kontrolerów ruchu nie będzie objęte.
W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs jest przeznaczony do nauki integrowania usługi platformy Azure z projektem aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy zdobytą z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej.
Przygotuj się na szkolenie usługi LUIS kilka razy, co zostało omówione w rozdziale 12. Uzyskasz lepsze wyniki, tym więcej razy usługa LUIS została wytrenowana.
Obsługa urządzeń
Kurs | HoloLens | Immersyjne zestawy nagłowne |
---|---|---|
MR i Azure 303: Rozpoznawanie języka naturalnego (LUIS) | ✔️ | ✔️ |
Uwaga
Chociaż ten kurs koncentruje się głównie na Windows Mixed Reality immersywnych zestawach słuchawkowych (VR), możesz również zastosować to, czego uczysz się w tym kursie, aby Microsoft HoloLens. Wraz z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być konieczne do zastosowania w celu obsługi urządzenia HoloLens. Podczas korzystania z urządzenia HoloLens można zauważyć pewne echo podczas przechwytywania głosu.
Wymagania wstępne
Uwaga
Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Możesz korzystać z najnowszego oprogramowania, jak wymieniono w artykule dotyczącym instalacji narzędzi , choć nie należy zakładać, że informacje w tym kursie doskonale pasują do tego, co znajdziesz w nowszym oprogramowaniu niż wymienione poniżej.
Na potrzeby tego kursu zalecamy następujący sprzęt i oprogramowanie:
- Komputer deweloperów, zgodny z Windows Mixed Reality na potrzeby opracowywania immersywnych zestawów słuchawkowych (VR)
- Windows 10 Fall Creators Update (lub nowszy) z włączonym trybem dewelopera
- Najnowszy zestaw SDK Windows 10
- Unity 2017.4
- Visual Studio 2017
- Zestaw słuchawkowy Windows Mixed Reality immersywny (VR) lub Microsoft HoloLens z włączonym trybem dewelopera
- Zestaw słuchawek z wbudowanym mikrofonem (jeśli zestaw słuchawkowy nie ma wbudowanego mikrofonu i głośników)
- Dostęp do Internetu na potrzeby instalacji platformy Azure i pobierania usługi LUIS
Przed rozpoczęciem
Aby uniknąć problemów podczas tworzenia tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
Aby zezwolić maszynie na włączanie dyktowania, przejdź do pozycji Ustawienia >> systemu Windows Prywatność mowa, & pisanie odręczne i naciśnij przycisk Włącz usługi mowy i sugestie pisania.
Kod w tym samouczku umożliwi nagrywanie z domyślnego urządzenia mikrofonu ustawionego na maszynie. Upewnij się, że domyślne urządzenie mikrofonu jest ustawione jako urządzenie, którego chcesz użyć do przechwytywania głosu.
Jeśli zestaw słuchawkowy ma wbudowany mikrofon, upewnij się, że opcja "Gdy nosim zestaw słuchawkowy, przełącznik do mikrofonu nagłownego" jest włączona w ustawieniach portalu Mixed Reality.
Rozdział 1 — Konfigurowanie witryny Azure Portal
Aby korzystać z usługi Language Understanding na platformie Azure, należy skonfigurować wystąpienie usługi, aby było dostępne dla aplikacji.
Zaloguj się do witryny Azure Portal.
Uwaga
Jeśli nie masz jeszcze konta platformy Azure, musisz je utworzyć. Jeśli korzystasz z tego samouczka w sytuacji na potrzeby zajęć lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc przy konfigurowaniu nowego konta.
Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj Language Understanding, a następnie kliknij przycisk Enter.
Uwaga
Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.
Nowa strona po prawej stronie zawiera opis usługi Language Understanding. W lewym dolnym rogu tej strony wybierz przycisk Utwórz , aby utworzyć wystąpienie tej usługi.
Po kliknięciu pozycji Utwórz:
Wstaw żądaną nazwę dla tego wystąpienia usługi.
Wybierz subskrypcję.
Wybierz warstwę cenową odpowiednią dla Ciebie, jeśli po raz pierwszy utworzysz usługę LUIS, powinna być dostępna warstwa bezpłatna (o nazwie F0). Bezpłatna alokacja powinna być większa niż wystarczająca dla tego kursu.
Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się przechowywanie wszystkich usług platformy Azure skojarzonych z pojedynczym projektem (np. takimi jak te kursy) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, odwiedź artykuł grupy zasobów.
Określ lokalizację grupy zasobów (jeśli tworzysz nową grupę zasobów). Lokalizacja najlepiej będzie znajdować się w regionie, w którym będzie uruchamiana aplikacja. Niektóre zasoby platformy Azure są dostępne tylko w niektórych regionach.
Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.
Wybierz przycisk Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi. Może to potrwać minutę.
Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.
Kliknij powiadomienie, aby zapoznać się z nowym wystąpieniem usługi.
Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowego wystąpienia usługi LUIS.
W ramach tego samouczka aplikacja będzie musiała wykonywać wywołania usługi, co odbywa się za pomocą klucza subskrypcji usługi.
Na stronie Szybki start usługi INTERFEJS API usługi LUIS przejdź do pierwszego kroku, pobierz klucze i kliknij pozycję Klucze (możesz to również osiągnąć, klikając niebieskie hiperlinki Klucze, znajdujące się w menu nawigacji usług, oznaczone ikoną klucza). Spowoduje to wyświetlenie kluczy usługi.
Pobierz kopię jednego z wyświetlanych kluczy, ponieważ będzie to potrzebne w dalszej części projektu.
Na stronie Usługa kliknij pozycję Language Understanding Portal, aby zostać przekierowany do strony internetowej, której użyjesz do utworzenia nowej usługi w aplikacji usługi LUIS.
Rozdział 2 — portal Language Understanding
W tej sekcji dowiesz się, jak utworzyć aplikację usługi LUIS w portalu usługi LUIS.
Ważne
Należy pamiętać, że skonfigurowanie jednostek,intencji i wypowiedzi w tym rozdziale jest tylko pierwszym krokiem tworzenia usługi LUIS: należy również ponownie trenować usługę, kilka razy, aby zwiększyć jej dokładność. Ponowne trenowanie usługi zostało omówione w ostatnim rozdziale tego kursu, dlatego upewnij się, że została ukończona.
Po dotarciu do portalu Language Understanding może być konieczne zalogowanie się, jeśli jeszcze tego nie zrobiono, przy użyciu tych samych poświadczeń co Azure Portal.
Jeśli używasz usługi LUIS po raz pierwszy, musisz przewinąć w dół do dołu strony powitalnej, aby znaleźć i kliknąć przycisk Utwórz aplikację usługi LUIS .
Po zalogowaniu kliknij pozycję Moje aplikacje (jeśli nie jesteś obecnie w tej sekcji). Następnie możesz kliknąć pozycję Utwórz nową aplikację.
Nadaj aplikacji nazwę.
Jeśli aplikacja powinna rozumieć język inny niż angielski, należy zmienić kulturę na odpowiedni język.
W tym miejscu możesz również dodać opis nowej aplikacji usługi LUIS.
Po naciśnięciu przycisku Gotowe wprowadź stronę Kompilacja nowej aplikacji LUIS .
Istnieje kilka ważnych pojęć, które należy zrozumieć tutaj:
- Intencja reprezentuje metodę, która będzie wywoływana po zapytaniu od użytkownika. Intencja może mieć co najmniej jedną jednostkę.
- Jednostka jest składnikiem zapytania opisującego informacje istotne dla intencji.
- Wypowiedzi to przykłady zapytań dostarczonych przez dewelopera, których usługa LUIS będzie używać do trenowania.
Jeśli te pojęcia nie są całkowicie jasne, nie martw się, ponieważ ten kurs wyjaśni je dalej w tym rozdziale.
Rozpoczniesz od utworzenia jednostek potrzebnych do utworzenia tego kursu.
Po lewej stronie kliknij pozycję Jednostki, a następnie kliknij pozycję Utwórz nową jednostkę.
Wywołaj nowy kolor jednostki, ustaw jego typ na Prosty, a następnie naciśnij przycisk Gotowe.
Powtórz ten proces, aby utworzyć trzy (3) więcej jednostek prostych o nazwie:
- Rozbudować
- downsize
- Docelowego
Wynik powinien wyglądać podobnie do poniższego obrazu:
W tym momencie możesz rozpocząć tworzenie intencji.
Ostrzeżenie
Nie usuwaj intencji None .
Po lewej stronie kliknij pozycję Intents (Intencje), a następnie kliknij pozycję Create new intent (Utwórz nową intencję).
Wywołaj nową intencjęChangeObjectColor.
Ważne
Ta nazwa intencji jest używana w kodzie w dalszej części tego kursu, dlatego w celu uzyskania najlepszych wyników użyj tej nazwy dokładnie tak, jak podano.
Po potwierdzeniu nazwy nastąpi przekierowanie do strony Intencje.
Zauważysz, że istnieje pole tekstowe z prośbą o wpisanie co najmniej 5 różnych wypowiedzi.
Uwaga
Usługa LUIS konwertuje wszystkie wypowiedzi na małe litery.
- Wstaw następującą wypowiedź w górnym polu tekstowym (obecnie z tekstem Wpisz około 5 przykładów... ) i naciśnij klawisz Enter:
The color of the cylinder must be red
Zauważysz, że nowa wypowiedź będzie wyświetlana na liście poniżej.
Po wykonaniu tego samego procesu wstaw następujące sześć (6) wypowiedzi:
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
Dla każdej utworzonej wypowiedzi należy określić, które słowa powinny być używane przez usługę LUIS jako jednostki. W tym przykładzie należy oznaczyć wszystkie kolory jako jednostkę koloru i wszystkie możliwe odwołania do elementu docelowego jako jednostkę docelową .
W tym celu spróbuj kliknąć wyraz cylinder w pierwszej wypowiedzi i wybrać element docelowy.
Teraz kliknij wyraz czerwony w pierwszej wypowiedzi i wybierz kolor.
Etykietuj również następny wiersz, gdzie moduł powinien być elementem docelowym, a czarny powinien być kolorem. Zwróć również uwagę na użycie wyrazów "this", "it" i "this object", które udostępniamy, tak aby nie było dostępnych również określonych typów docelowych.
Powtórz powyższy proces, aż wszystkie wypowiedzi mają etykietę Jednostki. Jeśli potrzebujesz pomocy, zapoznaj się z poniższym obrazem.
Porada
Podczas wybierania wyrazów, aby oznaczyć je jako jednostki:
- W przypadku pojedynczych wyrazów wystarczy je kliknąć.
- W przypadku zestawu co najmniej dwóch wyrazów kliknij na początku, a następnie na końcu zestawu.
Uwaga
Możesz użyć przycisku przełączania Widok tokenów , aby przełączać się między widokami jednostek/tokenów!
Wyniki powinny być widoczne na poniższych ilustracjach, pokazując widok Jednostki/tokeny:
W tym momencie naciśnij przycisk Train (Trenuj ) w prawym górnym rogu strony i poczekaj, aż mały okrągły wskaźnik na nim będzie zielony. Oznacza to, że usługa LUIS została pomyślnie wytrenowana do rozpoznawania tej intencji.
W ramach ćwiczenia utwórz nową intencję o nazwie ChangeObjectSize przy użyciu obiektu docelowego Entities, upsize i downsize.
Po wykonaniu tego samego procesu co poprzednia intencja wstaw następujące osiem (8) wypowiedzi dla zmiany rozmiaru :
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
Wynik powinien przypominać ten na poniższej ilustracji:
Po utworzeniu i wytrenowaniu obu intencji , ChangeObjectColor i ChangeObjectSize kliknij przycisk PUBLIKUJ w górnej części strony.
Na stronie Publikowanie opublikujesz i opublikujesz aplikację usługi LUIS, aby można było uzyskać do niej dostęp za pomocą kodu.
Ustaw listę rozwijaną Publikuj do jako środowisko produkcyjne.
Ustaw strefę czasową na strefę czasową.
Zaznacz pole wyboru Uwzględnij wszystkie przewidywane wyniki intencji.
Kliknij pozycję Publikuj w miejscu produkcyjnym.
W sekcji Zasoby i klucze:
- Wybierz region ustawiony dla wystąpienia usługi w witrynie Azure Portal.
- Zauważysz Starter_Key element poniżej, zignoruj go.
- Kliknij pozycję Dodaj klucz i wstaw klucz uzyskany w witrynie Azure Portal podczas tworzenia wystąpienia usługi. Jeśli platforma Azure i portal usługi LUIS są rejestrowane w tym samym użytkowniku, zostaną wyświetlone menu rozwijane dla pola Nazwa dzierżawy, Nazwa subskrypcji i Klucz , którego chcesz użyć (będzie mieć taką samą nazwę, jak podano wcześniej w witrynie Azure Portal.
Ważne
W obszarze Punkt końcowy utwórz kopię punktu końcowego odpowiadającego wstawionemu kluczowi. Wkrótce użyjesz go w kodzie.
Rozdział 3 — Konfigurowanie projektu aparatu Unity
Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.
Otwórz aparat Unity i kliknij pozycję Nowy.
Teraz musisz podać nazwę projektu aparatu Unity, wstawić MR_LUIS. Upewnij się, że typ projektu jest ustawiony na wartość 3D. Ustaw lokalizację na odpowiednią dla Siebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.
Po otwarciu aparatu Unity warto sprawdzić, czy domyślny edytor skryptów jest ustawiony na program Visual Studio. Przejdź do pozycji Edytuj > preferencje, a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje .
Następnie przejdź do pozycji Ustawienia kompilacji plików > i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.
Przejdź do pozycji Ustawienia kompilacji pliku > i upewnij się, że:
Urządzenie docelowe jest ustawione na dowolne urządzenie
W przypadku Microsoft HoloLens ustaw wartość Urządzenie docelowe na HoloLens.
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Wersja programu Visual Studio jest ustawiona na najnowszą zainstalowaną
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
Zapisz scenę i dodaj ją do kompilacji.
Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
Utwórz nowy folder dla tego i dowolnego przyszłego sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.
Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz MR_LuisScene, a następnie naciśnij przycisk Zapisz.
Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.
W oknie Ustawienia kompilacji kliknij przycisk Ustawienia odtwarzacza , spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor .
W tym panelu należy zweryfikować kilka ustawień:
Na karcie Inne ustawienia :
Wersja środowiska uruchomieniowego skryptów powinna być stabilna (odpowiednik platformy.NET 3.5).
Zaplecze skryptów powinno mieć wartość .NET
Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6
Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:
InternetClient
Mikrofon
W dalszej części panelu w obszarze Ustawienia XR (znajdujące się poniżej ustawień publikowania) zaznacz opcję Virtual Reality Supported (Obsługa rzeczywistości wirtualnej), upewnij się, że dodano zestaw SDK Windows Mixed Reality.
W obszarze Ustawienia kompilacji Projekty aparatu Unity C# nie są już wyszarzone; zaznacz pole wyboru obok tego.
Zamknij okno Build Settings (Ustawienia kompilacji).
Zapisz scenę i projekt (PLIK > ZAPISZ SCENĘ / PLIK > ZAPISZ PROJEKT).
Rozdział 4 — Tworzenie sceny
Ważne
Jeśli chcesz pominąć składnik Unity Set up tego kursu i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 5.
Kliknij prawym przyciskiem myszy pusty obszar panelu hierarchii w obszarze Obiekt 3D, dodaj płaszczyznę.
Należy pamiętać, że po ponownym kliknięciu prawym przyciskiem myszy w hierarchii , aby utworzyć więcej obiektów, jeśli nadal wybrano ostatni obiekt, wybrany obiekt będzie elementem nadrzędnym nowego obiektu. Unikaj tego kliknięcia po lewej stronie w pustym miejscu w hierarchii, a następnie kliknij prawym przyciskiem myszy.
Powtórz poniższą procedurę, aby dodać następujące obiekty:
- Kula
- Cylinder
- Sześcian
- Tekst 3D
Wynikowa hierarchia sceny powinna być podobna do tej na poniższej ilustracji:
Kliknij prawym przyciskiem myszy aparat główny , aby go wybrać, spójrz na Panel inspektora , aby wyświetlić obiekt Aparat ze wszystkimi jego składnikami.
Kliknij przycisk Dodaj składnik znajdujący się u dołu Panelu inspektora.
Wyszukaj składnik o nazwie Źródło audio, jak pokazano powyżej.
Upewnij się również, że składnik Transform aparatu głównego jest ustawiony na (0,0,0), można to zrobić, naciskając ikonę Koła zębatego obok składnika Przekształcanie aparatu i wybierając pozycję Resetuj. Następnie składnik Transform powinien wyglądać następująco:
- Pozycja jest ustawiona na 0, 0, 0.
- Obrót jest ustawiony na wartość 0, 0, 0.
Uwaga
W przypadku Microsoft HoloLens należy również zmienić następujące elementy, które są częścią składnika Aparat fotograficzny, który znajduje się na głównym aparacie:
- Wyczyść flagi: Kolor stały.
- Tle "Czarny, Alfa 0" — kolor szesnastkowy: #00000000.
Kliknij pozycję Płaszczyzna po lewej stronie, aby ją wybrać. W Panelu inspektora ustaw składnik Transform z następującymi wartościami:
Oś X Oś Y Osi 0 -1 0 Kliknij prawym przyciskiem myszy pozycję Sphere , aby go wybrać. W Panelu inspektora ustaw składnik Transform z następującymi wartościami:
Oś X Oś Y Osi 2 1 2 Kliknij prawym przyciskiem myszy cylindra , aby go wybrać. W Panelu inspektora ustaw składnik Transform z następującymi wartościami:
Oś X Oś Y Osi -2 1 2 Kliknij lewym przyciskiem myszy moduł , aby go zaznaczyć. W Panelu inspektora ustaw składnik Transform z następującymi wartościami:
Przekształcanie — położenie
X | Y | Z |
---|---|---|
0 | 1 | 4 |
Przekształcanie — rotacja
X | Y | Z |
---|---|---|
45 | 45 | 0 |
- Kliknij lewym przyciskiem myszy obiekt Nowy tekst , aby go zaznaczyć. W Panelu inspektora ustaw składnik Transform z następującymi wartościami:
Przekształcanie — położenie
X | Y | Z |
---|---|---|
-2 | 6 | 9 |
Przekształcanie — skalowanie
X | Y | Z |
---|---|---|
0.1 | 0.1 | 0.1 |
Zmień rozmiar czcionki w składniku Siatki tekstu na 50.
Zmień nazwę obiektu Usługi Text Mesh na Tekst Dyktowania.
Struktura Panelu hierarchii powinna teraz wyglądać następująco:
Ostateczna scena powinna wyglądać podobnie do poniższej ilustracji:
Rozdział 5 — tworzenie klasy MicrophoneManager
Pierwszym utworzonym skryptem jest klasa MicrophoneManager . W tym celu utworzysz klasę LuisManager, zachowanie i ostatnio klasę Gaze (możesz utworzyć wszystkie te elementy teraz, choć zostanie ona omówiona w miarę dotarcia do każdego rozdziału).
Klasa MicrophoneManager jest odpowiedzialna za:
- Wykrywanie urządzenia rejestrującego dołączonego do zestawu słuchawkowego lub maszyny (niezależnie od tego, która jest domyślna).
- Przechwyć dźwięk (głos) i użyj dyktowania, aby zapisać go jako ciąg.
- Po wstrzymaniu głosu prześlij dyktowanie do klasy LuisManager .
Aby utworzyć tę klasę:
Kliknij prawym przyciskiem myszy panel projektu, utwórz > folder. Wywołaj skrypty folderu.
Po utworzeniu folderu Scripts kliknij go dwukrotnie, aby go otworzyć. Następnie w tym folderze kliknij prawym przyciskiem myszy pozycję Utwórz > skrypt języka C#. Nadaj skryptowi nazwę MicrophoneManager.
Kliknij dwukrotnie pozycję MikrofonManager , aby otworzyć go za pomocą programu Visual Studio.
Dodaj następujące przestrzenie nazw na początku pliku:
using UnityEngine; using UnityEngine.Windows.Speech;
Następnie dodaj następujące zmienne w klasie MicrophoneManager :
public static MicrophoneManager instance; //help to access instance of this object private DictationRecognizer dictationRecognizer; //Component converting speech to text public TextMesh dictationText; //a UI object used to debug dictation result
Należy teraz dodać kod dla metod Awake() i Start( ). Będą one wywoływane, gdy klasa inicjuje:
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"); } }
Teraz potrzebujesz metody używanej przez aplikację do uruchamiania i zatrzymywania przechwytywania głosu oraz przekazywania jej do klasy LuisManager , którą utworzysz wkrótce.
/// <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..."); }
Dodaj procedurę obsługi dyktowania , która zostanie wywołana po wstrzymaniu głosu. Ta metoda przekaże tekst dyktowania do klasy 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); }
Ważne
Usuń metodę Update(), ponieważ ta klasa nie będzie jej używać.
Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.
Uwaga
W tym momencie zauważysz błąd wyświetlany w panelu konsoli edytora aparatu Unity. Jest to spowodowane tym, że kod odwołuje się do klasy LuisManager , którą utworzysz w następnym rozdziale.
Rozdział 6 — tworzenie klasy LUISManager
Nadszedł czas, aby utworzyć klasę LuisManager , która spowoduje wywołanie usługi Azure LUIS.
Celem tej klasy jest odbieranie tekstu dyktowania z klasy MicrophoneManager i wysyłanie go do interfejsu API usługi Azure Language Understanding do przeanalizowania.
Ta klasa będzie deserializować odpowiedź JSON i wywołać odpowiednie metody klasy Behaviors w celu wyzwolenia akcji.
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Scripts (Skrypty ), aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję Create C# Script (Utwórz > skrypt języka C#). Nadaj skryptowi nazwę LuisManager.
Kliknij dwukrotnie skrypt, aby go otworzyć za pomocą programu Visual Studio.
Dodaj następujące przestrzenie nazw na początku pliku:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking;
Zaczniesz od utworzenia trzech klas w klasie LuisManager (w tym samym pliku skryptu powyżej metody Start(), która będzie reprezentować deserializowaną odpowiedź JSON z platformy 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; }
Następnie dodaj następujące zmienne w klasie LuisManager :
public static LuisManager instance; //Substitute the value of luis Endpoint with your own End Point string luisEndpoint = "https://westus.api.cognitive... add your endpoint from the Luis Portal";
Pamiętaj, aby umieścić punkt końcowy usługi LUIS w tej chwili (który będzie miał miejsce w portalu usługi LUIS).
Należy teraz dodać kod metody Awake(). Ta metoda zostanie wywołana, gdy klasa inicjuje:
private void Awake() { // allows this class instance to behave like a singleton instance = this; }
Teraz potrzebne są metody używane przez tę aplikację do wysyłania dyktowania odebranego z klasy MicrophoneManager do usługi LUIS, a następnie odbierania i deserializacji odpowiedzi.
Po określeniu wartości intencji i skojarzonych jednostek zostaną one przekazane do wystąpienia klasy Zachowania w celu wyzwolenia zamierzonej akcji.
/// <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; } }
Utwórz nową metodę o nazwie AnalysisResponseElements(), która odczytuje wynikową metodę AnalysisdQuery i określ jednostki. Po określeniu tych jednostek zostaną one przekazane do wystąpienia klasy Behaviors do użycia w akcjach.
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; } }
Ważne
Usuń metody Start() i Update(), ponieważ ta klasa nie będzie ich używać.
Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.
Uwaga
W tym momencie zauważysz kilka błędów wyświetlanych w panelu konsoli edytora aparatu Unity. Jest to spowodowane tym, że kod odwołuje się do klasy Zachowania , którą utworzysz w następnym rozdziale.
Rozdział 7 — Tworzenie klasy Zachowania
Klasa Behaviors wyzwoli akcje przy użyciu jednostek dostarczonych przez klasę LuisManager .
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Scripts (Skrypty ), aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję Create C# Script (Utwórz > skrypt języka C#). Nadaj skryptowi nazwę Zachowanie.
Kliknij dwukrotnie skrypt, aby go otworzyć za pomocą programu Visual Studio.
Następnie dodaj następujące zmienne w klasie Behaviors :
public static Behaviours instance; // the following variables are references to possible targets public GameObject sphere; public GameObject cylinder; public GameObject cube; internal GameObject gazedTarget;
Dodaj kod metody Awake(). Ta metoda zostanie wywołana, gdy klasa inicjuje:
void Awake() { // allows this class instance to behave like a singleton instance = this; }
Następujące metody są wywoływane przez klasę LuisManager (utworzoną wcześniej), aby określić, który obiekt jest obiektem docelowym zapytania, a następnie wyzwolić odpowiednią akcję.
/// <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); }
Dodaj metodę FindTarget(), aby określić, która z obiektów GameObjects jest elementem docelowym bieżącej intencji. Ta metoda domyślnie obiekt docelowy obiektu GameObject jest "patrzyny", jeśli w jednostkach nie zdefiniowano żadnego jawnego obiektu docelowego.
/// <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; }
Ważne
Usuń metody Start() i Update(), ponieważ ta klasa nie będzie ich używać.
Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.
Rozdział 8 — tworzenie klasy spojrzenia
Ostatnia klasa, którą musisz ukończyć, to klasa Gaze . Ta klasa aktualizuje odwołanie do obiektu GameObject obecnie w fokusie wizualizacji użytkownika.
Aby utworzyć tę klasę:
Kliknij dwukrotnie folder Scripts (Skrypty ), aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję Create C# Script (Utwórz > skrypt języka C#). Nadaj nazwę gazecie skryptu.
Kliknij dwukrotnie skrypt, aby go otworzyć za pomocą programu Visual Studio.
Wstaw następujący kod dla tej klasy:
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; } } }
Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.
Rozdział 9 — kończenie konfiguracji sceny
Aby ukończyć instalację sceny, przeciągnij każdy skrypt utworzony z folderu Scripts do obiektu Main Camera w panelu hierarchii.
Wybierz kamerę główną i przyjrzyj się panelowi inspektora. Powinien być widoczny każdy dołączony skrypt i zauważysz, że na każdym skrypcie są jeszcze ustawione parametry.
Aby poprawnie ustawić te parametry, wykonaj następujące instrukcje:
MikrofonManager:
- Z panelu hierarchii przeciągnij obiekt Text Dictation do pola wartości parametru Dictation Text .
Zachowania z panelu hierarchii:
- Przeciągnij obiekt Sphere do pola docelowego odwołania do usługi Sphere .
- Przeciągnij cylindra do pola docelowego odniesienia cylindra .
- Przeciągnij moduł do pola docelowego odwołania do modułu .
Spojrzenie:
- Ustaw maksymalną odległość spojrzenia na 300 (jeśli jeszcze nie jest).
Wynik powinien wyglądać podobnie do poniższego obrazu:
Rozdział 10 — testowanie w edytorze aparatu Unity
Przetestuj, czy konfiguracja sceny jest prawidłowo zaimplementowana.
Upewnij się, że:
- Wszystkie skrypty są dołączone do obiektu Main Camera .
- Wszystkie pola w głównym panelu inspektora kamery są prawidłowo przypisywane.
Naciśnij przycisk Odtwórz w edytorze aparatu Unity. Aplikacja powinna być uruchomiona w dołączonym immersywnym zestawie słuchawkowym.
Spróbuj wykonać kilka wypowiedzi, takich jak:
make the cylinder red change the cube to yellow I want the sphere blue make this to green change it to white
Uwaga
Jeśli w konsoli aparatu Unity zostanie wyświetlony błąd dotyczący zmiany domyślnego urządzenia audio, scena może nie działać zgodnie z oczekiwaniami. Wynika to ze sposobu, w jaki portal rzeczywistości mieszanej zajmuje się wbudowanymi mikrofonami dla zestawów słuchawkowych, które je mają. Jeśli ten błąd zostanie wyświetlony, po prostu zatrzymaj scenę i uruchom ją ponownie, a wszystko powinno działać zgodnie z oczekiwaniami.
Rozdział 11 — kompilowanie i ładowanie bezpośrednie rozwiązania platformy UWP
Po upewnieniu się, że aplikacja działa w Edytorze aparatu Unity, możesz przystąpić do kompilowania i wdrażania.
Aby skompilować:
Zapisz bieżącą scenę, klikając pozycję Zapisz plik>.
Przejdź do pozycji Ustawienia kompilacji pliku>.
Zaznacz pole o nazwie Unity C# Projects (przydatne do wyświetlania i debugowania kodu po utworzeniu projektu platformy UWP.
Kliknij pozycję Dodaj otwarte sceny, a następnie kliknij pozycję Kompiluj.
Zostanie wyświetlony monit o wybranie folderu, w którym chcesz skompilować rozwiązanie.
Utwórz folder BUILDS i w tym folderze utwórz inny folder z wybraną odpowiednią nazwą.
Kliknij pozycję Wybierz folder , aby rozpocząć kompilację w tej lokalizacji.
Po zakończeniu kompilowania aparatu Unity (może to zająć trochę czasu), powinno zostać otwarte okno Eksplorator plików w lokalizacji kompilacji.
Aby wdrożyć na komputerze lokalnym:
W programie Visual Studio otwórz plik rozwiązania utworzony w poprzednim rozdziale.
W obszarze Platforma rozwiązania wybierz pozycję x86, Komputer lokalny.
W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.
W przypadku Microsoft HoloLens można łatwiej ustawić tę opcję na Maszynę zdalną, aby nie być nastawiona na komputer. Należy jednak również wykonać następujące czynności:
- Poznaj adres IP urządzenia HoloLens, który można znaleźć w obszarze Ustawienia > sieci & Opcje zaawansowane Wi-Fi > Internet>; adres IPv4 jest adresem, którego należy użyć.
- Upewnij się, że tryb dewelopera jest włączony; znaleziono w temacie Ustawienia > Aktualizuj & Zabezpieczenia > dla deweloperów.
Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie , aby załadować aplikację bezpośrednio na maszynę.
Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji, gotowych do uruchomienia.
Po uruchomieniu aplikacja wyświetli monit o autoryzowanie dostępu do mikrofonu. Użyj kontrolerów ruchu lub danych wejściowych głosu lub klawiatury , aby nacisnąć przycisk TAK .
Rozdział 12 — Ulepszanie usługi LUIS
Ważne
Ten rozdział jest niezwykle ważny i może wymagać iteracji kilka razy, ponieważ pomoże to poprawić dokładność usługi LUIS: upewnij się, że wykonasz tę funkcję.
Aby poprawić poziom zrozumienia dostarczony przez usługę LUIS, musisz przechwycić nowe wypowiedzi i użyć ich do ponownego trenowania aplikacji usługi LUIS.
Na przykład możesz wytrenować usługę LUIS, aby zrozumieć "Zwiększenie" i "Upsize", ale nie chcesz, aby aplikacja zrozumiała również słowa takie jak "Powiększanie"?
Gdy aplikacja została użyta kilka razy, wszystko, co powiedziałeś, zostanie zebrane przez usługę LUIS i będzie dostępne w portalu usługi LUIS.
Przejdź do aplikacji portalu, postępując zgodnie z tym linkiem i zaloguj się.
Po zalogowaniu się przy użyciu poświadczeń ms kliknij swoją nazwę aplikacji.
Kliknij przycisk Przejrzyj wypowiedzi punktu końcowego po lewej stronie.
Zostanie wyświetlona lista wypowiedzi wysłanych do usługi LUIS przez aplikację rzeczywistości mieszanej.
Zauważysz niektóre wyróżnione jednostki.
Po umieszczeniu wskaźnika myszy na każdym wyróżnionym słowie możesz przejrzeć każdą wypowiedź i określić, która jednostka została prawidłowo rozpoznana, które jednostki są nieprawidłowe i które jednostki zostały pominięte.
W powyższym przykładzie stwierdzono, że słowo "włócznia" zostało wyróżnione jako element docelowy, dlatego konieczne jest skorygowanie błędu, co jest wykonywane przez umieszczenie kursora na słowie za pomocą myszy i kliknięcie przycisku Usuń etykietę.
Jeśli znajdziesz wypowiedzi, które są całkowicie nieprawidłowe, możesz je usunąć przy użyciu przycisku Usuń po prawej stronie ekranu.
Jeśli uważasz, że usługa LUIS poprawnie zinterpretowała wypowiedź, możesz zweryfikować jego zrozumienie za pomocą przycisku Dodaj do wyrównanej intencji .
Po posortowania wszystkich wyświetlanych wypowiedzi spróbuj ponownie załadować stronę, aby sprawdzić, czy więcej jest dostępnych.
Bardzo ważne jest, aby powtórzyć ten proces tak wiele razy, jak to możliwe, aby poprawić zrozumienie aplikacji.
Baw się dobrze!
Zakończona aplikacja zintegrowana z usługą LUIS
Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z usługi Azure Language Understanding Intelligence Service, aby zrozumieć, co mówi użytkownik i jak działa na temat tych informacji.
Ćwiczenia dodatkowe
Ćwiczenie 1
Korzystając z tej aplikacji, możesz zauważyć, że jeśli patrzysz na obiekt Floor i poprosisz o zmianę koloru, zrobi to. Czy możesz dowiedzieć się, jak zatrzymać zmianę koloru podłogi w aplikacji?
Ćwiczenie 2
Spróbuj rozszerzyć możliwości usługi LUIS i aplikacji, dodając dodatkowe funkcje dla obiektów w scenie; na przykład utwórz nowe obiekty w punkcie trafienia gazecie, w zależności od tego, co mówi użytkownik, a następnie być w stanie używać tych obiektów obok bieżących obiektów sceny z istniejącymi poleceniami.