Definire vincoli di riconoscimento personalizzati
Informazioni su come definire e usare vincoli personalizzati per il riconoscimento vocale.
API importanti: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint
Il riconoscimento vocale richiede almeno un vincolo per definire un vocabolario riconoscibile. Se non viene specificato alcun vincolo, viene usata la grammatica di dettatura predefinita delle app Universal Windows. Vedere Riconoscimento vocale.
Aggiungere i vincoli
Usare la proprietà SpeechRecognizer.Constraints per aggiungere vincoli a un riconoscimento vocale.
Qui si illustrano tre tipi di vincoli di riconoscimento vocale usati dall'interno di un'app. Per i vincoli dei comandi vocali di Cortana, vedi Attivare un'app in primo piano con comandi vocali tramite Cortana.
- SpeechRecognitionTopicConstraint: un vincolo basato su una grammatica predefinita (dettatura o ricerca Web).
- SpeechRecognitionListConstraint: un vincolo basato su un elenco di parole o frasi.
- SpeechRecognitionGrammarFileConstraint: un vincolo definito in file SRGS (Speech Recognition Grammar Specification).
Ogni riconoscimento vocale può avere una raccolta di vincoli. Sono valide solo queste combinazioni di vincoli:
- Vincolo ad argomento singolo (dettatura o ricerca Web)
- Per Windows 10 Fall Creators Update (10.0.16299.15) e versioni successive, è possibile combinare un vincolo ad argomento singolo con un vincolo di elenco
- Combinazione di vincoli di elenco e/o vincoli di file di grammatica.
Importante
Chiamare il metodo SpeechRecognizer.CompileConstraintsAsync per compilare i vincoli prima di avviare il processo di riconoscimento.
Specificare una grammatica di ricerca Web (SpeechRecognitionTopicConstraint)
I vincoli ad argomento (dettatura o grammatica di ricerca Web) devono essere aggiunti alla raccolta di vincoli di un riconoscimento vocale.
Nota
È possibile usare SpeechRecognitionListConstraint con SpeechRecognitionTopicConstraint per aumentare la precisione di dettatura fornendo un set di parole chiave specifiche del dominio che si pensa verranno usate durante la dettatura.
Qui si aggiunge una grammatica di ricerca Web alla raccolta di vincoli.
private async void WeatherSearch_Click(object sender, RoutedEventArgs e)
{
// Create an instance of SpeechRecognizer.
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// Listen for audio input issues.
speechRecognizer.RecognitionQualityDegrading += speechRecognizer_RecognitionQualityDegrading;
// Add a web search grammar to the recognizer.
var webSearchGrammar = new Windows.Media.SpeechRecognition.SpeechRecognitionTopicConstraint(Windows.Media.SpeechRecognition.SpeechRecognitionScenario.WebSearch, "webSearch");
speechRecognizer.UIOptions.AudiblePrompt = "Say what you want to search for...";
speechRecognizer.UIOptions.ExampleText = @"Ex. 'weather for London'";
speechRecognizer.Constraints.Add(webSearchGrammar);
// Compile the constraint.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
//await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
await messageDialog.ShowAsync();
}
Specificare un vincolo di elenco programmatico (SpeechRecognitionListConstraint)
I vincoli di elenco devono essere aggiunti alla raccolta di vincoli di un riconoscimento vocale.
Tieni presente i seguenti punti:
- È possibile aggiungere più vincoli di elenco a una raccolta di vincoli.
- È possibile usare qualsiasi raccolta che implementi IIterable<String> per i valori stringa.
In questo caso, si specifica a livello di codice una matrice di parole come vincolo di elenco e la si aggiunge alla raccolta di vincoli di un riconoscimento vocale.
private async void YesOrNo_Click(object sender, RoutedEventArgs e)
{
// Create an instance of SpeechRecognizer.
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// You could create this array dynamically.
string[] responses = { "Yes", "No" };
// Add a list constraint to the recognizer.
var listConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(responses, "yesOrNo");
speechRecognizer.UIOptions.ExampleText = @"Ex. 'yes', 'no'";
speechRecognizer.Constraints.Add(listConstraint);
// Compile the constraint.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
await messageDialog.ShowAsync();
}
Specificare un vincolo grammaticale SRGS (SpeechRecognitionGrammarFileConstraint)
I file di grammatica SRGS devono essere aggiunti alla raccolta di vincoli di un riconoscimento vocale.
SRGS versione 1.0 è il linguaggio di markup standard del settore per la creazione di grammatiche in formato XML per il riconoscimento vocale. Anche se le app Universal Windows offrono alternative all'uso di SRGS per la creazione di grammatiche di riconoscimento vocale, è possibile che l'uso di SRGS per creare grammatiche produca i risultati migliori, in particolare per scenari di riconoscimento vocale più coinvolgenti.
Le grammatiche SRGS offrono un set completo di funzionalità che consentono di progettare un'interazione vocale complessa per le app. Ad esempio, con le grammatiche SRGS è possibile:
- Specificare l'ordine in cui le parole e le frasi devono essere pronunciate per essere riconosciute.
- Combinare parole da più elenchi e frasi da riconoscere.
- Collegamento ad altre grammatiche.
- Assegnare un peso a una parola o una frase alternativa per aumentare o ridurre la probabilità che venga usata per trovare una corrispondenza con l'input vocale.
- Includere parole o frasi facoltative.
- Usare regole speciali che consentono di filtrare l'input non specificato o imprevisto, ad esempio il riconoscimento vocale casuale che non corrisponde alla grammatica o al rumore di fondo.
- Usare la semantica per definire il significato del riconoscimento vocale per l'app.
- Specificare le pronunce, sia inline in una grammatica sia tramite un collegamento a un lessico.
Per altre informazioni sugli attributi e gli elementi SRGS, vedere Riferimento XML alla grammatica SRGS . Per iniziare a creare una grammatica SRGS, vedere Come creare una grammatica XML di base.
Tieni presente i seguenti punti:
- È possibile aggiungere più vincoli di file di grammatica a una raccolta di vincoli.
- Usare l'estensione di file grxml per i documenti di grammatica basati su XML conformi alle regole SRGS.
Questo esempio usa una grammatica SRGS definita in un file denominato srgs.grxml (descritto più avanti). Nelle proprietà del file, Azione pacchetto è impostato su Contenuto con Copia nella directory di output impostato su Copia sempre:
private async void Colors_Click(object sender, RoutedEventArgs e)
{
// Create an instance of SpeechRecognizer.
var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();
// Add a grammar file constraint to the recognizer.
var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Colors.grxml"));
var grammarFileConstraint = new Windows.Media.SpeechRecognition.SpeechRecognitionGrammarFileConstraint(storageFile, "colors");
speechRecognizer.UIOptions.ExampleText = @"Ex. 'blue background', 'green text'";
speechRecognizer.Constraints.Add(grammarFileConstraint);
// Compile the constraint.
await speechRecognizer.CompileConstraintsAsync();
// Start recognition.
Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = await speechRecognizer.RecognizeWithUIAsync();
// Do something with the recognition result.
var messageDialog = new Windows.UI.Popups.MessageDialog(speechRecognitionResult.Text, "Text spoken");
await messageDialog.ShowAsync();
}
Questo file SRGS (srgs.grxml) include tag di interpretazione semantica. Questi tag forniscono un meccanismo per restituire dati di corrispondenza grammaticale all'app. Le grammatiche devono essere conformi alla specifica World Wide Web Consortium (W3C) Semantic Interpretation for Speech Recognition (SISR) 1.0.
Qui si ascoltano varianti di "sì" e "no".
<grammar xml:lang="en-US"
root="yesOrNo"
version="1.0"
tag-format="semantics/1.0"
xmlns="http://www.w3.org/2001/06/grammar">
<!-- The following rules recognize variants of yes and no. -->
<rule id="yesOrNo">
<one-of>
<item>
<one-of>
<item>yes</item>
<item>yeah</item>
<item>yep</item>
<item>yup</item>
<item>un huh</item>
<item>yay yus</item>
</one-of>
<tag>out="yes";</tag>
</item>
<item>
<one-of>
<item>no</item>
<item>nope</item>
<item>nah</item>
<item>uh uh</item>
</one-of>
<tag>out="no";</tag>
</item>
</one-of>
</rule>
</grammar>
Gestire i vincoli
Dopo che una raccolta di vincoli viene caricata per il riconoscimento, l'app può gestire quali vincoli sono abilitati per le operazioni di riconoscimento impostando la proprietà IsEnabled di un vincolo su true o false. L'impostazione predefinita è true.
In genere, è più efficiente caricare i vincoli una sola volta, abilitandoli e disabilitandoli in base alle esigenze, anziché caricare, scaricare e compilare vincoli per ogni operazione di riconoscimento. Usare la proprietà IsEnabled in base alle esigenze.
Limitando il numero di vincoli si limita la quantità di dati che il riconoscimento vocale deve cercare e far corrispondere all'input vocale. Questo può migliorare sia le prestazioni sia la precisione del riconoscimento vocale.
Decidere quali vincoli abilitare in base alle frasi che l'app può aspettarsi nel contesto dell'operazione di riconoscimento corrente. Ad esempio, se il contesto dell'app corrente è la visualizzazione di un colore, probabilmente non è necessario abilitare un vincolo che riconosca i nomi degli animali.
Per specificare all'utente ciò che può essere pronunciato, usare le proprietà SpeechRecognizerUIOptions.AudiblePrompt e SpeechRecognizerUIOptions.ExampleText, impostate tramite la proprietà SpeechRecognizer.UIOptions. Preparare gli utenti su ciò che possono dire durante l'operazione di riconoscimento aumenta le probabilità che pronuncino una frase abbinabile a un vincolo attivo.