Spraakinvoer in Unity

Waarschuwing

Voordat u begint, kunt u overwegen de Unity-invoegtoepassing te gebruiken voor de Cognitive Speech Services SDK. De invoegtoepassing heeft betere resultaten voor spraaknauwkeurigheid en eenvoudige toegang tot spraak-naar-tekst decoderen, evenals geavanceerde spraakfuncties zoals dialoogvenster, intentiegebaseerde interactie, 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 spraakinvoer toe te voegen aan uw Unity-toepassing, waarvan de eerste twee typen PhraseRecognizer zijn:

  • De KeywordRecognizer biedt uw app een matrix van tekenreeksopdrachten om naar te luisteren
  • De GrammarRecognizer geeft uw app een SRGS-bestand dat een specifieke grammatica definieert om naar te luisteren
  • Met DictationRecognizer de kan uw app naar elk woord luisteren en de gebruiker voorzien van een notitie of andere weergave van zijn of haar spraak

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 Voice inschakelen

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

  1. Navigeer in de Unity-editor naar De speler Projectinstellingen > bewerken >
  2. Het tabblad Windows Store selecteren
  3. Controleer in de sectie Publicatie-instellingen > mogelijkheden de microfoonmogelijkheid
  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 wijzigen in de apparaatinstellingen

Woordgroepsherkenning

Als u wilt dat uw app luistert naar specifieke woordgroepen die door de gebruiker worden uitgesproken en vervolgens actie ondernemen, moet u het volgende doen:

  1. Opgeven naar welke woordgroepen moet worden geluisterd met behulp van een KeywordRecognizer of GrammarRecognizer
  2. OnPhraseRecognized De gebeurtenis verwerken en actie ondernemen die overeenkomt met de herkende woordgroep

KeywordRecognizer

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

We hebben enkele instructies 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 herkenningsfunctie en de woordenlijst voor trefwoorden> 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 van 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();
    }
}

Begin eindelijk te herkennen!

keywordRecognizer.Start();

GrammarRecognizer

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

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

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

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

Maak een GrammarRecognizer en geef deze 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 opgegeven in de semanticMeanings matrix.

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

Begin eindelijk te herkennen!

grammarRecognizer.Start();

Dicteren

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

Gebruik de DictationRecognizer om de spraak van de gebruiker te converteren naar tekst. De DictationRecognizer maakt dicteerfunctionaliteit beschikbaar en ondersteunt het registreren en luisteren naar gebeurtenissen die zijn voltooid met hypothesen en woordgroepen, zodat u uw gebruiker feedback kunt geven terwijl ze spreken en daarna. Start() en Stop() methoden respectievelijk dicteerherkenning in- en uitschakelen. Wanneer u klaar bent met de recognizer, moet deze worden verwijderd met behulp van Dispose() om de resources vrij te geven die worden gebruikt. Deze resources worden automatisch vrijgegeven tijdens de garbagecollection tegen extra prestatiekosten als ze daarvoor niet zijn vrijgegeven.

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

  1. Een nieuwe maken DictationRecognizer
  2. Dicteerbeurtenissen verwerken
  3. De Dicteerfunctie 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 Projectinstellingen > bewerken > Player
  2. Selecteren op het tabblad Windows Store
  3. Controleer in de sectie Mogelijkheden voor publicatie-instellingen > de mogelijkheid InternetClient
    • Als u de microfoon nog niet hebt ingeschakeld, kunt u desgewenst de microfoonfunctie controleren
  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 wijzigen in de apparaatinstellingen

Dicteerfunctie

Maak een DictationRecognizer als volgt:

dictationRecognizer = new DictationRecognizer();

Er zijn vier dicteergebeurtenissen die kunnen worden geabonneerd en verwerkt om dicteergedrag te implementeren.

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

DicterenResult

Deze gebeurtenis wordt geactiveerd nadat de gebruiker is onderbroken, meestal aan het einde van een zin. De volledig 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. Terwijl de herkenning luistert, geeft deze tekst weer van wat er tot nu toe is gehoord.

Abonneer u eerst op de DictationHypothesis gebeurtenis:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Voer vervolgens de callback van Dicteerhypothesis af:

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

DicterenComplete

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

Abonneer u eerst op de DictationComplete gebeurtenis:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Verhandel vervolgens de callback van DictationComplete:

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;

Verhandel vervolgens de callback van de DictationError:

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

Nadat u zich hebt geabonneerd en de gewenste dicteergebeurtenissen hebt verwerkt, start u de dicteerherkenning om gebeurtenissen te gaan 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 respectievelijk dicteerherkenning in- en uitschakelen.
  • Als u klaar bent met de recognizer, moet deze worden verwijderd met behulp van Dispose() om de resources vrij te geven die worden gebruikt. Deze resources worden automatisch vrijgegeven tijdens de garbagecollection tegen extra prestatiekosten als ze daarvoor niet zijn vrijgegeven.
  • Time-outs treden op na een ingestelde 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 herkenning wordt gestart en de eerste vijf seconden geen audio hoort, treedt er een time-out op.
    2. Als de herkenning een resultaat heeft gegeven, maar vervolgens 20 seconden stilte hoort, treedt er een time-out op.

Woordgroepsherkenning en dicteren gebruiken

Als u zowel woordgroepsherkenning als dicteerfunctie in uw app wilt gebruiken, moet u de ene volledig afsluiten voordat u de andere kunt starten. Als u meerdere KeywordRecognizers hebt, kunt u deze 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 het PhraseRecognitionSystem ook opnieuw wordt gestart.

Spraakinvoer in Mixed Reality Toolkit

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

Controlepunt volgende ontwikkeling

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

U kunt altijd op elk gewenst moment teruggaan naar de controlepunten voor Unity-ontwikkeling .