Windows Phone 8: APIs de trabajo con voz

Hola a todos!

Hoy vamos a examinar una de las principales novedades que incorpora Windows Phone 8: Las APIs de voz. Aunque el reconocimiento de voz ya estaba disponible en Windows Phone 7.X, no existían APIs que pudiésemos consumir para incluir este tipo de funcionalidad en nuestras aplicaciones.

Pero con Windows Phone 8, esto ha cambiado. Podemos usar el reconocimiento de voz en nuestros proyectos por tres vías distintas:

  • Comandos de voz. Nos permitirán ejecutar acciones sobre nuestra aplicación mediante órdenes verbales.
  • Voz a texto. Reconocimiento de voz, nos devolverá el texto reconocido de lo que el usuario haya dicho.
  • Texto a voz. Sintetización de voz. Dado un texto, será leído.

Para las tres funcionalidades necesitaremos incluir en nuestro manifiesto la capacidad ID_CAP_SPEECH_RECOGNITION, de lo contrario obtendremos una excepción al intentar usarlas.

Comandos de voz

Como ya hemos mencionado, los comandos de voz nos permiten dar ordenes al dispositivo de forma verbal. Definimos las órdenes soportadas mediante archivos de definición de comandos de voz (VCD, Voice Commands Definition). Estos archivos son XML con la siguiente estructura:

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="es-ES">
    <CommandPrefix>Kit</CommandPrefix>
    <Example> ayudame</Example>

    <Command Name="HelpMe">
      <Example> ayudame</Example>
      <ListenFor> ayudame </ListenFor>
      <Feedback> Estoy en camino Michael... </Feedback>
      <Navigate Target="OnTheWay.xaml" />
    </Command>
  </CommandSet>
</VoiceCommands>

En primer lugar encontramos el nodo CommandSet, donde especificamos el idioma del comando y que contendrá los diferentes comandos. A continuación tenemos el nodo CommandPrefix, este indica el nombre que debe ser reconocido y asignado a la aplicación. La acción central se encuentra en el nodo Command, que define la acción propiamente dicha. Le asignamos un nombre único a cada comando y definimos el texto que debe escuchar en el nodo ListenFor, el feedback que debe mostrar al usuario una vez que haya reconocido un comando y la página XAML dentro de nuestra aplicación a la que deseamos que navegue al recibir este comando. Dentro de un archivo VCD podemos tener tantos comandos como deseemos.

Algo importante es que recordemos establecer como contenido y copiar siempre en las propiedades del archivo VCD.

Una vez que tenemos definido nuestro comando, solo nos queda registrarlo con el sistema operativo. Para ello usaremos la clase VoiceCommandService, en concreto el método InstallCommandSetsFromFileAsync, al que pasaremos la ruta de nuestro archivo VCD, con el esquema ms-appx:

await VoiceCommandService.InstallCommandSetsFromFileAsync(new Uri("ms-appx:///Commands.xml"));

Por último solo nos queda tener la página de destino del comando (OnTheWay.xaml) lista y podremos probar la aplicación. Para ello, solo necesitamos ejecutarla en un emulador o en el dispositivo (botón derecho sobre el proyecto > Deploy) y presionar durante unos segundos el botón inicio. En ese momento aparecerá la pantalla de reconocimiento de voz, donde podremos decir “kit ayudame” y debería aparecer Kit en pantalla!!

image

Para que funcione correctamente, debemos tener el emulador o el dispositivo configurado en idioma español. Si queremos soportar varias culturas, podemos hacer distintos archivos, uno para cada cultura, indicando en el CommandSet la cultura que deseamos usar en cada uno de ellos.

Voz a texto

Otra gran utilidad que podemos incluir en nuestra aplicación es el reconocimiento de voz y su traslado a texto plano que podamos usar y procesar. Para esto necesitaremos añadir otra capacidad más a nuestra aplicación: ID_CAP_MICROPHONE, además de la capacidad de reconocimiento de voz que ya indicamos anteriormente.

Para el reconocimiento de voz usaremos el namespace Windows.Phone.Speech.Recognition. Exactamente la clase SpeechRecognizerUI, que nos muestra la interface standard de reconocimiento de Windows Phone 8. En esta clase podemos indicar en su propiedad Settings, distintos parámetros como pueden ser el texto de ejemplo a mostrar, el texto de cabecera (“Escuchando…”) también podemos cambiarlo, si queremos que el texto reconocido se lea al usuario automáticamente para confirmarlo y si queremos mostrar una página de confirmación al usuario. También tenemos la propiedad Recognizer. Esta propiedad nos permitirá cambiar el modulo de reconocimiento de voz que usa Windows Phone (solo para esa ejecución, no es un cambio permanente en el sistema) por otro distinto, por ejemplo en otro idioma.

private async void PressToSpeech_Click(object sender, RoutedEventArgs e)
{
    SpeechRecognizerUI speechRecognizer = new SpeechRecognizerUI();

    var spanishRecognizer = InstalledSpeechRecognizers.All.Where(sr => sr.Language == "es-ES").FirstOrDefault();

    speechRecognizer.Settings.ExampleText = "Esto es una prueba";
    speechRecognizer.Settings.ListenText = "Vamos, habla!!";

    speechRecognizer.Recognizer.SetRecognizer(spanishRecognizer);

    var result = await speechRecognizer.RecognizeWithUIAsync();

    if (result != null)
        txtRecognized.Text = result.RecognitionResult.Text;
}

En este ejemplo filtramos la colección InstalledSpeechRecognizers para buscar un reconocedor en castellano y a continuación usamos el método SetRecognizer de la propiedad Recognizer para establecerlo. Por último solo nos queda llamar a RecognizeWithUIAsync y esperar el resultado.

image

Text to Voice

Por último pero no menos importante, podemos realizar la operación contraria: escribir texto en nuestra aplicación y que el sintetizador de Windows Phone lo lea. Para ello usaremos el namespace Windows.Phone.Speech.Synthesis, en concreto la clase SpeechSynthesizer. De forma parecida a la clase SpeechRecognizerUI, podemos también elegir el sintetizador que deseamos usar de la clase InstalledVoices y la estableceremos con el método SetVoice. Por último solo tendremos que llamar al método SpeakTextAsync pasando el texto que deseemos como parámetro:

private async void SpeakText_Click(object sender, RoutedEventArgs e)
{
    SpeechSynthesizer speechSynth = new SpeechSynthesizer();

    var synth = InstalledVoices.All.Where(iv => iv.Language == "es-ES").FirstOrDefault();

    speechSynth.SetVoice(synth);

    await speechSynth.SpeakTextAsync(txtText.Text);
}

Conclusión

No sé que os parecerá a vosotros, pero a mi me encanta lo sencillo de implementar que es el reconocimiento de voz en cualquiera de sus tres sabores (comandos, voz a texto, texto a voz) y le veo una utilidad increíble. Todos deberíamos implementarlo en nuestras aplicaciones y hacerlas así mucho más accesibles a cualquier persona.

Como siempre, aquí os dejo tres proyectos de prueba para que veáis el código en funcionamiento y podáis jugar con el.

Un saludo y Happy Coding!

4 comentarios sobre “Windows Phone 8: APIs de trabajo con voz”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *