This article is currently in the process of being translated into French (~99% done).
Speech synthesis (making WPF talk)
Dans l'assemblage System.Speech, Microsoft a ajouté quelque chose de vraiment cool: la synthèse vocale, la possibilité de transformer du texte en mots parlés, et la Reconnaissance Vocale, la capacité de traduire les mots prononcés en texte. Nous allons nous concentrer sur la synthèse vocale dans cet article, puis nous irons dans la reconnaissance vocale dans le suivant.
Pour transformer du texte en mots parlés, nous utiliserons la classe SpeechSynthesizer . Cette classe réside dans l'assembly System.Speech, que nous devrons ajouter pour l'utiliser dans notre application. Selon la version de Visual Studio que vous utilisez, le processus ressemble à ceci:
Avec l'assembly approprié ajouté, nous pouvons maintenant utiliser la classe SpeechSynthesizer depuis le namespace System.Speech.Synthesis. Avec ceci mis en place, nous allons renseigner un exemple très simple "Bonjour, monde!", cette fois en paroles:
<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!");
}
}
}
C'est à peu près aussi simple que possible, mais comme la capture d'écran n'aide vraiment pas beaucoup à démontrer la synthèse vocale, je vous suggère d'essayer à construire l'exemple vous-même, pour en faire l'expérience.
Contrôle de la prononciation
Le SpeechSynthesizer peut faire plus que cela. Grâce à l'utilisation de la classe PromptBuilder, nous pouvons obtenir beaucoup plus de contrôle sur la façon dont une phrase est parlée. Ce prochain exemple, qui est une extension du premier exemple, illustrera ceci:
<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);
}
}
}
C'est là que ça devient intéressant. Essayez d'exécuter l'exemple et voyez à quel point cela fonctionne. En fournissant au SpeechSynthesizer quelque chose de plus qu'une simple chaîne de texte, nous pouvons obtenir beaucoup de contrôle sur la façon dont les différentes parties de la phrase sont exprimées. Dans ce cas, l'application dira ce qui suit:
Hello world and hello to the universe too. On this day, <date du jour>, we're gathered here to learn all about WPF.
Essayez maintenant d'envoyer cela directement au SpeechSynthesizer et vous rirez très probablement du résultat. Ce que nous faisons à la place, c'est guider la méthode Speak() dans comment doivent être utilisées les différentes parties de la phrase. Tout d'abord, nous demandons à WPF de parler du "et bonjour à l'univers aussi" - partie dans un volume inférieur et une vitesse plus lente, comme s'il était chuchoté.
La partie suivante qui n'utilise pas seulement la prononciation par défaut est la date. Nous utilisons l'énumération spéciale SayAs pour spécifier que la date doit être lue comme une date réelle et non comme un ensemble de chiffres, d'espaces et de caractères spéciaux.
Nous demandons également que le mot "tous" soit prononcé avec une plus grande exagération, pour rendre la phrase plus dynamique, et à la fin, nous demandons à ce que le mot "WPF" soit épelé (W-P-F) au lieu d'être prononcé comme un mot réel.
Dans l'ensemble, cela nous permet de rendre le SpeechSynthesizer beaucoup plus facile à comprendre!
Résumé
Faire parler votre application WPF est très facile, et en utilisant la classe PromptBuilder, vous pouvez aussi avoir beaucoup de contrôle sur la façon dont vos mots sont prononcés. Ceci est une fonctionnalité très puissante, mais elle peut ne pas être pertinente pour de nombreuses applications actuelles. C'est quand même très cool!