This article has been localized into Spanish by the community.
Síntesis de voz (haciendo hablar a WPF)
En el ensamblado System.Speech, Microsoft ha agregado algo realmente fantástico: la síntesis de voz, la capacidad de transformar el texto en palabras habladas, y reconocimiento de voz, capacidad para traducir palabras habladas en texto. Nos centraremos en la síntesis de voz en este artículo y en el siguiente entraremos en el reconocimiento de voz.
Para transformar el texto en palabras habladas, usaremos la clase SpeechSynthesizer. Esta clase reside en el ensamblado System.Speech, que tendremos que agregar para usarlo en nuestra aplicación. Dependiendo de la versión de Visual Studio que uses, el proceso será algo parecido a esto:
Con el ensamblaje correspondiente añadido, podemos usar ahora la clase SpeechSynthesizer del namespace System.Speech.Synthesis. Con eso en su lugar, comenzaremos con otro muy simple ejemplo "Hello, world!" , esta vez en palabras habladas:
<Window x:Class="WpfTutorialSamples.Audio_and_Video.SpeechSynthesisSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SpeechSynthesisSample" Height="150" Width="150">
<Grid>
<Button Name="btnSayIt" Click="btnSayHello_Click" VerticalAlignment="Center" HorizontalAlignment="Center">Say hello!</Button>
</Grid>
</Window>
using System;
using System.Speech.Synthesis;
using System.Windows;
namespace WpfTutorialSamples.Audio_and_Video
{
public partial class SpeechSynthesisSample : Window
{
public SpeechSynthesisSample()
{
InitializeComponent();
}
private void btnSayHello_Click(object sender, RoutedEventArgs e)
{
SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
speechSynthesizer.Speak("Hello, world!");
}
}
}
Esto es bastante simple, tanto como parece, y como la captura de pantalla realmente no ayuda mucho en la demostración de la síntesis de voz, le sugiero que intente crear el ejemplo usted mismo para experimentarlo.
Controlando la pronunciación
El SpeechSynthesizer puede hacer más que eso. Mediante el uso de la clase PromptBuilder, podemos obtener mucho más control de cómo se pronuncia una frase. El siguiente ejemplo, el cuál es una extensión del primer ejemplo, demostrará eso:
<Window x:Class="WpfTutorialSamples.Audio_and_Video.SpeechSynthesisPromptBuilderSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SpeechSynthesisPromptBuilderSample" Height="150" Width="150">
<Grid>
<Button Name="btnSayIt" Click="btnSayHello_Click" VerticalAlignment="Center" HorizontalAlignment="Center">Say hello!</Button>
</Grid>
</Window>
using System;
using System.Speech.Synthesis;
using System.Windows;
namespace WpfTutorialSamples.Audio_and_Video
{
public partial class SpeechSynthesisPromptBuilderSample : Window
{
public SpeechSynthesisPromptBuilderSample()
{
InitializeComponent();
}
private void btnSayHello_Click(object sender, RoutedEventArgs e)
{
PromptBuilder promptBuilder = new PromptBuilder();
promptBuilder.AppendText("Hello world");
PromptStyle promptStyle = new PromptStyle();
promptStyle.Volume = PromptVolume.Soft;
promptStyle.Rate = PromptRate.Slow;
promptBuilder.StartStyle(promptStyle);
promptBuilder.AppendText("and hello to the universe too.");
promptBuilder.EndStyle();
promptBuilder.AppendText("On this day, ");
promptBuilder.AppendTextWithHint(DateTime.Now.ToShortDateString(), SayAs.Date);
promptBuilder.AppendText(", we're gathered here to learn");
promptBuilder.AppendText("all", PromptEmphasis.Strong);
promptBuilder.AppendText("about");
promptBuilder.AppendTextWithHint("WPF", SayAs.SpellOut);
SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
speechSynthesizer.Speak(promptBuilder);
}
}
}
Aquí es donde viene lo interesante. Prueba a ejecutar el ejemplo y verás como funciona. Al proveer al SpeechSynthesizer con algo más que una simple cadena de texto, podemos obtener mucho control de cómo se pronuncian las diferentes partes de las frases. En este caso, la aplicación dirá lo siguiente:
Hola mundo y hola al universo también. En este día, <día actual>, Nosotros estamos reunidos aquí para aprender todo sobre WPF.
Ahora, intenta enviar esto directamente al SpeechSynthesizer y probablemente te reirás un poco del resultado. En cambio, lo que podemos hacer es guiar el método Speak() sobre cómo se deben usar las distintas partes de la oración. En primer lugar, preguntamos a WPF que diga más bajo la parte "and hello to the universe too" y más lenta, como si fuera susurrada.
La siguiente parte que no solo usa la pronunciación por defecto es la fecha. Utilizamos la enumeración especial SayAs para especificar que la fecha debe leerse como una fecha real y no como un conjunto de números, espacios y caracteres especiales.
También pedimos que la palabra "all" se pronuncio con mayor énfasis, para hacer la sentencia más dinámica, y al final, pedimos que la palabra "WPF" sea deletreada (W-P-F) en lugar de pronunciada como una palabra real.
En definitiva, ¡Esto nos permite hacer que el SpeechSynthesizer sea muchísimo más facil de entender!
Resumen
Hacer que su aplicación WPF hable es muy fácil, y al usar la clase PromptBuilder, puedes incluso tener mucho más control sobre cómo se pronuncian sus palabras. Esta es una característica muy poderosa, pero podría no ser relevante para muchas de las aplicaciones actuales. Aún así , ¡es genial!