Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone

En esta entrada vamos a aprovecharnos de la API de Bing Translator para explicar como reproducir sonidos en nuestro Windows Phone, para ello recuperamos el código del post Windows Phone–Tutorial XIII – Usando datos en Windows Phone 7–Web Services donde teníamos un traductor utilizando la API de Bings, en este ejemplo lo que vamos a hacer es utilizar bings para que el texto traducido lo “diga” el teléfono.

Lo primero que tenemos que hacer es invocar al método de la API de Bings SpeakAsync que nos devuelve una uri con el sonido del texto que enviemos, tan sencillo como

1 void proxy_TranslateCompleted(object sender, TranslateCompletedEventArgs e) 2 { 3 LanguageTo = e.Result; 4 LanguageServiceClient proxy = new LanguageServiceClient(); 5 proxy.SpeakCompleted += new System.EventHandler<SpeakCompletedEventArgs>(proxy_SpeakCompleted); 6 proxy.SpeakAsync(APPID, LanguageTo, LanguageToSelected.Code, "audio/wav"); 7 8 }

Como podeis ver en el código a la API solo hay que enviarle el ID de Bing el texto, el código del lenguaje y el formato del audio

En el evento proxy_SpeakCompleted reproduciremos el archivo con el sonido del texto, para ello debemos utilizar el método SoundEffect.FromStream, la clase SoundEffect se encuentra en XNA concretamente en el assembly Microsoft.Xna.Framework añadiendo esta referencia con solo el siguiente código reproduciríamos el archivo.

1 void proxy_SpeakCompleted(object sender, SpeakCompletedEventArgs e) 2 { 3 var client = new WebClient(); 4 client.OpenReadCompleted += ((s, args) => 5 { 6 SoundEffect se = SoundEffect.FromStream(args.Result); 7 se.Play(); 8 }); 9 client.OpenReadAsync(new Uri(e.Result)); 10 }

 

Si ejecutamos la aplicación cuando demos al botón de traducir obtendremos el error

System.InvalidOperationException was unhandled

  Message=FrameworkDispatcher.Update has not been called. Regular FrameworkDispatcher.Update calls are necessary for fire and forget sound effects and framework events to function correctly. See
http://go.microsoft.com/fwlink/?LinkId=193853 for details.

  StackTrace:

       at Microsoft.Xna.Framework.FrameworkDispatcher.AddNewPendingCall(ManagedCallType callType, UInt32 arg)

       at Microsoft.Xna.Framework.UserAsyncDispatcher.HandleManagedCallback(ManagedCallType managedCallType, UInt32 managedCallArgs)

       at Microsoft.Xna.Framework.UserAsyncDispatcher.AsyncDispatcherThreadFunction()

Esto es debido a que estamos utilizando un elemento de XNA en aplicaciones Silverlight, para hacerlo funcionar en aplicaciones de Silverlight debemos de seguir estos pasos

Crear la clase XNAAsyncDispatcher con el siguiente código

1 public class XNAAsyncDispatcher : IApplicationService 2 { 3 private DispatcherTimer frameworkDispatcherTimer; 4 5 public XNAAsyncDispatcher(TimeSpan dispatchInterval) 6 { 7 this.frameworkDispatcherTimer = new DispatcherTimer(); 8 this.frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick); 9 this.frameworkDispatcherTimer.Interval = dispatchInterval; 10 } 11 12 void IApplicationService.StartService(ApplicationServiceContext context) 13 { 14 this.frameworkDispatcherTimer.Start(); 15 } 16 void IApplicationService.StopService() 17 { 18 this.frameworkDispatcherTimer.Stop(); 19 } 20 void frameworkDispatcherTimer_Tick(object sender, EventArgs e) 21 { 22 FrameworkDispatcher.Update(); 23 } 24 }

Y por ultimo en el archivo App.xaml.cs en el constructor añadir la línea

1 this.ApplicationLifetimeObjects.Add(new XNAAsyncDispatcher(TimeSpan.FromMilliseconds(50)));

Ahora si funcionara y oiremos la traducción

 

image

 

Un comentario en “Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone”

Deja un comentario

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