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 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ć
  • Umożliwia DictationRecognizer aplikacji nasłuchiwać dowolnego wyrazu i dostarczać użytkownikowi notatkę 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, narzędzie DictationRecognizer nie może być aktywne i odwrotnie.

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

Możliwość mikrofonu musi być zadeklarowana, aby aplikacja korzystała z danych wejściowych głosu.

  1. W edytorze aparatu Unity przejdź do Project Ustawienia >> Player
  2. Wybierz kartę sklepu Windows Store
  3. W sekcji Publishing Ustawienia > Capabilities (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 podczas uruchamiania 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 lub KeywordRecognizerGrammarRecognizer
  2. Obsługa zdarzenia OnPhraseRecognized i akcja odpowiadająca rozpoznanej frazie

KeywordRecognizer

Przestrzeń nazw:UnityEngine.Windows. Mowy
Types: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 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, 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:

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. Mowy
Typy: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Wartość GrammarRecognizer 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 masz gramatykę SRGS i znajduje się ona 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 gramatyki SRGS, które można odpowiednio obsłużyć. Większość ważnych informacji zostanie podanych w tablicy semanticMeanings .

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

Na koniec zacznij rozpoznać!

grammarRecognizer.Start();

Dyktowania

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

Użyj funkcji DictationRecognizer , aby przekonwertować mowę użytkownika na tekst. Funkcja DictationRecognizer udostępnia funkcję dyktowania oraz obsługuje rejestrowanie i nasłuchiwanie hipotez i ukończonych zdarzeń fraz, dzięki czemu możesz przekazać opinię użytkownikowi zarówno podczas mówienia, jak i po nim. Start() Metody i Stop() odpowiednio włączą i wyłączą rozpoznawanie dyktowania. Po zakończeniu rozpoznawania należy go usunąć przy Dispose() użyciu , aby zwolnić używane zasoby. Spowoduje to automatyczne zwolnienie tych zasobów podczas wyrzucania elementów bezużytecznych z dodatkowymi kosztami wydajności, jeśli nie zostaną wydane wcześniej.

Aby rozpocząć dyktowanie, należy wykonać tylko kilka czynności:

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

Włączanie możliwości dyktowania

Aby aplikacja korzystała z 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 Publishing Ustawienia > Capabilities (Możliwości publikowania i przetwarzania danych) sprawdź możliwość InternetClient
    • Opcjonalnie, jeśli mikrofon nie został jeszcze włączyć, sprawdź możliwość Mikrofon
  4. Przyznawanie aplikacji uprawnień dostępu do mikrofonu na urządzeniu HoloLens, jeśli nie zostało to jeszcze
    • Zostaniesz poproszony o to podczas uruchamiania 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

DyktowanieResult

To zdarzenie jest wyzminowane 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
}

DyktowanieHypothesis

To zdarzenie jest zawsze wyzjemniane podczas rozmowy z użytkownikiem. 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 w przypadku wystąpienia błędu.

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ć programu 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 i Stop() odpowiednio włączą i wyłączą rozpoznawanie dyktowania.
  • Po zakończeniu rozpoznawania należy go usunąć przy Dispose() użyciu , 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ą wydane wcześniej.
  • Limity czasu występują po upływie ustawionego czasu. Możesz sprawdzić te limity czasu w zdarzeniu DictationComplete . Istnieją dwa limity czasu, o których należy pamiętać:
    1. Jeśli aparat rozpoznawania uruchomi się i nie usłyszy żadnego dźwięku przez pierwsze pięć sekund, uchybni.
    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 , Restart() aby przywrócić wszystkie aparaty rozpoznawania do poprzedniego stanu po 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 interfejsów API:

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