Cómo añadir comandos de voz a una app en Windows Phone 8
WP8 tiene comandos de voz, y son muy fáciles de implementar en tu app. La gracia que tiene la implementación de comandos de voz de Windows Phone es que es a nivel de sistema, por ejemplo, puedes invocar comandos de voz desde cualquier parte, sólo manteniendo presionada la tecla Windows, o el botón de tu manos libres. Además, los comandos de voz que añadas a tu aplicación puedes contener parámetros.
Hagamos un ejercicio sencillo, añadiendo comandos de voz a una app en blanco. Creamos un nuevo proyecto de tipo Windows Phone App, para Windows Phone 8. Luego click con botón derecho en el nombre del proyecto, Add -> New Item.
Luego marcamos C#, Windows Phone, Voice Command Definition y OK.
El template que viene es bien útil, salvo por un detalle: el idioma está seteado en en-US, tienen que añadir un nodo CommandSet por cada idioma que soporten. Por ejemplo, Windows Phone 8 tiene es-ES y es-MX, tienen que añadir ambos para que las apps funcionen correctamente en toda hispanoamérica.
Para el ejemplo, vamos a borrar todo lo que viene y vamos a definir dos comandos sencillos.
<?xml version="1.0" encoding="utf-8"?> <VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.0"> <CommandSet xml:lang="es-ES"> <CommandPrefix>Voz</CommandPrefix> <Example> página uno </Example> <Command Name="Numero"> <Example> número uno </Example> <ListenFor> número {numero} </ListenFor> <ListenFor> numero {numero} </ListenFor> <Feedback> Enviando número {numero}... </Feedback> <Navigate Target="MainPage.xaml?numero={numero}"/> </Command> <PhraseList Label="numero"> <Item> uno </Item> <Item> dos </Item> </PhraseList> </CommandSet> <CommandSet xml:lang="es-MX"> <CommandPrefix>Voz</CommandPrefix> <Example> número uno </Example> <Command Name="Numero"> <Example> número uno </Example> <ListenFor> número {numero} </ListenFor> <ListenFor> numero {numero} </ListenFor> <Feedback> Enviando número {numero}... </Feedback> <Navigate Target="MainPage.xaml?numero={numero}"/> </Command> <PhraseList Label="numero"> <Item> uno </Item> <Item> dos </Item> </PhraseList> </CommandSet> </VoiceCommands>
Ahora tenemos que hacer que la app le “enseñe” al sistema de sus nuevos comandos de voz. Editemos el archivo App.xaml.cs, y vamos a añadir el siguiente trozo de código:
async public static void instalarComandosVoz() { // poner acá todos los idiomas soportados if (TieneComandos("es-MX") == true || TieneComandos("es-ES") == true) return; else { System.Diagnostics.Debug.WriteLine("instalando voice commands"); try { await VoiceCommandService.InstallCommandSetsFromFileAsync( new Uri("ms-appx:///VoiceCommandDefinition1.xml")); } catch { System.Diagnostics.Debug.WriteLine("excepcion instalando comandos de voz!"); } } } public static bool TieneComandos(string lang) { VoiceCommandSet s = null; if (VoiceCommandService.InstalledCommandSets == null) { System.Diagnostics.Debug.WriteLine("NO TIENE comandos voz instalados para " + lang); return false; } if (VoiceCommandService.InstalledCommandSets.ContainsKey(lang) == true) { s = VoiceCommandService.InstalledCommandSets[lang]; if (s != null) { System.Diagnostics.Debug.WriteLine("comandos voz instalados para " + lang + ":"); System.Diagnostics.Debug.WriteLine("lang: " + s.Language); System.Diagnostics.Debug.WriteLine("name: " + s.Name); return true; } } return false; }
Al final del constructor de la clase App (en el mismo archivo), añadimos la llamada a nuestro nuevo método de inicialización de speech:
Todo muy bonito, pero no estamos haciendo nada con los comandos. Vamos a añadir un elemento de texto a la página MainPage.xaml, y le ponemos “Texto” como name:
Copiamos este texto en MainPage.xaml.cs, para setear el valor de ese texto al recibir un comando:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedTo(e); if (e.NavigationMode == System.Windows.Navigation.NavigationMode.New) { if (NavigationContext.QueryString.ContainsKey("numero")) { string numero = NavigationContext.QueryString["numero"]; Texto.Text = "Numero " + numero; } } }
Finalmente, todo esto no va a funcionar mientras la app no tenga permisos para usar comandos de voz. Lo declaramos en el WMAppManifest.xml:
Ahora compilen y hagan deploy a su teléfono. Es importante que tengan los comandos de voz instalados para el idioma que están probando.
Ejecuten al menos una vez la app. Luego mantengan presionado el botón de Windows, y digan “voz numero uno”. Este es el resultado:
Ven qué fácil es? Pueden descargar el código fuente de este proyecto desde CodePlex, en esta dirección: https://birdiespeechsample.codeplex.com/