Definir restricciones de reconocimiento personalizadas
Aprenda a definir y usar restricciones personalizadas para el reconocimiento de voz.
API importantes: SpeechRecognitionTopicConstraint, SpeechRecognitionListConstraint, SpeechRecognitionGrammarFileConstraint
El reconocimiento de voz requiere al menos una restricción para definir un vocabulario reconocible. Si no se especifica ninguna restricción, se usa la gramática de dictado predefinida de las aplicaciones universales de Windows. Consulte Reconocimiento de voz.
Incorporación de restricciones
Use la propiedad SpeechRecognizer.Constraints para agregar restricciones a un reconocedor de voz.
Aquí se tratan los tres tipos de restricciones de reconocimiento de voz que se usan desde dentro de una aplicación. (Para las restricciones de comandos de voz de Cortana, consulte Activar una aplicación en primer plano con comandos de voz a través de Cortana).
- SpeechRecognitionTopicConstraint: restricción basada en una gramática predefinida (dictado o búsqueda web).
- SpeechRecognitionListConstraint: restricción basada en una lista de palabras o frases.
- SpeechRecognitionGrammarFileConstraint: restricción definida en un archivo de especificación de gramática de reconocimiento de voz (SRGS).
Cada reconocedor de voz puede tener una colección de restricciones. Solo estas combinaciones de restricciones son válidas:
- Restricción de un solo tema (dictado o búsqueda web)
- Para Windows 10 Fall Creators Update (10.0.16299.15) y versiones posteriores, se puede combinar una única restricción de tema con una restricción de lista.
- Combinación de restricciones de lista o restricciones de archivo gramatical.
Importante
Llame al método SpeechRecognizer.CompileConstraintsAsync para compilar las restricciones antes de iniciar el proceso de reconocimiento.
Especificar una gramática de búsqueda web (SpeechRecognitionTopicConstraint)
Las restricciones de tema (gramática de dictado o búsqueda web) se deben agregar a la colección de restricciones de un reconocedor de voz.
Nota:
Puede usar speechRecognitionListConstraint junto con speechRecognitionTopicConstraint para aumentar la precisión del dictado proporcionando un conjunto de palabras clave específicas del dominio que cree que es probable que se usen durante el dictado.
Aquí, agregamos una gramática de búsqueda web a la colección de restricciones.
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();
}
Especificar una restricción de lista mediante programación (SpeechRecognitionListConstraint)
Las restricciones de lista se deben agregar a la colección de restricciones de un reconocedor de voz.
No olvides estas cuestiones:
- Puede agregar varias restricciones de lista a una colección de restricciones.
- Puede usar cualquier colección que implemente IIterable<String> para los valores de cadena.
Aquí, especificamos mediante programación una matriz de palabras como una restricción de lista y la agregamos a la colección de restricciones de un reconocedor de voz.
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();
}
Especificar una restricción gramatical SRGS (SpeechRecognitionGrammarFileConstraint)
Los archivos de gramática SRGS deben agregarse a la colección de restricciones de un reconocedor de voz.
La versión 1.0 de SRGS es el lenguaje de marcado estándar del sector para crear gramáticas de formato XML para el reconocimiento de voz. Aunque las aplicaciones universales de Windows proporcionan alternativas al uso de SRGS para crear gramáticas de reconocimiento de voz, es posible que encuentre que el uso de SRGS para crear gramáticas genera los mejores resultados, especialmente para escenarios de reconocimiento de voz más implicados.
Las gramáticas srGS proporcionan un conjunto completo de características que le ayudarán a diseñar una interacción compleja de voz para las aplicaciones. Por ejemplo, con gramáticas SRGS puede:
- Especifique el orden en que se deben reconocer las palabras y frases.
- Combine palabras de varias listas y frases que se van a reconocer.
- Vínculo a otras gramáticas.
- Asigne un peso a una palabra o frase alternativa para aumentar o disminuir la probabilidad de que se use para hacer coincidir la entrada de voz.
- Incluya palabras o frases opcionales.
- Use reglas especiales que ayuden a filtrar entradas no especificadas o imprevistas, como la voz aleatoria que no coincide con la gramática o el ruido de fondo.
- Use la semántica para definir qué significa el reconocimiento de voz para la aplicación.
- Especifique pronunciaciones, ya sea insertadas en una gramática o a través de un vínculo a un léxico.
Para obtener más información sobre los atributos y elementos SRGS, consulta la referencia XML de gramática srGS . Para empezar a crear una gramática SRGS, consulte How to Create a Basic XML Grammar( Creación de una gramática XML básica).
No olvides estas cuestiones:
- Puede agregar varias restricciones de archivo gramatical a una colección de restricciones.
- Use la extensión de archivo .grxml para documentos gramaticales basados en XML que cumplan las reglas de SRGS.
En este ejemplo se usa una gramática SRGS definida en un archivo denominado srgs.grxml (descrito más adelante). En las propiedades del archivo, la acción del paquete se establece en Contenido con Copiar en directorio de salida establecido en Copiar siempre:
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();
}
Este archivo SRGS (srgs.grxml) incluye etiquetas de interpretación semántica. Estas etiquetas proporcionan un mecanismo para devolver los datos de coincidencia gramatical a la aplicación. Las gramáticas deben cumplir la interpretación semántica del World Wide Web Consortium (W3C) para la especificación 1.0 del reconocimiento de voz (SISR).
Aquí escuchamos variantes de "sí" y "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>
Administración de restricciones
Después de cargar una colección de restricciones para el reconocimiento, la aplicación puede administrar qué restricciones están habilitadas para las operaciones de reconocimiento estableciendo la propiedad IsEnabled de una restricción en true o false. La configuración predeterminada es true.
Normalmente es más eficaz cargar restricciones una vez, habilitarlas y deshabilitarlas según sea necesario, en lugar de cargar, descargar y compilar restricciones para cada operación de reconocimiento. Use la propiedad IsEnabled , según sea necesario.
Restringir el número de restricciones sirve para limitar la cantidad de datos que el reconocedor de voz necesita para buscar y coincidir con la entrada de voz. Esto puede mejorar tanto el rendimiento como la precisión del reconocimiento de voz.
Decida qué restricciones están habilitadas en función de las frases que la aplicación puede esperar en el contexto de la operación de reconocimiento actual. Por ejemplo, si el contexto de la aplicación actual es mostrar un color, probablemente no necesite habilitar una restricción que reconozca los nombres de los animales.
Para solicitar al usuario lo que se puede hablar, use las propiedades SpeechRecognizerUIOptions.AudiblePrompt y SpeechRecognizerUIOptions.ExampleText, que se establecen mediante la propiedad SpeechRecognizer.UIOptions. Preparar a los usuarios para lo que pueden decir durante la operación de reconocimiento aumenta la probabilidad de que hablen una frase que pueda coincidir con una restricción activa.