Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aprenda a capturar y reconocer la entrada de voz para dictado continuo y prolongado en su aplicación con SDK de Aplicaciones para Windows.
Importante
El reconocimiento de voz requiere la identidad del paquete MSIX. Las API Windows.Media.SpeechRecognition solo están disponibles cuando la aplicación se ejecuta con identidad de paquete (empaquetada o empaquetada con una ubicación externa). Las aplicaciones sin empaquetar no pueden usar estas API.
APIs clave
Visión general
En Reconocimiento de voz, aprenderá a capturar y reconocer fragmentos cortos de voz con RecognizeAsync o RecognizeWithUIAsync. Para sesiones más prolongadas de reconocimiento del habla continuo, como dictado o correo electrónico, use la propiedad ContinuousRecognitionSession de un SpeechRecognizer para obtener un objeto SpeechContinuousRecognitionSession.
Nota:
La compatibilidad del lenguaje de dictado depende del dispositivo en el que se ejecuta la aplicación. Para PC y portátiles, solo se reconoce en-US para el dictado, mientras que Xbox puede reconocer todos los idiomas admitidos por el reconocimiento de voz. Para obtener más información, consulte Especificar el idioma del reconocedor de voz.
Configuración
La aplicación necesita los siguientes objetos para administrar una sesión de dictado continua:
- Una instancia de un objeto
SpeechRecognizer. - Referencia al distribuidor de la interfaz de usuario para actualizar la interfaz de usuario durante el dictado.
- Una manera de realizar un seguimiento de las palabras acumuladas habladas por el usuario.
Declare una instancia de SpeechRecognizer y un StringBuilder para acumular los resultados del reconocimiento como campos de su clase de página:
private SpeechRecognizer speechRecognizer;
private StringBuilder dictatedTextBuilder;
En WinUI 3, se usa DispatcherQueue para enviar actualizaciones de la interfaz de usuario desde subprocesos en segundo plano (no CoreDispatcher):
// Get the DispatcherQueue for the current thread (UI thread).
private Microsoft.UI.Dispatching.DispatcherQueue dispatcherQueue =
Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread();
Initialize
Durante la inicialización, puede:
- Inicialice el reconocedor de voz.
- Compile la gramática de dictado integrada (o agregue restricciones personalizadas).
- Configura detectores de eventos para los eventos de reconocimiento.
// Initialize the speech recognizer.
speechRecognizer = new SpeechRecognizer();
// Compile the default dictation grammar.
SpeechRecognitionCompilationResult result =
await speechRecognizer.CompileConstraintsAsync();
// Subscribe to continuous recognition events.
speechRecognizer.ContinuousRecognitionSession.ResultGenerated +=
ContinuousRecognitionSession_ResultGenerated;
speechRecognizer.ContinuousRecognitionSession.Completed +=
ContinuousRecognitionSession_Completed;
speechRecognizer.HypothesisGenerated +=
SpeechRecognizer_HypothesisGenerated;
dictatedTextBuilder = new StringBuilder();
Controlar eventos de reconocimiento
ResultadoGenerado
El ResultGenerated evento se desencadena cuando el usuario habla. El reconocedor pasa periódicamente un fragmento de entrada de voz. Compruebe la Confidence propiedad para decidir si desea aceptar el resultado.
Dado que este evento se desencadena en un subproceso en segundo plano, use DispatcherQueue.TryEnqueue para actualizar la interfaz de usuario:
private void ContinuousRecognitionSession_ResultGenerated(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionResultGeneratedEventArgs args)
{
if (args.Result.Confidence == SpeechRecognitionConfidence.Medium ||
args.Result.Confidence == SpeechRecognitionConfidence.High)
{
dictatedTextBuilder.Append(args.Result.Text + " ");
dispatcherQueue.TryEnqueue(() =>
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
btnClearText.IsEnabled = true;
});
}
}
Completado
El Completed evento indica que la sesión de reconocimiento continuo ha finalizado. La sesión finaliza cuando se llama a StopAsync o CancelAsync, o cuando se produce un error, o cuando el usuario ha dejado de hablar.
private void ContinuousRecognitionSession_Completed(
SpeechContinuousRecognitionSession sender,
SpeechContinuousRecognitionCompletedEventArgs args)
{
if (args.Status != SpeechRecognitionResultStatus.Success)
{
dispatcherQueue.TryEnqueue(() =>
{
if (args.Status == SpeechRecognitionResultStatus.TimeoutExceeded)
{
dictationTextBox.Text = dictatedTextBuilder.ToString();
}
});
}
}
Hipótesisgenerada
Controle el HypothesisGenerated evento para mostrar los resultados provisionales mientras el reconocedor sigue procesando. Esto mejora la capacidad de respuesta al proporcionar los comentarios del usuario antes de que haya disponible un resultado final:
private void SpeechRecognizer_HypothesisGenerated(
SpeechRecognizer sender,
SpeechRecognitionHypothesisGeneratedEventArgs args)
{
string hypothesis = args.Hypothesis.Text;
string textboxContent = dictatedTextBuilder.ToString() + " " + hypothesis + " ...";
dispatcherQueue.TryEnqueue(() =>
{
dictationTextBox.Text = textboxContent;
btnClearText.IsEnabled = true;
});
}
Iniciar y detener el reconocimiento
Compruebe el estado del reconocedor antes de iniciar o detener una sesión:
// Start continuous recognition.
if (speechRecognizer.State == SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StartAsync();
}
// Stop continuous recognition (lets pending events complete).
if (speechRecognizer.State != SpeechRecognizerState.Idle)
{
await speechRecognizer.ContinuousRecognitionSession.StopAsync();
}
Para cancelar inmediatamente y descartar los resultados pendientes, llame a CancelAsync en lugar de StopAsync.
Nota:
Un evento ResultGenerated podría activarse después de llamar a CancelAsync debido al multihilo. Si establece campos privados al cancelar la sesión de reconocimiento, valide siempre sus valores en el ResultGenerated controlador.