Spracheingabe in Unity

Achtung

Bevor Sie beginnen, sollten Sie das Unity-Plug-In für das Cognitive Speech Services SDK verwenden. Das Plug-In bietet bessere Ergebnisse für die Sprachgenauigkeit und einfachen Zugriff auf die Spracherkennung sowie erweiterte Sprachfunktionen wie Dialog, absichtsbasierte Interaktion, Übersetzung, Sprachsynthese und Spracherkennung in natürlicher Sprache. Sehen Sie sich zunächst das Beispiel und die Dokumentation an.

Unity macht drei Möglichkeiten zum Hinzufügen von Spracheingaben zu Ihrer Unity-Anwendung verfügbar, von denen die ersten beiden Typen von PhraseRecognizer sind:

  • Stellt KeywordRecognizer Ihrer App ein Array von Zeichenfolgenbefehlen zum Lauschen bereit.
  • Gibt GrammarRecognizer Ihrer App eine SRGS-Datei, die eine bestimmte Grammatik definiert, auf die lauscht
  • Ermöglicht DictationRecognizer es Ihrer App, auf jedes Wort zu lauschen und dem Benutzer eine Notiz oder eine andere Anzeige seiner Sprache bereitzustellen.

Hinweis

Diktat- und Ausdruckserkennung können nicht gleichzeitig behandelt werden. Wenn ein GrammarRecognizer oder ein KeywordRecognizer aktiv ist, kann ein DictationRecognizer nicht aktiv sein und umgekehrt.

Aktivieren der Funktion für Voice

Die Mikrofonfunktion muss deklariert werden, damit eine App die Spracheingabe verwenden kann.

  1. Navigieren Sie im Unity-Editor zu Projekteinstellungen > bearbeiten > Player.
  2. Auswählen der Registerkarte "Windows Store "
  3. Überprüfen Sie im Abschnitt Funktionen für Veröffentlichungseinstellungen > die Mikrofonfunktion.
  4. Erteilen von Berechtigungen für die App für den Mikrofonzugriff auf Ihrem HoloLens-Gerät
    • Sie werden aufgefordert, dies beim Gerätestart zu tun. Wenn Sie jedoch versehentlich auf "Nein" geklickt haben, können Sie die Berechtigungen in den Geräteeinstellungen ändern.

Ausdruckserkennung

Damit Ihre App auf bestimmte vom Benutzer gesprochene Ausdrücke lauschen und dann maßnahmen kann, müssen Sie folgendes tun:

  1. Angeben der zu lauschenden Ausdrücke mithilfe eines KeywordRecognizer oder GrammarRecognizer
  2. Behandeln des Ereignisses OnPhraseRecognized und Ausführen einer Aktion entsprechend dem erkannten Ausdruck

KeywordRecognizer

Namespace:UnityEngine.Windows.Speech
Types:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Wir benötigen einige using-Anweisungen, um einige Tastatureingaben zu speichern:

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

Fügen Sie dann ihrer Klasse einige Felder hinzu, um das Erkennungs- und Schlüsselwort (keyword)-action-Wörterbuch> zu speichern:

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

Fügen Sie nun dem Wörterbuch eine Schlüsselwort (keyword) hinzu, z. B. in einer Start() -Methode. In diesem Beispiel wird die Schlüsselwort (keyword) "activate" hinzugefügt:

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

Erstellen Sie die Schlüsselwort (keyword)-Erkennung, und teilen Sie ihr mit, was wir erkennen möchten:

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

Registrieren Sie sich jetzt für das Ereignis.OnPhraseRecognized

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Ein Beispielhandler ist:

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();
    }
}

Beginnen Sie schließlich, zu erkennen!

keywordRecognizer.Start();

GrammarRecognizer

Namespace:UnityEngine.Windows.Speech
Typen: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

GrammarRecognizer wird verwendet, wenn Sie Ihre Erkennungsgrammatik mithilfe von SRGS angeben. Dies kann nützlich sein, wenn Ihre App mehr als nur ein paar Schlüsselwörter enthält, wenn Sie komplexere Ausdrücke erkennen möchten oder wenn Sie Befehlssätze einfach aktivieren und deaktivieren möchten. Informationen zum Dateiformat finden Sie unter Erstellen von Grammatiken mithilfe von SRGS-XML .

Sobald Ihre SRGS-Grammatik vorhanden ist, befindet sie sich in Ihrem Projekt in einem StreamingAssets-Ordner:

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

Erstellen Sie eine GrammarRecognizer , und übergeben Sie ihn den Pfad zu Ihrer SRGS-Datei:

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

Registrieren Sie sich jetzt für das Ereignis.OnPhraseRecognized

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Sie erhalten einen Rückruf, der informationen enthält, die in Ihrer SRGS-Grammatik angegeben sind, die Sie entsprechend verarbeiten können. Die meisten wichtigen Informationen werden im semanticMeanings Array bereitgestellt.

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

Beginnen Sie schließlich, zu erkennen!

grammarRecognizer.Start();

Diktieren

Namespace:UnityEngine.Windows.Speech
Typen: DictationRecognizer, SpeechError, SpeechSystemStatus

Verwenden Sie , DictationRecognizer um die Sprache des Benutzers in Text zu konvertieren. DictationRecognizer macht Diktierfunktionen verfügbar und unterstützt das Registrieren und Lauschen auf Ereignisse mit Hypothesen und Abgeschlossenen Ausdrücken, sodass Sie Ihrem Benutzer Feedback geben können, während er spricht und danach. Start() und Stop() die Methoden aktivieren bzw. deaktivieren die Diktiererkennung. Sobald die Erkennung abgeschlossen ist, sollte sie mithilfe Dispose() von freigegeben werden, um die verwendeten Ressourcen freizugeben. Diese Ressourcen werden während der Garbage Collection automatisch zu zusätzlichen Leistungskosten freigegeben, wenn sie vorher nicht freigegeben werden.

Es sind nur einige Schritte erforderlich, um mit dem Diktieren zu beginnen:

  1. Erstellen eines neuen DictationRecognizer
  2. Behandeln von Diktierereignissen
  3. Starten von DictationRecognizer

Aktivieren der Funktion für das Diktieren

Die Internetclient - und Mikrofonfunktionen müssen deklariert werden, damit eine App diktieren kann:

  1. Wechseln Sie im Unity-Editor zu Projekteinstellungen > bearbeiten > Player.
  2. Wählen Sie auf der Registerkarte Windows Store die Option aus.
  3. Überprüfen Sie im Abschnitt Funktionen für Veröffentlichungseinstellungen > die InternetClient-Funktion.
    • Wenn Sie das Mikrofon noch nicht aktiviert haben, überprüfen Sie optional die Mikrofonfunktion .
  4. Erteilen Sie der App Berechtigungen für den Mikrofonzugriff auf Ihrem HoloLens-Gerät, wenn Sie dies noch nicht getan haben.
    • Sie werden aufgefordert, dies beim Gerätestart zu tun. Wenn Sie jedoch versehentlich auf "Nein" geklickt haben, können Sie die Berechtigungen in den Geräteeinstellungen ändern.

DiktatRecognizer

Erstellen Sie einen DictationRecognizer wie folgt:

dictationRecognizer = new DictationRecognizer();

Es gibt vier Diktierereignisse, die abonniert und verarbeitet werden können, um das Diktatverhalten zu implementieren.

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

DictationResult

Dieses Ereignis wird ausgelöst, nachdem der Benutzer in der Regel am Ende eines Satzes angehalten hat. Die vollständige erkannte Zeichenfolge wird hier zurückgegeben.

Abonnieren Sie zunächst das DictationResult Ereignis:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Behandeln Sie dann den Rückruf von DictationResult:

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

DiktatHypothese

Dieses Ereignis wird kontinuierlich ausgelöst, während der Benutzer spricht. Während die Erkennung lauscht, liefert sie Text dessen, was sie bisher gehört hat.

Abonnieren Sie zunächst das DictationHypothesis Ereignis:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Behandeln Sie dann den Rückruf von DictationHypothesis:

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

DiktatComplete

Dieses Ereignis wird ausgelöst, wenn die Erkennung beendet wird, unabhängig davon, ob stop() aufgerufen wird, ein Timeout auftritt oder ein anderer Fehler auftritt.

Abonnieren Sie zunächst das DictationComplete Ereignis:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Behandeln Sie dann den Rückruf DictationComplete:

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

Diktatfehler

Dieses Ereignis wird ausgelöst, wenn ein Fehler auftritt.

Abonnieren Sie zunächst das DictationError Ereignis:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Behandeln Sie dann den Rückruf von DictationError:

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

Nachdem Sie die Diktatereignisse abonniert und verarbeitet haben, die Ihnen wichtig sind, starten Sie die Diktiererkennung, um mit dem Empfangen von Ereignissen zu beginnen.

dictationRecognizer.Start();

Wenn Sie DictationRecognizer nicht mehr beibehalten möchten, müssen Sie sich von den Ereignissen abmelden und DictationRecognizer verwerfen.

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

Tipps

  • Start() und Stop() die Methoden aktivieren bzw. deaktivieren die Diktiererkennung.
  • Sobald sie mit der Erkennung abgeschlossen ist, muss sie mit Dispose() freigegeben werden, um die verwendeten Ressourcen freizugeben. Diese Ressourcen werden während der Garbage Collection automatisch zu zusätzlichen Leistungskosten freigegeben, wenn sie vorher nicht freigegeben werden.
  • Timeouts treten nach einem bestimmten Zeitraum auf. Sie können diese Timeouts im DictationComplete -Ereignis überprüfen. Es gibt zwei Timeouts, die sie beachten müssen:
    1. Wenn die Erkennung gestartet wird und in den ersten fünf Sekunden keine Audiodaten hört, tritt ein Timeout auf.
    2. Wenn die Erkennung ein Ergebnis gegeben hat, dann aber 20 Sekunden lang Stille hört, tritt ein Timeout auf.

Verwenden von Ausdruckserkennung und Diktat

Wenn Sie sowohl die Ausdruckserkennung als auch das Diktieren in Ihrer App verwenden möchten, müssen Sie eine App vollständig herunterfahren, bevor Sie den anderen starten können. Wenn mehrere KeywordRecognizer ausgeführt werden, können Sie sie alle gleichzeitig herunterfahren:

PhraseRecognitionSystem.Shutdown();

Sie können aufrufen Restart() , um alle Erkennungen in ihren vorherigen Zustand wiederherzustellen, nachdem DictationRecognizer beendet wurde:

PhraseRecognitionSystem.Restart();

Sie können auch einfach ein KeywordRecognizer starten, das auch das PhraseRecognitionSystem neu startet.

Spracheingabe im Mixed Reality Toolkit

MrTK-Beispiele für Die Spracheingabe finden Sie in den folgenden Demoszenen:

Nächster Entwicklungsprüfpunkt

Wenn Sie der von uns beschriebenen Unity-Entwicklungsprüfpunktreise folgen, müssen Sie sich als nächstes mit den Mixed Reality Plattformfunktionen und APIs vertraut geben:

Sie können jederzeit zu den Prüfpunkten für die Unity-Entwicklung zurückkehren.