Dela via


Röstinmatning i Unity

Varning

Innan du börjar bör du överväga att använda Unity-plugin-programmet för Cognitive Speech Services SDK. Plugin-programmet har bättre resultat av talnoggrannhet och enkel åtkomst till tal-till-text-avkodning, samt avancerade talfunktioner som dialog, avsiktsbaserad interaktion, översättning, text-till-tal-syntes och taligenkänning på naturligt språk. Kom igång genom att läsa exemplet och dokumentationen.

Unity exponerar tre sätt att lägga till röstindata i ditt Unity-program, varav de två första är typer av PhraseRecognizer:

  • Tillhandahåller KeywordRecognizer din app med en matris med strängkommandon att lyssna efter
  • GrammarRecognizer Ger din app en SRGS-fil som definierar en specifik grammatik att lyssna efter
  • Låter DictationRecognizer din app lyssna efter valfritt ord och ge användaren en anteckning eller annan visning av deras tal

Kommentar

Diktering och frasigenkänning kan inte hanteras samtidigt. Om en GrammarRecognizer eller KeywordRecognizer är aktiv kan en DictationRecognizer inte vara aktiv och vice versa.

Aktivera funktionen för Röst

Mikrofonfunktionen måste deklareras för att en app ska kunna använda röstindata.

  1. I Unity-redigeraren går du till Redigera > projektinställningar > spelare
  2. Välj fliken Windows Store
  3. I avsnittet Funktioner för publiceringsinställningar > kontrollerar du mikrofonfunktionen
  4. Bevilja behörigheter till appen för mikrofonåtkomst på din HoloLens-enhet
    • Du uppmanas att göra detta vid enhetsstart, men om du av misstag klickade på Nej kan du ändra behörigheterna i enhetsinställningarna

Frasigenkänning

Om du vill att appen ska kunna lyssna efter specifika fraser som användaren talat och sedan vidta åtgärder måste du:

  1. Ange vilka fraser som ska lyssnas efter med hjälp av en KeywordRecognizer eller GrammarRecognizer
  2. OnPhraseRecognized Hantera händelsen och vidta åtgärder som motsvarar frasen som känns igen

KeywordRecognizer

Namnområde: UnityEngine.Windows.Speech
Typer: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Vi behöver några instruktioner för att spara några tangenttryckningar:

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

Sedan ska vi lägga till några fält i klassen för att lagra ordlistan för identifierare och nyckelordsåtgärd>:

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

Lägg nu till ett nyckelord i ordlistan, till exempel i en Start() metod. Vi lägger till nyckelordet "aktivera" i det här exemplet:

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

Skapa nyckelordsigenkänningen och berätta vad vi vill känna igen:

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

Registrera dig nu för OnPhraseRecognized händelsen

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

En exempelhanterare är:

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

Äntligen, börja känna igen!

keywordRecognizer.Start();

GrammarRecognizer

Namnområde: UnityEngine.Windows.Speech
Typer: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

GrammarRecognizer används om du anger din igenkännings grammatik med hjälp av SRGS. Detta kan vara användbart om din app har mer än bara några nyckelord, om du vill känna igen mer komplexa fraser eller om du enkelt vill aktivera och inaktivera uppsättningar med kommandon. Se: Skapa grammatik med hjälp av SRGS XML för filformatsinformation.

När du har din SRGS-grammatik och den finns i projektet i en StreamingAssets-mapp:

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

Skapa en GrammarRecognizer och skicka sökvägen till din SRGS-fil:

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

Registrera dig nu för OnPhraseRecognized händelsen

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Du får ett återanrop som innehåller information som anges i SRGS-grammatiken, som du kan hantera på rätt sätt. Merparten av den viktiga informationen kommer att tillhandahållas i matrisen semanticMeanings .

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

Äntligen, börja känna igen!

grammarRecognizer.Start();

Diktering

Namnområde: UnityEngine.Windows.Speech
Typer: DictationRecognizer, SpeechError, SpeechSystemStatus

DictationRecognizer Använd för att konvertera användarens tal till text. DictationRecognizer exponerar dikteringsfunktioner och stöder registrering och lyssnande efter hypoteser och slutförda fraser, så att du kan ge feedback till användaren både när de talar och efteråt. Start() respektive Stop() metoder för att aktivera och inaktivera dikteringsigenkänning. När du är klar med identifieraren ska den tas bort med hjälp av Dispose() för att frigöra de resurser som används. De här resurserna frigörs automatiskt under skräpinsamlingen till en extra prestandakostnad om de inte släpps innan dess.

Det finns bara några steg som krävs för att komma igång med diktering:

  1. Skapa en ny DictationRecognizer
  2. Hantera dikteringshändelser
  3. Starta dikteringenRecognizer

Aktivera funktionen för diktering

Funktionerna Internetklient och mikrofon måste deklareras för att en app ska kunna använda diktering:

  1. I Unity-redigeraren går du till Redigera > projektinställningar > spelare
  2. Välj på fliken Windows Store
  3. I avsnittet Funktioner för publiceringsinställningar > kontrollerar du funktionen InternetClient
    • Om du inte redan har aktiverat mikrofonen kan du också kontrollera mikrofonfunktionen
  4. Bevilja behörigheter till appen för mikrofonåtkomst på din HoloLens-enhet om du inte redan har gjort det
    • Du uppmanas att göra detta vid enhetsstart, men om du av misstag klickade på Nej kan du ändra behörigheterna i enhetsinställningarna

DikteringRecognizer

Skapa en dikteringRecognizer så här:

dictationRecognizer = new DictationRecognizer();

Det finns fyra dikteringshändelser som kan prenumereras på och hanteras för att implementera dikteringsbeteende.

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

DikteringResult

Den här händelsen utlöses när användaren pausar, vanligtvis i slutet av en mening. Den fullständiga identifierade strängen returneras här.

Börja med att prenumerera på DictationResult händelsen:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Hantera sedan återanropet DictationResult:

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

DikteringHypothesis

Den här händelsen utlöses kontinuerligt medan användaren pratar. När identifieraren lyssnar ger den text om vad den har hört hittills.

Börja med att prenumerera på DictationHypothesis händelsen:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Hantera sedan återanropet DictationHypothesis:

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

DikteringComplete

Den här händelsen utlöses när identifieraren stoppas, oavsett om den är från Stop() som anropas, en timeout som inträffar eller något annat fel.

Börja med att prenumerera på DictationComplete händelsen:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Hantera sedan återanropet DictationComplete:

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

DikteringFel

Den här händelsen utlöses när ett fel inträffar.

Börja med att prenumerera på DictationError händelsen:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Hantera sedan återanropet DictationError:

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

När du har prenumererat och hanterat dikteringshändelserna som du bryr dig om startar du dikteringsigenkänningen för att börja ta emot händelser.

dictationRecognizer.Start();

Om du inte längre vill behålla DictationRecognizer måste du avbryta prenumerationen på händelserna och ta bort diktamenRecognizer.If you no longer want to keep the DictationRecognizer around, you need to unsubscribe from the events and Dispose the DictationRecognizer.

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

Tips

  • Start() respektive Stop() metoder för att aktivera och inaktivera dikteringsigenkänning.
  • När du har gjort det med identifieraren måste den tas bort med hjälp av Dispose() för att frigöra de resurser som används. De här resurserna frigörs automatiskt under skräpinsamlingen till en extra prestandakostnad om de inte släpps innan dess.
  • Tidsgränser inträffar efter en viss tidsperiod. Du kan söka efter dessa timeouter i händelsen DictationComplete . Det finns två timeouter att vara medveten om:
    1. Om identifieraren startar och inte hör något ljud under de första fem sekunderna överskrids tidsgränsen.
    2. Om identifieraren har gett ett resultat, men sedan hör tystnad i 20 sekunder, överskrids tidsgränsen.

Använda både frasigenkänning och diktering

Om du vill använda både frasigenkänning och diktering i din app måste du stänga av den ena innan du kan starta den andra. Om du har flera KeywordRecognizers igång kan du stänga av alla samtidigt med:

PhraseRecognitionSystem.Shutdown();

Du kan anropa Restart() för att återställa alla igenkännare till deras tidigare tillstånd när DictationRecognizer har stoppats:

PhraseRecognitionSystem.Restart();

Du kan också starta en KeywordRecognizer, som även startar om PhraseRecognitionSystem.

Röstinmatning i Mixed Reality Toolkit

Du hittar MRTK-exempel för röstinmatning i följande demoscener:

Nästa kontrollpunkt för utveckling

Om du följer unity development checkpoint-resan som vi har lagt fram är du nästa uppgift att utforska funktionerna och API:erna för Mixed Reality-plattformen:

Du kan alltid gå tillbaka till Unity-utvecklingspunkterna när som helst.