Input vocale in Unity

Attenzione

Prima di iniziare, prendere in considerazione l'uso del plug-in Unity per Speech Services SDK per Servizi cognitivi. Il plug-in offre risultati migliori per l'accuratezza del riconoscimento 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 input vocale all'applicazione Unity, i primi due tipi di PhraseRecognizer:

  • Fornisce KeywordRecognizer all'app una matrice di comandi stringa per l'ascolto
  • fornisce GrammarRecognizer all'app un file SRGS che definisce una grammatica specifica per l'ascolto
  • Consente DictationRecognizer all'app di ascoltare qualsiasi parola e fornire all'utente una nota o un'altra visualizzazione del parlato

Nota

Il riconoscimento della dettatura e della frase non può essere gestito contemporaneamente. Se grammarRecognizer o KeywordRecognizer è attivo, un Oggetto DictationRecognizer non può essere attivo e viceversa.If a GrammarRecognizer or KeywordRecognizer is active, a DictationRecognizer can't be active and 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 Edit Project Settings Player (Modifica > lettore impostazioni > progetto)
  2. Selezionare la scheda Windows Store
  3. Nella sezione Funzionalità delle impostazioni > di pubblicazione controllare la funzionalità Microfono
  4. Concedere autorizzazioni all'app per l'accesso al microfono nel dispositivo HoloLens
    • Verrà chiesto di eseguire questa operazione all'avvio del dispositivo, ma se si è accidentalmente fatto clic su "no" è possibile modificare le autorizzazioni nelle impostazioni del dispositivo

Riconoscimento di frasi

Per consentire all'app di restare in ascolto di frasi specifiche pronunciate dall'utente, è necessario:

  1. Specificare le frasi da ascoltare usando un KeywordRecognizer oggetto o GrammarRecognizer
  2. Gestire l'evento OnPhraseRecognized ed eseguire un'azione corrispondente alla frase riconosciuta

KeywordRecognizer

Spazio dei nomi:UnityEngine.Windows.Speech
Types: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 sistema di riconoscimento e il dizionario di azioni per parole chiave>:

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 il riconoscitore di 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, 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

Usare per DictationRecognizer 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 mentre parlano e 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 l'operazione di Garbage Collection a un costo aggiuntivo per le prestazioni, se non vengono rilasciate prima.

Per iniziare a usare la dettatura sono necessari solo alcuni passaggi:

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

Abilitazione della funzionalità di dettatura

Le funzionalità Client Internet e Microfono devono essere dichiarate per consentire a un'app di usare la dettatura:

  1. Nell'editor di Unity passare a Modifica > impostazioni > progetto Player
  2. Selezionare nella scheda Windows Store
  3. Nella sezione Funzionalità delle impostazioni > di pubblicazione controllare la funzionalità InternetClient
    • Facoltativamente, se non è già stato abilitato il microfono, controllare la funzionalità Microfono
  4. Concedere autorizzazioni all'app per l'accesso al microfono nel dispositivo HoloLens, se non è già stato fatto
    • Verrà chiesto di eseguire questa operazione all'avvio del dispositivo, ma se si è accidentalmente fatto clic su "no" è possibile 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 sospensione dell'utente, in genere alla fine di una frase. La stringa riconosciuta completa viene restituita qui.

Per prima cosa, sottoscrivere l'evento DictationResult :

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Gestire quindi il callback DictationResult:

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

DictationHypothesis

Questo evento viene generato continuamente mentre l'utente sta parlando. Mentre il riconoscitore è in ascolto, fornisce un testo di ciò che viene sentito finora.

Per prima cosa, 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, se viene chiamato Stop(), un timeout che si verifica o un altro errore.

Per prima cosa, 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.

Per prima cosa, 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 della 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 l'operazione di 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 . Esistono due timeout da tenere presenti:
    1. Se il riconoscitore viene avviato e non sente alcun audio per i primi cinque secondi, si verifica il timeout.
    2. Se il riconoscimento ha dato un risultato, ma poi sente il silenzio per 20 secondi, verrà timeout.

Uso sia del riconoscimento delle frasi che della dettatura

Se si vuole usare sia il riconoscimento delle frasi che la dettatura nell'app, sarà necessario 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 riconoscimento allo stato precedente dopo l'arresto di DictationRecognizer:

PhraseRecognitionSystem.Restart();

È anche possibile avviare una parola chiaveRecognizer, che riavvia anche PhraseRecognitionSystem.

Input vocale in Realtà mista Toolkit

È possibile trovare esempi MRTK per l'input vocale nelle scene demo seguenti:

Successivo checkpoint di sviluppo

Se si segue il percorso del checkpoint di sviluppo di Unity, si sta esplorando le funzionalità e le API della piattaforma di Realtà mista:

È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.