This article has been localized into German by the community.
Sprachsynthese (WPF sprechen lassen)
Im System.Speech Paket hat Microsoft etwas richtig cooles implementiert: Sprachsynthese, die Fähigkeit Test in gesprochenes Wort und Spracherkennung, die Möglichkeit geprochenes Wort in Text zu übersetzen. Wir werden uns hier in diesem Artikel auf die Sprachsynthese konzentrieren und im nächsten Artikel auf die Spracherkennung eingehen.
Um Text in gesprochenes Wort umzuwandeln nutzen wir die SpeechSynthesizer Klasse. Diese Klasse liegt in der Sammlung System.Speech, die wir in unsere Applikation einbinden müssen. Je nachdem welche Version von Visual Studio ihr benutzt sieht es etwa so aus:
Wenn die richtige Sammlung hinzugefügt wurde können wir nun die Klasse SpeechSynthesizer aus dem Namespace System.Speech.Synthesis benutzen. Damit werden wir wieder einmal mit einem einfachen "Hello, world!" Beispiel starten, nur dieses mal in gesprochenem Wort:
<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!");
}
}
}
Das ist wirklich sehr einfach, aber ein Screenshot hilft einem wirklich nicht weiter wenn man Sprachausgabe testen möchte, daher die Empfehlung das Beispiel einmal selbst nachzubauen um zu erleben wie es ist.
Aussprache steuern
Der SpeechSynthesizer kann jedoch noch viel mehr. Durch die Nutzung der PromptBuilder Klasse erlangen wir Kontrolle darüber, wie ein Satz ausgesprochen wird. Das nächste Beispiel, das eine Erweiterung zum letzen ist, wird uns dies näherbringen:
<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);
}
}
}
Das ist der Punkt, an dem es interessant wird. Versucht einmal das Beispiel bei euch laufen zu lassen und hört, wie gut es funktioniert. Wenn man dem SpeechSynthesizer etwas mehr als nur einen Text String gibt, erhalten wir eine wirklich gute Kontrolle darüber, wie ein Satz ausgesprochen wird. In diesem Fall sagt die Anwendung folgendes: (Der Text wurde absichtlich nicht übersetzt um zum Code-Beispiel zu passen)
Hello world and hello to the universe too. On this day, <today's date>, we're gathered here to learn all about WPF.
Versucht doch einmal den Satz direkt an den SpeechSynthesizer zu senden, es wird euch vermutlich ein Lächeln entlocken. Stattdessen führen wir die Speak() Methode durch die verschiedenen Satzteile und zeigen auf wie diese Auszusprechen sind. Als erstes sagen wir WPF das der "and hello to the universe too"-Teil in geringerer Lautstärke und langsamer ausgesprochen werden sollen, fast so als wäre es geflüstert.
Der nächste Teil, der nicht die Standard-Aussprache erhält ist die Aussprache des Datums. Wir nutzen das spezielle SayAs um festzulegen, dass das Datum auch als Datum ausgesprochen wird und nicht als eine Aneinanderreihung von Zahlen, Leerzeichen und Sonderzeichen.
Weiterhin sagen wir auch, dass das Wort "all" mit stärkerer Betonung ausgesprochen wird, um dem Satz mehr Dynamik zu verleihen. Um zum Schluss möchten wir, dass das Wort "WPF" als einzelne Buchstaben (W-P-F) ausgesprochen wird statt als ein richtiges Wort.
Alles in allem macht dies den SpeechSynthesizer verständlicher in der Aussprache.
Zusammenfassung
Eine WPF Applikation zum sprechen zu bringen ist recht einfach. Und durch die Nutzung der PromptBuilder Klasse kann man sogar Kontrolle darüber erlangen wie die Wörter ausgesprochen werden. Dies ist ein sehr mächtiges Feature, aber wahrscheinlich bei den meisten aktuellen Applikationen nicht allzu relevant. Aber trotzdem ist es super cool!