[Tips and Tricks] Windows Phone. Detener la sintetización de voz

Introducción

Una de las novedades más interesantes del SDK de Windows Phone 8 son las Speech APIs (Text to Speech, Speech to Text, Comandos de voz, etc.). Nos centrarnos en TTS (Text To Speech) o lo que es lo mismo sintetizar un sonido a partir de un texto escrito.

El problema

Ya en un artículo anterior
vimos como utilizar esta API. Sin embargo, ene se artículo no veíamos
un detalle muy importante. Una vez iniciada la slintetización de un
texto, ¿cómo lo paramos?. A esa sencilla pregunta responderemos en este
Tips and Tricks.

La solución

Vamos a crear una aplicación de ejemplo:

Aplicación de Windows Phone


Lo primero que debemos hacer antes de continuar es aádir la capacidad de Reconocimiento de voz (ID_CAP_SPEECH_RECOGNITION).
Para ello dentro de carpeta Properties encontramos el archivos
WMAppManifiest.xml. Lo abrimos y nos dirigimos a la pestaña Capacidades:

ID_CAP_SPEECH_RECOGNITION

Creamos
la interfaz. Añadiremos la interfaz más simple posible para nuestro
objetivo, un par de botones. Uno para comenzar a sintetizar texto en voz
y el segundo para detenerlo:

<StackPanel>
<Button Content="Leer" Click="Leer_Click"/>
<Button Content="Parar de leer" Click="Parar_Click"/>
</StackPanel>

 

 

Añadimos los eventos en el code-behind:

private void Leer_Click(object sender, RoutedEventArgs e)
{
 
}
 
private void Parar_Click(object sender, RoutedEventArgs e)
{
 
}
Nos centramos en la lógica del primer botón. Para cancelar la síntesis
de voz tenemos que asignar el valor devuelto por el método SpeakTextAsync del objeto SpeechSynthesizer a una variable de tipo IAsyncAction
para posteriormente llamar al método Cancel del IAsyncAction para
cancelar la síntesis de voz. Para ello, creamos una variable global de
tipo IAsyncAction:
private IAsyncAction _task;
Y en la lógica del clic del botón:
var synth = new SpeechSynthesizer();
 
var voices = InstalledVoices.All.Where(v => v.Language == "es-ES").OrderByDescending(v => v.Gender);
 
synth.SetVoice(voices.FirstOrDefault(v => v.Gender == VoiceGender.Male));
 
_task = synth.SpeakTextAsync("Esto es una prueba. Realmente dura mucho más de lo necesario. Si quieres puedes parar pulsando el botón Parar Voz");

Instanciamos un objeto de tipo SpeechSynthesizer. Con LINQ seleccionamos el conjunto de sintetizadores españoles de la clase InstalledVoices. Seleccionamos el genéro masculino por ejemplo. Establecemos el sintetizador elegido utilizando el método SetVoice. Por último, llamamos al método SpeakTextAsync que recibirá como parámetro el texto a sintetizar en voz.

En el clic del segundo botón:

_task.Cancel();

Fácil, ¿verdad?

Podéis descargar el ejemplo desde el siguiente enlace:

Más información

Deja un comentario

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