Input vocale in Unity
Attenzione
Prima di iniziare, prendere in considerazione l'uso del plug-in Unity per Speech Services SDK. Il plug-in offre risultati migliori per l'accuratezza vocale e un facile accesso alla decodifica vocale, oltre a funzionalità di riconoscimento vocale avanzate, ad esempio dialogo, interazione basata sulle finalità, traduzione, sintesi vocale e riconoscimento vocale in linguaggio naturale. Per iniziare, vedere l'esempio e la documentazione.
Unity espone tre modi per aggiungere l'input vocale all'applicazione Unity, i primi due tipi di PhraseRecognizer:
- Fornisce
KeywordRecognizer
all'app una matrice di comandi stringa da ascoltare - fornisce
GrammarRecognizer
all'app un file SRGS che definisce una grammatica specifica da ascoltare DictationRecognizer
Consente all'app di ascoltare qualsiasi parola e fornire all'utente una nota o un'altra visualizzazione del parlato
Nota
La dettatura e il riconoscimento delle frasi non possono essere gestiti contemporaneamente. Se grammarRecognizer o KeywordRecognizer è attivo, un Elemento DictationRecognizer non può essere attivo e viceversa.
Abilitazione della funzionalità per Voice
La funzionalità Microfono deve essere dichiarata per consentire a un'app di usare l'input vocale.
- Nell'editor di Unity passare a Modifica > impostazioni > progetto Player
- Selezionare la scheda Windows Store
- Nella sezione Impostazioni > di pubblicazione selezionare la funzionalità Microfono
- Concedere autorizzazioni all'app per l'accesso al microfono nel dispositivo HoloLens
- Ti verrà chiesto di eseguire questa operazione all'avvio del dispositivo, ma se hai fatto clic accidentalmente su "no" puoi modificare le autorizzazioni nelle impostazioni del dispositivo
Riconoscimento frasi
Per consentire all'app di restare in ascolto di frasi specifiche pronunciate dall'utente, è necessario:
- Specificare le frasi da ascoltare tramite o
KeywordRecognizer
GrammarRecognizer
- Gestire l'evento
OnPhraseRecognized
ed eseguire un'azione corrispondente alla frase riconosciuta
KeywordRecognizer
Spazio dei nomi: UnityEngine.Windows.Speech
Tipi: KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
Per salvare alcune sequenze di tasti, sono necessarie alcune istruzioni using:
using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;
Aggiungere quindi alcuni campi alla classe per archiviare il dizionario recognizer e keyword-action>:
KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
Aggiungere ora una parola chiave al dizionario, ad esempio in di un Start()
metodo. In questo esempio viene aggiunta la parola chiave "activate":
//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
// action to be performed when this keyword is spoken
});
Creare lo strumento di riconoscimento delle parole chiave e indicare cosa si vuole riconoscere:
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
Eseguire ora la registrazione per l'evento OnPhraseRecognized
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
Un gestore di esempio è:
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();
}
}
Infine, iniziare a riconoscere!
keywordRecognizer.Start();
GrammarRecognizer
Spazio dei nomi: UnityEngine.Windows.Speech
Tipi: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
GrammarRecognizer viene usato se si specifica la grammatica di riconoscimento usando SRGS. Questo può essere utile se l'app ha più di poche parole chiave, se vuoi riconoscere frasi più complesse o se vuoi attivare e disattivare facilmente set di comandi. Vedere: Creare grammatiche usando SRGS XML per informazioni sul formato di file.
Dopo aver creato la grammatica SRGS, che si trova nel progetto in una cartella StreamingAssets:
<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml
Creare un oggetto GrammarRecognizer
e passarlo al percorso del file SRGS:
private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");
Eseguire ora la registrazione per l'evento OnPhraseRecognized
grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;
Si otterrà un callback contenente le informazioni specificate nella grammatica SRGS, che è possibile gestire in modo appropriato. La maggior parte delle informazioni importanti verrà fornita nella semanticMeanings
matrice.
private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
SemanticMeaning[] meanings = args.semanticMeanings;
// do something
}
Infine, iniziare a riconoscere!
grammarRecognizer.Start();
Dettatura
Spazio dei nomi: UnityEngine.Windows.Speech
Tipi: DictationRecognizer, SpeechError, SpeechSystemStatus
DictationRecognizer
Usare per convertire la voce dell'utente in testo. DictationRecognizer espone la funzionalità di dettatura e supporta la registrazione e l'ascolto di eventi di ipotesi e frasi completate, in modo da poter inviare commenti e suggerimenti all'utente sia mentre parlano che in seguito. Start()
i metodi e Stop()
abilitano e disabilitano rispettivamente il riconoscimento della dettatura. Al termine del riconoscimento, deve essere eliminato usando Dispose()
per rilasciare le risorse usate. Queste risorse verranno rilasciate automaticamente durante la Garbage Collection a un costo aggiuntivo per le prestazioni, se non vengono rilasciate prima.
Sono necessari solo alcuni passaggi per iniziare a dettatura:
- Creare un nuovo
DictationRecognizer
- Gestire gli eventi di dettatura
- Avviare DictationRecognizer
Abilitazione della funzionalità per la dettatura
Le funzionalità client e microfono Internet devono essere dichiarate affinché un'app usi la dettatura:
- Nell'editor di Unity passare a Modifica > impostazioni > progetto Player
- Selezionare la scheda Windows Store
- Nella sezione Impostazioni > di pubblicazione controllare la funzionalità InternetClient
- Facoltativamente, se non è già stato abilitato il microfono, controllare la funzionalità Microfono
- Concedere le autorizzazioni all'app per l'accesso al microfono nel dispositivo HoloLens, se non è già stato fatto
- Ti verrà chiesto di eseguire questa operazione all'avvio del dispositivo, ma se hai fatto clic accidentalmente su "no" puoi modificare le autorizzazioni nelle impostazioni del dispositivo
DictationRecognizer
Creare un oggetto DictationRecognizer come segue:
dictationRecognizer = new DictationRecognizer();
Esistono quattro eventi di dettatura che possono essere sottoscritti e gestiti per implementare il comportamento di dettatura.
DictationResult
DictationComplete
DictationHypothesis
DictationError
DictationResult
Questo evento viene generato dopo la pausa dell'utente, in genere alla fine di una frase. La stringa riconosciuta completa viene restituita qui.
Prima di tutto, sottoscrivere l'evento DictationResult
:
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
Gestire quindi il callback DictationResult:
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// do something
}
DettaturaHypothesis
Questo evento viene generato continuamente mentre l'utente sta parlando. Mentre il riconoscitore ascolta, fornisce il testo di ciò che viene ascoltato finora.
Prima di tutto, sottoscrivere l'evento DictationHypothesis
:
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
Gestire quindi il callback DictationHypothesis:
private void DictationRecognizer_DictationHypothesis(string text)
{
// do something
}
DictationComplete
Questo evento viene generato quando il riconoscitore si arresta, sia che venga chiamato Stop(), che si verifichi un timeout o un altro errore.
Prima di tutto, sottoscrivere l'evento DictationComplete
:
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
Gestire quindi il callback DictationComplete:
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
DictationError
Questo evento viene generato quando si verifica un errore.
Prima di tutto, sottoscrivere l'evento DictationError
:
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
Gestire quindi il callback DictationError:
private void DictationRecognizer_DictationError(string error, int hresult)
{
// do something
}
Dopo aver sottoscritto e gestito gli eventi di dettatura a cui si è interessato, avviare il riconoscimento dettatura per iniziare a ricevere eventi.
dictationRecognizer.Start();
Se non vuoi più mantenere DictationRecognizer, devi annullare la sottoscrizione agli eventi e Dispose the DictationRecognizer.
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();
Suggerimenti
Start()
i metodi eStop()
abilitano e disabilitano rispettivamente il riconoscimento della dettatura.- Al termine del riconoscimento, è necessario eliminarlo usando
Dispose()
per rilasciare le risorse usate. Queste risorse verranno rilasciate automaticamente durante la Garbage Collection a un costo aggiuntivo per le prestazioni, se non vengono rilasciate prima. - I timeout si verificano dopo un periodo di tempo impostato. È possibile verificare la presenza di questi timeout nell'evento
DictationComplete
. È necessario tenere presente due timeout:- Se il riconoscitore viene avviato e non sente alcun audio per i primi cinque secondi, si verifica il timeout.
- Se il riconoscitore ha dato un risultato, ma poi sente il silenzio per 20 secondi, si verifica il timeout.
Uso sia del riconoscimento delle frasi che della dettatura
Se vuoi usare sia il riconoscimento delle frasi che la dettatura nella tua app, dovrai arrestare completamente uno prima di poter avviare l'altro. Se sono in esecuzione più parole chiaveRecognizer, è possibile arrestarli tutti contemporaneamente con:
PhraseRecognitionSystem.Shutdown();
È possibile chiamare Restart()
per ripristinare tutti i riconoscitori allo stato precedente dopo l'arresto di DictationRecognizer:
PhraseRecognitionSystem.Restart();
È anche possibile avviare una parola chiaveRecognizer, che riavvierà anche PhraseRecognitionSystem.
Input vocale in Realtà mista Toolkit
È possibile trovare esempi di MRTK per l'input vocale nelle scene demo seguenti:
Successivo checkpoint di sviluppo
Se si sta seguendo il percorso di checkpoint per lo sviluppo di Unity, l'attività successiva consiste nell'esplorare le funzionalità e le API della piattaforma Realtà mista:
È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.