Compartir a través de


Reconocimiento de voz

Use el reconocimiento de voz para proporcionar entrada, especificar una acción o un comando y realizar tareas.

API importantes: Windows.Media.SpeechRecognition

El reconocimiento de voz se compone de un entorno de ejecución de voz, api de reconocimiento para programar el tiempo de ejecución, gramáticas listas para usar para dictado y búsqueda web, y una interfaz de usuario del sistema predeterminada que ayuda a los usuarios a detectar y usar características de reconocimiento de voz.

Configuración del reconocimiento de voz

Para admitir el reconocimiento de voz con la aplicación, el usuario debe conectar y habilitar un micrófono en su dispositivo y aceptar la Directiva de privacidad de Microsoft concediéndole permiso para que la aplicación la use.

Para preguntar automáticamente al usuario con un cuadro de diálogo del sistema que solicita permiso para acceder y usar la fuente de audio del micrófono (por ejemplo, el ejemplo del ejemplo de reconocimiento de voz y síntesis de voz que se muestra a continuación), simplemente establezca la funcionalidad del dispositivo Micrófono en el manifiesto del paquete de aplicación. Para obtener más información, consulte Declaraciones de funcionalidad de la aplicación.

Directiva de privacidad para el acceso al micrófono

Si el usuario hace clic en Sí para conceder acceso al micrófono, la aplicación se agrega a la lista de aplicaciones aprobadas en la página Configuración -> Privacidad -> Micrófono. Sin embargo, como el usuario puede optar por desactivar esta configuración en cualquier momento, debes confirmar que la aplicación tiene acceso al micrófono antes de intentar usarla.

Si también desea admitir dictados, Cortana u otros servicios de reconocimiento de voz (como una gramática predefinida definida en una restricción de tema), también debe confirmar que el reconocimiento de voz en línea (Configuración -> Privacidad -> Voz) está habilitado.

Este fragmento de código muestra cómo la aplicación puede comprobar si hay un micrófono presente y si tiene permiso para usarlo.

public class AudioCapturePermissions
{
    // If no microphone is present, an exception is thrown with the following HResult value.
    private static int NoCaptureDevicesHResult = -1072845856;

    /// <summary>
    /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
    /// the Cortana/Dictation privacy check.
    ///
    /// You should perform this check every time the app gets focus, in case the user has changed
    /// the setting while the app was suspended or not in focus.
    /// </summary>
    /// <returns>True, if the microphone is available.</returns>
    public async static Task<bool> RequestMicrophonePermission()
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings();
            settings.StreamingCaptureMode = StreamingCaptureMode.Audio;
            settings.MediaCategory = MediaCategory.Speech;
            MediaCapture capture = new MediaCapture();

            await capture.InitializeAsync(settings);
        }
        catch (TypeLoadException)
        {
            // Thrown when a media player is not available.
            var messageDialog = new Windows.UI.Popups.MessageDialog("Media player components are unavailable.");
            await messageDialog.ShowAsync();
            return false;
        }
        catch (UnauthorizedAccessException)
        {
            // Thrown when permission to use the audio capture device is denied.
            // If this occurs, show an error or disable recognition functionality.
            return false;
        }
        catch (Exception exception)
        {
            // Thrown when an audio capture device is not present.
            if (exception.HResult == NoCaptureDevicesHResult)
            {
                var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                await messageDialog.ShowAsync();
                return false;
            }
            else
            {
                throw;
            }
        }
        return true;
    }
}
/// <summary>
/// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
/// the Cortana/Dictation privacy check.
///
/// You should perform this check every time the app gets focus, in case the user has changed
/// the setting while the app was suspended or not in focus.
/// </summary>
/// <returns>True, if the microphone is available.</returns>
IAsyncOperation<bool>^  AudioCapturePermissions::RequestMicrophonePermissionAsync()
{
    return create_async([]() 
    {
        try
        {
            // Request access to the audio capture device.
            MediaCaptureInitializationSettings^ settings = ref new MediaCaptureInitializationSettings();
            settings->StreamingCaptureMode = StreamingCaptureMode::Audio;
            settings->MediaCategory = MediaCategory::Speech;
            MediaCapture^ capture = ref new MediaCapture();

            return create_task(capture->InitializeAsync(settings))
                .then([](task<void> previousTask) -> bool
            {
                try
                {
                    previousTask.get();
                }
                catch (AccessDeniedException^)
                {
                    // Thrown when permission to use the audio capture device is denied.
                    // If this occurs, show an error or disable recognition functionality.
                    return false;
                }
                catch (Exception^ exception)
                {
                    // Thrown when an audio capture device is not present.
                    if (exception->HResult == AudioCapturePermissions::NoCaptureDevicesHResult)
                    {
                        auto messageDialog = ref new Windows::UI::Popups::MessageDialog("No Audio Capture devices are present on this system.");
                        create_task(messageDialog->ShowAsync());
                        return false;
                    }

                    throw;
                }
                return true;
            });
        }
        catch (Platform::ClassNotRegisteredException^ ex)
        {
            // Thrown when a media player is not available. 
            auto messageDialog = ref new Windows::UI::Popups::MessageDialog("Media Player Components unavailable.");
            create_task(messageDialog->ShowAsync());
            return create_task([] {return false; });
        }
    });
}
var AudioCapturePermissions = WinJS.Class.define(
    function () { }, {},
    {
        requestMicrophonePermission: function () {
            /// <summary>
            /// Note that this method only checks the Settings->Privacy->Microphone setting, it does not handle
            /// the Cortana/Dictation privacy check.
            ///
            /// You should perform this check every time the app gets focus, in case the user has changed
            /// the setting while the app was suspended or not in focus.
            /// </summary>
            /// <returns>True, if the microphone is available.</returns>
            return new WinJS.Promise(function (completed, error) {

                try {
                    // Request access to the audio capture device.
                    var captureSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
                    captureSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
                    captureSettings.mediaCategory = Windows.Media.Capture.MediaCategory.speech;

                    var capture = new Windows.Media.Capture.MediaCapture();
                    capture.initializeAsync(captureSettings).then(function () {
                        completed(true);
                    },
                    function (error) {
                        // Audio Capture can fail to initialize if there's no audio devices on the system, or if
                        // the user has disabled permission to access the microphone in the Privacy settings.
                        if (error.number == -2147024891) { // Access denied (microphone disabled in settings)
                            completed(false);
                        } else if (error.number == -1072845856) { // No recording device present.
                            var messageDialog = new Windows.UI.Popups.MessageDialog("No Audio Capture devices are present on this system.");
                            messageDialog.showAsync();
                            completed(false);
                        } else {
                            error(error);
                        }
                    });
                } catch (exception) {
                    if (exception.number == -2147221164) { // REGDB_E_CLASSNOTREG
                        var messageDialog = new Windows.UI.Popups.MessageDialog("Media Player components not available on this system.");
                        messageDialog.showAsync();
                        return false;
                    }
                }
            });
        }
    })

Reconocimiento de la entrada de voz

Una restricción define las palabras y frases (vocabulario) que una aplicación reconoce en la entrada de voz. Las restricciones están en el núcleo del reconocimiento de voz y proporcionan a la aplicación un mayor control sobre la precisión del reconocimiento de voz.

Puede usar los siguientes tipos de restricciones para reconocer la entrada de voz.

Gramáticas predefinidas

Las gramáticas predefinidas de dictado y búsqueda web proporcionan reconocimiento de voz para la aplicación sin necesidad de crear una gramática. Al usar estas gramáticas, un servicio web remoto realiza el reconocimiento de voz y los resultados se devuelven al dispositivo.

La gramática de dictado de texto libre predeterminada puede reconocer la mayoría de las palabras y frases que un usuario puede decir en un idioma determinado y está optimizada para reconocer frases cortas. La gramática de dictado predefinida se usa si no especifica ninguna restricción para el objeto SpeechRecognizer. El dictado de texto libre es útil cuando no desea limitar los tipos de cosas que un usuario puede decir. Los usos típicos incluyen la creación de notas o el dictado del contenido de un mensaje.

La gramática de búsqueda web, como una gramática de dictado, contiene un gran número de palabras y frases que un usuario podría decir. Sin embargo, está optimizado para reconocer términos que las personas suelen usar al buscar en la web.

Nota:

 Dado que los dictados predefinidos y las gramáticas de búsqueda web pueden ser grandes y, dado que están en línea (no en el dispositivo), es posible que el rendimiento no sea tan rápido como con una gramática personalizada instalada en el dispositivo.  

Estas gramáticas predefinidas se pueden usar para reconocer hasta 10 segundos de entrada de voz y no requieren ningún esfuerzo de creación por su parte. Sin embargo, requieren una conexión a una red.

Para usar restricciones de servicio web, la compatibilidad con la entrada de voz y el dictado debe estar habilitada en Configuración activando la opción "Obtener a conocerme" en Configuración - Privacidad ->> Voz, entrada manuscrita y escritura.

Aquí se muestra cómo probar si la entrada de voz está habilitada y se abre la página Configuración :> privacidad:> voz, entrada manuscrita y escritura, si no.

En primer lugar, inicializamos una variable global (HResultPrivacyStatementDeclined) en el valor HResult de 0x80045509. Consulte Control de excepciones para en C# o Visual Basic.

private static uint HResultPrivacyStatementDeclined = 0x80045509;

A continuación, se detectan excepciones estándar durante el reconocimiento y se prueba si el valor HResult es igual al valor de la variable HResultPrivacyStatementDeclined. Si es así, se muestra una advertencia y se llama await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); a para abrir la página Configuración.

catch (Exception exception)
{
  // Handle the speech privacy policy error.
  if ((uint)exception.HResult == HResultPrivacyStatementDeclined)
  {
    resultTextBlock.Visibility = Visibility.Visible;
    resultTextBlock.Text = "The privacy statement was declined." + 
      "Go to Settings -> Privacy -> Speech, inking and typing, and ensure you" +
      "have viewed the privacy policy, and 'Get To Know You' is enabled.";
    // Open the privacy/speech, inking, and typing settings page.
    await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-accounts")); 
  }
  else
  {
    var messageDialog = new Windows.UI.Popups.MessageDialog(exception.Message, "Exception");
    await messageDialog.ShowAsync();
  }
}

Consulte SpeechRecognitionTopicConstraint.

Restricciones de lista mediante programación

Las restricciones de lista mediante programación proporcionan un enfoque ligero para crear gramáticas simples mediante una lista de palabras o frases. Una restricción de lista funciona bien para reconocer frases cortas y distintas. Especificar explícitamente todas las palabras de una gramática también mejora la precisión del reconocimiento, ya que el motor de reconocimiento de voz solo debe procesar la voz para confirmar una coincidencia. La lista también se puede actualizar mediante programación.

Una restricción de lista consta de una matriz de cadenas que representa la entrada de voz que la aplicación aceptará para una operación de reconocimiento. Puede crear una restricción de lista en la aplicación creando un objeto list-constraint de reconocimiento de voz y pasando una matriz de cadenas. A continuación, agregue ese objeto a la colección de restricciones del reconocedor. El reconocimiento se realiza correctamente cuando el reconocedor de voz reconoce cualquiera de las cadenas de la matriz.

Consulte SpeechRecognitionListConstraint.

Gramáticas srGS

Una gramática de la especificación de gramática de reconocimiento de voz (SRGS) es un documento estático que, a diferencia de una restricción de lista mediante programación, usa el formato XML definido por la versión 1.0 de SRGS. Una gramática SRGS proporciona el mayor control sobre la experiencia de reconocimiento de voz al permitirle capturar varios significados semánticos en un solo reconocimiento.

Consulte SpeechRecognitionGrammarFileConstraint.

Restricciones de comandos de voz

Usa un archivo XML de definición de comandos de voz (VCD) para definir los comandos que el usuario puede decir para iniciar acciones al activar la aplicación. Para obtener más información, consulte Activación de una aplicación en primer plano con comandos de voz a través de Cortana.

Consulte SpeechRecognitionVoiceCommandDefinitionConstraint./

Nota El tipo de restricción que usa depende de la complejidad de la experiencia de reconocimiento que desea crear. Cualquiera podría ser la mejor opción para una tarea de reconocimiento específica y podrías encontrar usos para todos los tipos de restricciones de la aplicación. Para empezar a trabajar con restricciones, consulte Definición de restricciones de reconocimiento personalizadas.

La gramática de dictado de aplicaciones universales predefinidas de Windows reconoce la mayoría de las palabras y frases cortas en un idioma. Se activa de forma predeterminada cuando se crea una instancia de un objeto de reconocedor de voz sin restricciones personalizadas.

En este ejemplo, se muestra cómo:

  • Cree un reconocedor de voz.
  • Compile las restricciones predeterminadas de la aplicación universal de Windows (no se han agregado gramáticas al conjunto de gramáticas del reconocedor de voz).
  • Comience a escuchar voz mediante la interfaz de usuario de reconocimiento básica y los comentarios de TTS proporcionados por el método RecognizeWithUIAsync. Use el método RecognizeAsync si no se requiere la interfaz de usuario predeterminada.
private async void StartRecognizing_Click(object sender, RoutedEventArgs e)
{
    // Create an instance of SpeechRecognizer.
    var speechRecognizer = new Windows.Media.SpeechRecognition.SpeechRecognizer();

    // Compile the dictation grammar by default.
    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();
}

Personalización de la interfaz de usuario de reconocimiento

Cuando la aplicación intenta el reconocimiento de voz llamando a SpeechRecognizer.RecognizeWithUIAsync, se muestran varias pantallas en el orden siguiente.

Si usa una restricción basada en una gramática predefinida (dictado o búsqueda web):

  • Pantalla de escucha .
  • La pantalla pensando .
  • La pantalla Oí decir o la pantalla de error.

Si usa una restricción basada en una lista de palabras o frases, o una restricción basada en un archivo de gramática SRGS:

  • Pantalla de escucha .
  • La pantalla ¿Dijiste ? si lo que dijo el usuario podría interpretarse como más de un posible resultado.
  • La pantalla Oí decir o la pantalla de error.

En la imagen siguiente se muestra un ejemplo del flujo entre pantallas de un reconocedor de voz que usa una restricción basada en un archivo de gramática SRGS. En este ejemplo, el reconocimiento de voz se realizó correctamente.

pantalla de reconocimiento inicial para una restricción basada en un archivo de gramática de sgrs

pantalla de reconocimiento intermedio para una restricción basada en un archivo de gramática de sgrs

pantalla de reconocimiento final para una restricción basada en un archivo de gramática de sgrs

La pantalla De escucha puede proporcionar ejemplos de palabras o frases que la aplicación puede reconocer. Aquí se muestra cómo usar las propiedades de la clase SpeechRecognizerUIOptions (obtenida llamando a la propiedad SpeechRecognizer.UIOptions) para personalizar el contenido en la pantalla de escucha.

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();
}

Muestras