Wprowadzanie głosu w a środowisku Unity

Przestroga

Przed rozpoczęciem rozważ użycie wtyczki aparatu Unity dla zestawu SDK usług Cognitive Speech Services. Wtyczka ma lepsze wyniki dokładności mowy i łatwy dostęp do dekodowania mowy na tekst, a także zaawansowane funkcje mowy, takie jak okno dialogowe, interakcja oparta na intencji, tłumaczenie, synteza tekstu na mowę i rozpoznawanie mowy w języku naturalnym. Aby rozpocząć pracę, zapoznaj się z przykładową dokumentacją i dokumentacją.

Aparat Unity uwidacznia trzy sposoby dodawania danych wejściowych funkcji Voice do aplikacji Aparatu Unity, z których pierwsze dwa są typami PhraseRecognizer:

  • Aplikacja KeywordRecognizer dostarcza tablicę poleceń ciągu do nasłuchiwania
  • Element GrammarRecognizer zapewnia aplikacji plik SRGS definiujący konkretną gramatykę do nasłuchiwania
  • Aplikacja DictationRecognizer umożliwia aplikacji nasłuchiwanie dowolnego słowa i dostarczanie użytkownikowi notatki lub innego wyświetlania mowy

Uwaga

Nie można jednocześnie obsługiwać dyktowania i rozpoznawania fraz. Jeśli element GrammarRecognizer lub KeywordRecognizer jest aktywny, element DictationRecognizer nie może być aktywny i odwrotnie.

Włączanie możliwości funkcji voice

Aby aplikacja korzystała z danych wejściowych głosowych, należy zadeklarować możliwość mikrofonu .

  1. W edytorze aparatu Unity przejdź do pozycji Edytuj > odtwarzacz ustawień > projektu
  2. Wybierz kartę Sklep Windows
  3. W sekcji Możliwości ustawień > publikowania sprawdź możliwości mikrofonu
  4. Udzielanie aplikacji uprawnień dostępu do mikrofonu na urządzeniu HoloLens
    • Zostanie wyświetlony monit o wykonanie tej czynności podczas uruchamiania urządzenia, ale jeśli przypadkowo klikniesz przycisk "Nie", możesz zmienić uprawnienia w ustawieniach urządzenia

Rozpoznawanie fraz

Aby umożliwić aplikacji nasłuchiwanie określonych fraz wypowiadanych przez użytkownika, należy wykonać pewne działania:

  1. Określanie fraz do nasłuchiwania przy użyciu elementu KeywordRecognizer lub GrammarRecognizer
  2. Obsługa zdarzenia OnPhraseRecognized i podejmowanie akcji odpowiadającej rozpoznaniu frazy

Słowo kluczoweRecognizer

Przestrzeń nazw:UnityEngine.Windows.Speech
Typy:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Aby zapisać kilka naciśnięć klawiszy, będziemy potrzebować kilku instrukcji using:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

Następnie dodajmy kilka pól do klasy, aby przechowywać słownik recognizer i keyword-action>:

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

Teraz dodaj słowo kluczowe do słownika, na przykład w metodzie Start() . W tym przykładzie dodajemy słowo kluczowe "activate":

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

Utwórz aparat rozpoznawania słów kluczowych i poinformuj go o tym, co chcemy rozpoznać:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

Teraz zarejestruj się na potrzeby OnPhraseRecognized zdarzenia

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Przykładowa procedura obsługi to:

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    System.Action keywordAction;
    // if the keyword recognized is in our dictionary, call that Action.
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
        keywordAction.Invoke();
    }
}

Na koniec zacznij rozpoznawać!

keywordRecognizer.Start();

GrammarRecognizer

Przestrzeń nazw:UnityEngine.Windows.Speech
Typy: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Funkcja GrammarRecognizer jest używana, jeśli określasz gramatykę rozpoznawania przy użyciu biblioteki SRGS. Może to być przydatne, jeśli aplikacja ma więcej niż kilka słów kluczowych, jeśli chcesz rozpoznać bardziej złożone frazy lub jeśli chcesz łatwo włączyć i wyłączyć zestawy poleceń. Zobacz: Create Grammars Using SRGS XML (Tworzenie gramatyki przy użyciu formatu SRGS XML ), aby uzyskać informacje o formacie pliku.

Gdy masz gramatykę SRGS i znajduje się ona w projekcie w folderze Zasoby przesyłania strumieniowego:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

Utwórz element GrammarRecognizer i przekaż ścieżkę do pliku SRGS:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

Teraz zarejestruj się na potrzeby OnPhraseRecognized zdarzenia

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Otrzymasz wywołanie zwrotne zawierające informacje określone w gramatyce SRGS, którą można odpowiednio obsłużyć. Większość ważnych informacji zostanie podana w tablicy semanticMeanings .

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

Na koniec zacznij rozpoznawać!

grammarRecognizer.Start();

Dyktowania

Przestrzeń nazw:UnityEngine.Windows.Speech
Typy: DictationRecognizer, SpeechError, SpeechSystemStatus

Użyj elementu , DictationRecognizer aby przekonwertować mowę użytkownika na tekst. Element DictationRecognizer uwidacznia funkcję dyktowania i obsługuje rejestrowanie i nasłuchiwanie zdarzeń dotyczących hipotez i fraz zakończonych, dzięki czemu możesz przekazać opinię użytkownikowi zarówno podczas wypowiadania, jak i później. Start() metody i Stop() odpowiednio włączają i wyłączają rozpoznawanie dyktowania. Po wykonaniu operacji rozpoznawania należy go usunąć przy użyciu polecenia Dispose() w celu zwolnienia używanych zasobów. Spowoduje to automatyczne zwolnienie tych zasobów podczas odzyskiwania pamięci przy dodatkowych kosztach wydajności, jeśli nie zostaną one wydane wcześniej.

Aby rozpocząć dyktowanie, należy wykonać tylko kilka kroków:

  1. Tworzenie nowego DictationRecognizer
  2. Obsługa zdarzeń dyktowania
  3. Uruchamianie elementu DictationRecognizer

Włączanie możliwości dyktowania

Aby aplikacja korzystała z dyktowania, należy zadeklarować możliwości klienta internetowego i mikrofonu :

  1. W edytorze aparatu Unity przejdź do pozycji Edytuj > odtwarzacz ustawień > projektu
  2. Wybierz na karcie Sklep Windows
  3. W sekcji Możliwości ustawień > publikowania sprawdź możliwości InternetClient
    • Opcjonalnie, jeśli mikrofon nie został jeszcze włączony, sprawdź możliwości mikrofonu
  4. Udzielanie aplikacji uprawnień dostępu do mikrofonu na urządzeniu HoloLens, jeśli jeszcze tego nie zrobiono
    • Zostanie wyświetlony monit o wykonanie tej czynności podczas uruchamiania urządzenia, ale jeśli przypadkowo klikniesz przycisk "Nie", możesz zmienić uprawnienia w ustawieniach urządzenia

DictationRecognizer

Utwórz element DictationRecognizer w następujący sposób:

dictationRecognizer = new DictationRecognizer();

Istnieją cztery zdarzenia dyktowania, które można subskrybować i obsługiwać w celu zaimplementowania zachowania dyktowania.

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. DictationError

DictationResult

To zdarzenie jest wyzwalane po wstrzymaniu użytkownika, zazwyczaj na końcu zdania. Pełny rozpoznany ciąg jest zwracany tutaj.

Najpierw zasubskrybuj DictationResult zdarzenie:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Następnie obsłuż wywołanie zwrotne DictationResult:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

DyktowanieHypoteza

To zdarzenie jest uruchamiane w sposób ciągły, gdy użytkownik rozmawia. Gdy rozpoznawanie nasłuchuje, dostarcza tekst tego, co jest do tej pory słyszane.

Najpierw zasubskrybuj DictationHypothesis zdarzenie:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Następnie obsłuż wywołanie zwrotne DictationHypothesis:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

DictationComplete

To zdarzenie jest wyzwalane, gdy rozpoznawanie zatrzymuje się, czy z stop() jest wywoływany, występuje przekroczenie limitu czasu lub inny błąd.

Najpierw zasubskrybuj DictationComplete zdarzenie:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Następnie obsłuż wywołanie zwrotne DictationComplete:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

Błąd Dyktowania

To zdarzenie jest wyzwalane, gdy wystąpi błąd.

Najpierw zasubskrybuj DictationError zdarzenie:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Następnie obsłuż wywołanie zwrotne DictationError:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

Po zasubskrybowaniu i obsłudze zdarzeń dyktowania, które cię interesują, uruchom program rozpoznawania dyktowania, aby rozpocząć odbieranie zdarzeń.

dictationRecognizer.Start();

Jeśli nie chcesz już przechowywać elementu DictationRecognizer wokół, musisz anulować subskrypcję zdarzeń i usunąć DictationRecognizer.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

Porady

  • Start() metody i Stop() odpowiednio włączają i wyłączają rozpoznawanie dyktowania.
  • Po wykonaniu operacji rozpoznawania należy go usunąć przy użyciu polecenia Dispose() , aby zwolnić używane przez niego zasoby. Spowoduje to automatyczne zwolnienie tych zasobów podczas odzyskiwania pamięci przy dodatkowych kosztach wydajności, jeśli nie zostaną one wydane wcześniej.
  • Przekroczenia limitu czasu występują po określonym przedziale czasu. Możesz sprawdzić te limity czasu w DictationComplete zdarzeniu. Istnieją dwa przekroczenia limitu czasu, o których należy pamiętać:
    1. Jeśli rozpoznawanie zostanie uruchomione i nie usłyszy żadnego dźwięku przez pierwsze pięć sekund, upłynął limit czasu.
    2. Jeśli rozpoznawanie dało wynik, ale następnie usłyszy ciszę przez 20 sekund, upłynął limit czasu.

Korzystanie zarówno z rozpoznawania fraz, jak i dyktowania

Jeśli chcesz użyć funkcji rozpoznawania i dyktowania fraz w aplikacji, musisz w pełni zamknąć jedną, zanim będzie można uruchomić drugą. Jeśli masz uruchomionych wiele słów kluczowychRecognizers, możesz zamknąć je wszystkie naraz za pomocą polecenia :

PhraseRecognitionSystem.Shutdown();

Możesz wywołać metodę Restart() , aby przywrócić wszystkie funkcje rozpoznawania do poprzedniego stanu po zatrzymaniu elementu DictationRecognizer:

PhraseRecognitionSystem.Restart();

Możesz również uruchomić element KeywordRecognizer, który również uruchomi ponownie element PhraseRecognitionSystem.

Wprowadzanie głosu w zestawie narzędzi Mixed Reality Toolkit

Przykłady zestawu narzędzi MRTK dla danych głosowych można znaleźć w następujących scenach demonstracyjnych:

Następny punkt kontrolny programowania

Jeśli obserwujesz zaplanowaną przez nas podróż do punktu kontrolnego tworzenia aparatu Unity, następnym zadaniem jest zbadanie możliwości i interfejsów API platformy Mixed Reality:

Zawsze możesz wrócić do punktów kontrolnych tworzenia aparatu Unity w dowolnym momencie.