Delen via


Spraakinvoer in Unity

Let op

Voordat u begint, kunt u overwegen de Unity-invoegtoepassing te gebruiken voor de Cognitive Speech Services SDK. De invoegtoepassing heeft betere resultaten van spraaknauwkeurigheid en eenvoudige toegang tot spraak-naar-tekst decoderen, evenals geavanceerde spraakfuncties zoals dialoogvenster, interactie op basis van intentie, vertaling, tekst-naar-spraaksynthese en spraakherkenning in natuurlijke taal. Bekijk het voorbeeld en de documentatie om aan de slag te gaan.

Unity biedt drie manieren om Voice-invoer toe te voegen aan uw Unity-toepassing, waarvan de eerste twee typen PhraseRecognizer zijn:

  • De KeywordRecognizer app biedt een matrix met tekenreeksopdrachten om naar te luisteren
  • Hiermee GrammarRecognizer krijgt uw app een SRGS-bestand dat een specifieke grammatica definieert om naar te luisteren
  • Hiermee DictationRecognizer kan uw app naar elk woord luisteren en de gebruiker een notitie of een andere weergave van hun spraak geven

Notitie

Dicteren en woordgroepsherkenning kunnen niet tegelijkertijd worden verwerkt. Als een GrammarRecognizer of KeywordRecognizer actief is, kan een DictationRecognizer niet actief zijn en omgekeerd.

De mogelijkheid voor Spraak inschakelen

De microfoonfunctie moet worden gedeclareerd voor een app om spraakinvoer te kunnen gebruiken.

  1. Navigeer in de Unity Editor naar Project Settings > Player bewerken >
  2. Het tabblad Windows Store selecteren
  3. Controleer in de sectie Publicatie-instellingen > de microfoonfunctie
  4. Machtigingen verlenen aan de app voor microfoontoegang op uw HoloLens-apparaat
    • U wordt gevraagd dit te doen bij het opstarten van het apparaat, maar als u per ongeluk op Nee hebt geklikt, kunt u de machtigingen in de apparaatinstellingen wijzigen

Woordgroepherkenning

Als u wilt dat uw app luistert naar specifieke woordgroepen die door de gebruiker worden gesproken, moet u het volgende doen:

  1. Opgeven welke woordgroepen moeten worden gebruikt met behulp van een KeywordRecognizer of GrammarRecognizer
  2. OnPhraseRecognized De gebeurtenis afhandelen en actie ondernemen die overeenkomt met de herkende woordgroep

KeywordRecognizer

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

We hebben enkele gebruiksinstructies nodig om enkele toetsaanslagen op te slaan:

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

Vervolgens gaan we een paar velden aan uw klasse toevoegen om de woordenlijst recognizer en trefwoordactie> op te slaan:

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

Voeg nu een trefwoord toe aan de woordenlijst, bijvoorbeeld in een Start() methode. In dit voorbeeld voegen we het trefwoord 'activeren' toe:

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

Maak de trefwoordherkenning en geef aan wat we willen herkennen:

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

Registreer u nu voor de OnPhraseRecognized gebeurtenis

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Een voorbeeldhandler is:

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

Ten slotte begint u te herkennen!

keywordRecognizer.Start();

GrammarRecognizer

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

De GrammarRecognizer wordt gebruikt als u uw herkennings grammatica opgeeft met behulp van SRGS. Dit kan handig zijn als uw app meer dan slechts een paar trefwoorden heeft, als u complexere woordgroepen wilt herkennen of als u eenvoudig sets opdrachten wilt in- en uitschakelen. Zie: Grammatica's maken met behulp van SRGS XML voor informatie over de bestandsindeling.

Zodra u uw SRGS-grammatica hebt en deze zich in uw project in een map StreamingAssets bevindt:

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

Maak een GrammarRecognizer en geef het pad door naar uw SRGS-bestand:

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

Registreer u nu voor de OnPhraseRecognized gebeurtenis

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

U krijgt een callback met informatie die is opgegeven in uw SRGS-grammatica, die u op de juiste manier kunt afhandelen. De meeste belangrijke informatie wordt verstrekt in de semanticMeanings matrix.

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

Ten slotte begint u te herkennen!

grammarRecognizer.Start();

Dicteren

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

Gebruik de DictationRecognizer opdracht om de spraak van de gebruiker te converteren naar tekst. De DictationRecognizer biedt functionaliteit voor dicteren en ondersteunt het registreren en luisteren naar voltooide hypothesen en woordgroepen, zodat u feedback kunt geven aan uw gebruiker, zowel wanneer ze spreken als daarna. Start() en Stop() methoden schakelen respectievelijk dicteerherkenning in en uit. Wanneer u klaar bent met de recognizer, moet deze worden verwijderd met behulp van Dispose() de resources die worden gebruikt. Deze resources worden automatisch vrijgegeven tijdens de garbagecollection tegen extra prestatiekosten als ze hiervoor niet worden vrijgegeven.

Er zijn slechts enkele stappen nodig om aan de slag te gaan met dicteren:

  1. Een nieuwe maken DictationRecognizer
  2. Dicteren gebeurtenissen verwerken
  3. De DictationRecognizer starten

De mogelijkheid voor dicteren inschakelen

De mogelijkheden van de internetclient en microfoon moeten worden gedeclareerd voor een app om dicteren te kunnen gebruiken:

  1. Ga in de Unity Editor naar Project Settings > Player bewerken >
  2. Selecteren op het tabblad Windows Store
  3. Controleer in de sectie Publicatie-instellingen > de mogelijkheid internetclient
    • Als u de microfoon nog niet hebt ingeschakeld, controleert u eventueel de microfoonfunctie
  4. Machtigingen verlenen aan de app voor microfoontoegang op uw HoloLens-apparaat als u dat nog niet hebt gedaan
    • U wordt gevraagd dit te doen bij het opstarten van het apparaat, maar als u per ongeluk op Nee hebt geklikt, kunt u de machtigingen in de apparaatinstellingen wijzigen

DictationRecognizer

Maak als volgt een DictationRecognizer:

dictationRecognizer = new DictationRecognizer();

Er zijn vier dicteergebeurtenissen waarop kan worden geabonneerd en verwerkt om dicteergedrag te implementeren.

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

DictationResult

Deze gebeurtenis wordt geactiveerd nadat de gebruiker is onderbroken, meestal aan het einde van een zin. De volledige herkende tekenreeks wordt hier geretourneerd.

Abonneer u eerst op de DictationResult gebeurtenis:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Voer vervolgens de callback van DictationResult af:

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

DicterenHypothesis

Deze gebeurtenis wordt continu geactiveerd terwijl de gebruiker praat. Naarmate de recognizer luistert, biedt het tekst van wat het tot nu toe is gehoord.

Abonneer u eerst op de DictationHypothesis gebeurtenis:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Voer vervolgens de callback van DictationHypothesis af:

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

DictationComplete

Deze gebeurtenis wordt geactiveerd wanneer de recognizer stopt, ongeacht of stop() wordt aangeroepen, een time-out optreedt of een andere fout.

Abonneer u eerst op de DictationComplete gebeurtenis:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Voer vervolgens de callback van DictationComplete af:

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

DictationError

Deze gebeurtenis wordt geactiveerd wanneer er een fout optreedt.

Abonneer u eerst op de DictationError gebeurtenis:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Voer vervolgens de callback van DictationError af:

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

Nadat u zich hebt geabonneerd en de dicteergebeurtenissen die u belangrijk vindt, start u de dicteerherkenning om gebeurtenissen te ontvangen.

dictationRecognizer.Start();

Als u de DictationRecognizer niet meer wilt behouden, moet u zich afmelden voor de gebeurtenissen en de DictationRecognizer verwijderen.

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

Tips

  • Start() en Stop() methoden schakelen respectievelijk dicteerherkenning in en uit.
  • Wanneer u klaar bent met de recognizer, moet deze worden verwijderd met behulp van Dispose() de resources die worden gebruikt. Deze resources worden automatisch vrijgegeven tijdens de garbagecollection tegen extra prestatiekosten als ze hiervoor niet worden vrijgegeven.
  • Time-outs vinden plaats na een bepaalde periode. U kunt controleren op deze time-outs in de DictationComplete gebeurtenis. Er zijn twee time-outs waar u rekening mee moet houden:
    1. Als de recognizer begint en geen audio voor de eerste vijf seconden hoort, treedt er een time-out op.
    2. Als de recognizer een resultaat heeft gegeven, maar vervolgens stilte gedurende 20 seconden hoort, treedt er een time-out op.

Woordgroepherkenning en dicteren gebruiken

Als u zowel woordgroepherkenning als dicteren in uw app wilt gebruiken, moet u er een volledig afsluiten voordat u de andere kunt starten. Als er meerdere KeywordRecognizers worden uitgevoerd, kunt u ze allemaal tegelijk afsluiten met:

PhraseRecognitionSystem.Shutdown();

U kunt aanroepen Restart() om alle recognizers te herstellen naar hun vorige status nadat de DictationRecognizer is gestopt:

PhraseRecognitionSystem.Restart();

U kunt ook gewoon een KeywordRecognizer starten, waarmee ook het PhraseRecognitionSystem opnieuw wordt gestart.

Spraakinvoer in Mixed Reality Toolkit

U vindt MRTK-voorbeelden voor spraakinvoer in de volgende demoscènes:

Volgend controlepunt voor ontwikkeling

Als u het controlepunttraject voor Unity-ontwikkeling volgt dat we hebben opgesteld, gaat u de volgende taak verkennen met de mogelijkheden en API's van het Mixed Reality-platform:

U kunt altijd op elk gewenst moment teruggaan naar de Unity-ontwikkelingscontrolepunten .