Teilen über


Spracheingabe in Unity

Achtung

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

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

  • Die KeywordRecognizer App stellt ein Array von Zeichenfolgenbefehlen bereit, auf die sie lauschen können.
  • Die GrammarRecognizer App erhält eine SRGS-Datei, die eine bestimmte Grammatik definiert, auf die sie lauscht
  • Auf DictationRecognizer diese Weise kann Ihre App auf ein beliebiges Wort lauschen und dem Benutzer eine Notiz oder eine andere Anzeige seiner Sprache bereitstellen.

Hinweis

Die Diktier- und Ausdruckserkennung kann nicht gleichzeitig behandelt werden. Wenn ein GrammarRecognizer oder KeywordRecognizer aktiv ist, kann ein DictationRecognizer nicht aktiv sein und umgekehrt.

Aktivieren der Funktion für VoIP

Die Mikrofonfunktion muss deklariert werden, damit eine App Spracheingaben verwendet.

  1. Navigieren Sie im Unity-Editor zum Projekteinstellungen-Player > bearbeiten >
  2. Auswählen der Registerkarte "Windows Store "
  3. Überprüfen Sie im Abschnitt "Funktionen für die 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, aber wenn Sie 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 lauscht, müssen Sie folgende Aktionen ausführen:

  1. Angeben, welche Ausdrücke auf die Verwendung eines KeywordRecognizer oder GrammarRecognizer
  2. Behandeln des OnPhraseRecognized Ereignisses und Ergreifen von Aktionen, die dem erkannten Ausdruck entsprechen

KeywordRecognizer

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

Wir benötigen einige Verwendungsanweisungen, um einige Tastenanschläge zu speichern:

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

Anschließend fügen wir Ihrer Klasse einige Felder hinzu, um das Erkennungs- und Schlüsselwortaktionswörterbuch> zu speichern:

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

Fügen Sie nun dem Wörterbuch ein Schlüsselwort hinzu, z. B. in einer Start() Methode. Wir fügen das Schlüsselwort "activate" in diesem Beispiel hinzu:

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

Erstellen Sie die Schlüsselworterkennung, und teilen Sie ihr mit, was wir erkennen möchten:

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

Registrieren Sie sich jetzt für das OnPhraseRecognized Ereignis.

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 mit der Erkennung!

keywordRecognizer.Start();

GrammarRecognizer

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

Der GrammarRecognizer wird verwendet, wenn Sie Ihre Erkennungsgrammatik mithilfe von SRGS angeben. Dies kann hilfreich 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. Siehe: Erstellen von Grammatiken mit SRGS-XML für Dateiformatinformationen.

Sobald Sie ihre SRGS-Grammatik haben und sich in Ihrem Projekt in einem StreamingAssets-Ordner befinden:

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

Erstellen Sie einen Und GrammarRecognizer übergeben Sie ihn an den Pfad zu Ihrer SRGS-Datei:

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

Registrieren Sie sich jetzt für das OnPhraseRecognized Ereignis.

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Sie erhalten einen Rückruf, der Informationen enthält, die in Ihrer SRGS-Grammatik angegeben sind, die Sie entsprechend behandeln 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 mit der Erkennung!

grammarRecognizer.Start();

Diktieren

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

Verwenden Sie die DictationRecognizer Funktion zum Konvertieren der Sprache des Benutzers in Text. Das DictationRecognizer macht diktierfunktion verfügbar und unterstützt das Registrieren und Überwachen von Hypothesen- und Ausdrucksabschlussereignissen, sodass Sie Dem Benutzer sowohl während des Sprechens als auch danach Feedback geben können. Start() und Stop() Methoden aktivieren bzw. deaktivieren die Diktiererkennung. Nach Abschluss der Erkennung sollte sie mithilfe Dispose() der verwendeten Ressourcen freigegeben werden. 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 des DictationRecognizers

Aktivieren der Funktion zum Diktieren

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

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

DictationRecognizer

Erstellen Sie ein DictationRecognizer wie folgt:

dictationRecognizer = new DictationRecognizer();

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

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

DictationResult

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

Abonnieren Sie zunächst das DictationResult Ereignis:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Behandeln Sie dann den DictationResult-Rückruf:

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

DiktatHypothesis

Dieses Ereignis wird kontinuierlich ausgelöst, während der Benutzer spricht. Als die Erkennung hört, liefert sie Text darüber, was sie bisher gehört hat.

Abonnieren Sie zunächst das DictationHypothesis Ereignis:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Behandeln Sie dann den Rückruf der DictationHypothesis:

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

DictationComplete

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

Abonnieren Sie zunächst das DictationComplete Ereignis:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Behandeln Sie dann den DictationComplete-Rückruf:

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

DictationError

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

Abonnieren Sie zunächst das DictationError Ereignis:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Behandeln Sie dann den DictationError-Rückruf:

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

Nachdem Sie die von Ihnen wichtigen Diktierereignisse abonniert und behandelt haben, starten Sie die Diktiererkennung, um mit dem Empfang von Ereignissen zu beginnen.

dictationRecognizer.Start();

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

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

Tipps

  • Start() und Stop() Methoden aktivieren bzw. deaktivieren die Diktiererkennung.
  • Nach Abschluss der Erkennung muss sie mithilfe Dispose() der verwendeten Ressourcen gelöscht werden. Diese Ressourcen werden während der Garbage Collection automatisch zu zusätzlichen Leistungskosten freigegeben, wenn sie vorher nicht freigegeben werden.
  • Timeouts treten nach einem festgelegten 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 startet und für die ersten fünf Sekunden keine Audiodaten hört, wird ein Timeout ausgeführt.
    2. Wenn die Erkennung ein Ergebnis gegeben hat, aber dann 20 Sekunden Stille hört, wird es timeout.

Verwenden von Begriffserkennung und Diktierfunktion

Wenn Sie sowohl die Begriffserkennung als auch die Diktierfunktion in Ihrer App verwenden möchten, müssen Sie eins vollständig herunterfahren, bevor Sie die andere starten können. Wenn mehrere KeywordRecognizer ausgeführt werden, können Sie sie alle gleichzeitig herunterfahren mit:

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

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

Spracheingabe im Mixed Reality-Toolkit

Sie finden MRTK-Beispiele für die Spracheingabe in den folgenden Demoszenen:

Nächster Entwicklungsprüfpunkt

Wenn Sie der Von uns erstellten Unity-Entwicklungsprüfpunkt-Reise folgen, sind Sie die nächste Aufgabe, die Mixed Reality-Plattformfunktionen und APIs zu erkunden:

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