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.

  1. Nell'editor di Unity passare a Modifica > impostazioni > progetto Player
  2. Selezionare la scheda Windows Store
  3. Nella sezione Impostazioni > di pubblicazione selezionare la funzionalità Microfono
  4. 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:

  1. Specificare le frasi da ascoltare tramite o KeywordRecognizerGrammarRecognizer
  2. 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:

  1. Creare un nuovo DictationRecognizer
  2. Gestire gli eventi di dettatura
  3. Avviare DictationRecognizer

Abilitazione della funzionalità per la dettatura

Le funzionalità client e microfono Internet devono essere dichiarate affinché un'app usi la dettatura:

  1. Nell'editor di Unity passare a Modifica > impostazioni > progetto Player
  2. Selezionare la scheda Windows Store
  3. Nella sezione Impostazioni > di pubblicazione controllare la funzionalità InternetClient
    • Facoltativamente, se non è già stato abilitato il microfono, controllare la funzionalità Microfono
  4. 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.

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. 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 e Stop() 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:
    1. Se il riconoscitore viene avviato e non sente alcun audio per i primi cinque secondi, si verifica il timeout.
    2. 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.