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.
- I Unity-redigeraren går du till Redigera > projektinställningar > spelare
- Välj fliken Windows Store
- I avsnittet Funktioner för publiceringsinställningar > kontrollerar du mikrofonfunktionen
- 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:
- Ange vilka fraser som ska lyssnas efter med hjälp av en
KeywordRecognizer
ellerGrammarRecognizer
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:
- Skapa en ny
DictationRecognizer
- Hantera dikteringshändelser
- Starta dikteringenRecognizer
Aktivera funktionen för diktering
Funktionerna Internetklient och mikrofon måste deklareras för att en app ska kunna använda diktering:
- I Unity-redigeraren går du till Redigera > projektinställningar > spelare
- Välj på fliken Windows Store
- I avsnittet Funktioner för publiceringsinställningar > kontrollerar du funktionen InternetClient
- Om du inte redan har aktiverat mikrofonen kan du också kontrollera mikrofonfunktionen
- 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.
DictationResult
DictationComplete
DictationHypothesis
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()
respektiveStop()
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:- Om identifieraren startar och inte hör något ljud under de första fem sekunderna överskrids tidsgränsen.
- 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.