Windows Phone– Tutorial XVIII–Utilizando el Micrófono

En este post vamos a ver como utilizar el micrófono que viene en todos los teléfonos de Windows Phone, lo vamos a ver desde la perspectiva de un proyecto Silverlight ya que en XNA es distinto, para empezar debemos de añadir a nuestro proyecto el assembly Microsoft.Xna.Framework y recordar tal y como vimos en el post Windows Phone–Tutorial XVI–Hacer hablar a tu Windows Phone añadir la clase XNADispatcher , el assembly Microsoft.Xna.Framework y en el App.xaml activarlo

1 <Application.ApplicationLifetimeObjects> 2 <local:XNADispatcher DispatchIntervalInMilliseconds="50"/> 3 <!--Required object that handles lifetime events for the application--> 4 <shell:PhoneApplicationService 5 Launching="Application_Launching" Closing="Application_Closing" 6 Activated="Application_Activated" Deactivated="Application_Deactivated"/> 7 </Application.ApplicationLifetimeObjects>

 

El porque y contenido de la clase ya fue explicado en el post anterior así que vamos a pasar directamente a como podemos utilizar el micrófono dentro de nuestro windows phone, para su utilización se nos provee de la clase  Microphone ubicada en el assembly Microsoft.Xna.Framework con el método Start empezar a escuchar y Stop para parar de escuchar, cuando activamos el micrófono la señal nos llega a través del evento  BufferReady  que tenemos que estar escuchando y cuando termine transforma esta señal a un archivo reproducible por ejemplo de tipo wav.

Para ver como lo realizamos vamos a mostrar una aplicación con tres botones de start, stop y play, no los voy a esconder, ni mostrar mensajes de que botón esta en ese momento, el objetivo de este programa es ver como recogemos la entrada del micrófono , la guardamos en nuestro teléfono como un archivo de tipo wav y la reproducimos, a partir de ahí vuestra imaginación para ampliarla y mejorarla . Tampoco voy a utilizar el template de MVVM sino que voy a codificar directamente en la página.

Lo primero que tenemos que hacer es definir las variables que vamos a utilizar, es decir el micrófono, su buffer y donde lo vamos a almacenar.

1 Microphone microphone = Microphone.Default; 2 byte[] microphoneBuffer; 3 MemoryStream audioStream; 4 byte[] recording;

 

Una vez que lo tenemos codificamos el botón Start, en el lo que haremos será activar el micrófono, definir el evento de recogida de la señal y el tamaño del buffer de esta señal, es decir, cada cuanto almacenamos en el buffer.

1 private void StartButton_Click(object sender, RoutedEventArgs e) 2 { 3 audioStream = new MemoryStream(); 4 microphone.BufferDuration = TimeSpan.FromMilliseconds(1000); 5 microphoneBuffer = 6 new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; 7 microphone.BufferReady += microphoneBuffer_BufferReady; 8 microphone.Start(); 9 }

En el evento BufferReady  vamos almacenando las sucesivas señales, en seste caso cada segundo, y como podéis ver en un MemoryStream

  

1 void microphoneBuffer_BufferReady(object sender, EventArgs e) 2 { 3 microphone.GetData(microphoneBuffer); 4 audioStream.Write(microphoneBuffer, 0, microphoneBuffer.Length); 5 } 6

Por ultimo en el botón Stop paramos la lectura del micrófono, transformamos a un fichero wav , lo grabamos en el teléfono y lo reproducimos

1 private void StopButton_Click(object sender, RoutedEventArgs e) 2 { 3 microphone.Stop(); 4 microphone.BufferReady -= microphoneBuffer_BufferReady; 5 audioStream.Flush(); 6 recording = audioStream.ToArray(); 7 audioStream.Dispose(); 8 9 using (var iss = new IsolatedStorageFileStream("recording.wav", 10 FileMode.OpenOrCreate, 11 IsolatedStorageFile.GetUserStoreForApplication())) 12 { 13 var bytesToWrite = SoundUtilities.ConvertRawSamplesToWav(recording, 14 new SoundUtilities.WaveFormat() 15 { 16 AverageBytesPerSecond = microphone.SampleRate * 2, 17 BlockAlign = 2, 18 Channels = 1, 19 Encoding = 1, 20 SamplesPerSecond = microphone.SampleRate 21 }); 22 iss.Write(bytesToWrite, 0, bytesToWrite.Length); 23 } 24 25 } 26


Como podéis ver en el código de arriba utilizo una clase SoundUtilities que encontré por la red para transformar a ficheros wav, una vez transformados lo guardo en el teléfono el archivo.

Ya solo nos queda reproducir el archivo, para ello utilizamos la clase SoundEffect de XNA

1 private void PlayRecordingButton_Click(object sender, RoutedEventArgs e) 2 { 3 var effect = new SoundEffect(recording, microphone.SampleRate, 4 AudioChannels.Mono); 5 effect.Play(); 6 }

Habéis podido observar que es muy sencillo utilizar el micrófono, lo que no es posible y envidió de Android es que no podemos transformarlo a Texto, en cambio, la API de Android si lo implementa.

 

Os dejo el código como siempre

 

2 comentarios en “Windows Phone– Tutorial XVIII–Utilizando el Micrófono”

  1. Hola, si los auriculares están conectados al teléfono, ¿se puede elegir prográmaticamente entre la reproducción a través de los auriculares o a través del altavoz integrado?

    Saludos.

Deja un comentario

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