Wprowadzanie głosu w a aparatu 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 funkcji dekodowania mowy na tekst, a także zaawansowane funkcje mowy, takie jak okno dialogowe, interakcja oparta na intencjach, tłumaczenie, synteza tekstu na mowę i rozpoznawanie mowy w języku naturalnym. Aby rozpocząć pracę, zapoznaj się z przykładami i dokumentacją.

Unity udostępnia trzy sposoby dodawania danych wejściowych głosu do aplikacji aparatu Unity, z których dwa pierwsze to typy PhraseRecognizer:

  • Element KeywordRecognizer dostarcza aplikacji tablicę poleceń ciągów do nasłuchiwać
  • Element GrammarRecognizer udostępnia aplikacji plik SRGS definiujący określoną gramatykę do nasłuchiwać
  • Funkcja umożliwia aplikacji nasłuchiwać dowolnego wyrazu i dostarczać użytkownikowi notatkę DictationRecognizer lub inny sposób wyświetlania swojej mowy

Uwaga

Dyktowanie i rozpoznawanie fraz nie mogą być obsługiwane w tym samym czasie. Jeśli typ GrammarRecognizer lub KeywordRecognizer jest aktywny, DictationRecognizer nie może być aktywny i odwrotnie.

Włączanie możliwości usługi Voice

Aby aplikacja używała głosu wejściowego, należy zadeklarować możliwość mikrofonu.

  1. W edytorze aparatu Unity przejdź do tematu Edit > Project Ustawienia > Player (Edytowanie > Project Ustawienia > Player).
  2. Wybierz kartę Windows Store
  3. W sekcji Możliwości Ustawienia > publikowania sprawdź możliwość mikrofonu
  4. Udzielanie aplikacji uprawnień dostępu do mikrofonu na urządzeniu HoloLens urządzeniu
    • Zostaniesz poproszony o to przy uruchamianiu urządzenia, ale jeśli przypadkowo klikniesz pozycję "nie", możesz zmienić uprawnienia w ustawieniach urządzenia

Rozpoznawanie fraz

Aby umożliwić aplikacji nasłuchiwać określonych fraz wypowiadanych przez użytkownika, a następnie podjąć pewne działania, należy:

  1. Określanie fraz do nasłuchiwać przy użyciu KeywordRecognizer lub GrammarRecognizer
  2. Obsługa zdarzenia OnPhraseRecognized i działanie odpowiadające rozpoznawanej frazie

KeywordRecognizer

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

Będziemy potrzebować kilku instrukcji using, aby zapisać kilka naciśnięć klawiszy:

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

Następnie dodajmy kilka pól do klasy w celu przechowywania słownika akcji recognizer i keyword->akcji:

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

Teraz dodaj słowo kluczowe do słownika, na przykład w Start() metodzie . 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, co chcemy rozpoznać:

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

Teraz zarejestruj się, aby uzyskać OnPhraseRecognized zdarzenie

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 rozpoznać!

keywordRecognizer.Start();

GrammarRecognizer

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

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

Gdy gramatyka SRGS znajduje się w projekcie w folderze StreamingAssets:

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

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

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

Teraz zarejestruj się, aby uzyskać OnPhraseRecognized zdarzenie

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

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

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

Na koniec zacznij rozpoznać!

grammarRecognizer.Start();

Dyktowania

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

Użyj funkcji DictationRecognizer , aby przekonwertować mowę użytkownika na tekst. Funkcja DictationRecognizer uwidacznia funkcję dyktowania oraz obsługuje rejestrowanie i nasłuchiwanie hipotez i ukończonych fraz, dzięki czemu możesz przekazać opinię użytkownikom zarówno podczas mówienia, jak i po nim. Start() Metody Stop() i odpowiednio włączą i wyłączą rozpoznawanie dyktowania. Po zakończeniu pracy z aparatem rozpoznawania należy go usunąć przy użyciu , Dispose() aby zwolnić zasoby, których używa. Spowoduje to automatyczne zwolnienie tych zasobów podczas wyrzucania elementów bezużytecznych z dodatkowymi kosztami 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 DictationRecognizer

Włączanie możliwości dyktowania

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

  1. W edytorze aparatu Unity przejdź do tematu Edit > Project Ustawienia > Player (Edytowanie > Project Ustawienia > Player).
  2. Wybierz pozycję na Windows Store
  3. W sekcji Możliwości Ustawienia > publikowania sprawdź możliwość InternetClient
    • Opcjonalnie, jeśli mikrofon nie został jeszcze włączyć, sprawdź możliwość mikrofonu
  4. Przyznawanie aplikacji uprawnień dostępu do mikrofonu na urządzeniu HoloLens, jeśli nie zostało to jeszcze na Twoim urządzeniu
    • Zostaniesz poproszony o to przy uruchamianiu urządzenia, ale jeśli przypadkowo klikniesz pozycję "nie", możesz zmienić uprawnienia w ustawieniach urządzenia

DyktowanieRecognizer

Utwórz DictationRecognizer w taki 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 wyzjemniane po wstrzymaniu przez użytkownika, zwykle na końcu zdania. W tym miejscu jest zwracany pełny rozpoznany ciąg.

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 wyzjemniane w sposób ciągły, gdy użytkownik rozmawia. Gdy aparat rozpoznawania nasłuchuje, udostępnia 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 wywoływane po zatrzymaniu rozpoznawania, wywołaniu stop(), przeoczaniu limitu czasu lub innym błędzie.

Najpierw zasubskrybuj DictationComplete zdarzenie:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

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

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

DictationError

To zdarzenie jest wyzjemniane, 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 zasubskrybowania i obsłudze zdarzeń dyktowania, które Cię obsługują, uruchom aparat rozpoznawania dyktowania, aby rozpocząć odbieranie zdarzeń.

dictationRecognizer.Start();

Jeśli nie chcesz już utrzymywać rekordu DictationRecognizer, musisz anulować subskrypcję zdarzeń i usunąć rekord DictationRecognizer.

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

Porady

  • Start() Metody Stop() i odpowiednio włączą i wyłączą rozpoznawanie dyktowania.
  • Po zakończeniu rozpoznawania należy go usunąć przy użyciu , Dispose() aby zwolnić zasoby, których używa. Spowoduje to automatyczne zwolnienie tych zasobów podczas wyrzucania elementów bezużytecznych z dodatkowymi kosztami wydajności, jeśli nie zostaną one wydane wcześniej.
  • Limity czasu występują po upływie ustawionego czasu. Możesz sprawdzić te limity czasu w DictationComplete zdarzeniu. Istnieją dwa limity czasu, o których należy pamiętać:
    1. Jeśli aparat rozpoznawania zostanie uruchomiony i nie usłyszy żadnego dźwięku przez pierwsze pięć sekund, zostanie uchybny.
    2. Jeśli aparat rozpoznawczy podał wynik, ale następnie usłyszy ciszę przez 20 sekund, uchybni.

Używanie funkcji rozpoznawania fraz i dyktowania

Jeśli chcesz używać funkcji rozpoznawania fraz i dyktowania w aplikacji, musisz ją całkowicie zamknąć, zanim będzie można uruchomić drugą. Jeśli masz uruchomionych wiele elementów KeywordRecognizers, możesz je wszystkie zamknąć jednocześnie za pomocą:

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

Możesz również po prostu uruchomić narzędzie KeywordRecognizer, co spowoduje również ponowne uruchomienie systemu PhraseRecognitionSystem.

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

Przykłady mrTK dla danych wejściowych głosu można znaleźć w następujących scenach demonstracyjnych:

Następny punkt kontrolny projektowania

Jeśli podążasz za punktem kontrolnym tworzenia aparatu Unity, następnym zadaniem jest eksplorowanie możliwości platformy Mixed Reality i interfejsów API:

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