Montag, 21. März 2011

Sprachausgabe mit C#

Die Überschrift hört sich wahrscheinlich ziemlich kompliziert an, allerdings ist in C# die Realisierung einer Sprachausgabe in nur 2 Zeilen möglich!
Denn die schon mit Windows mitgelieferte Sprachsynthese ist auch im .Net Framework nutzbar, die benötigte Komponente ist die Klasse System.Speech.Synthesis. Um sie nutzen zu können, muss sie zuerst eingebunden werden: Projekt - Verweis hinzufügen - (Reiter .Net) System.Speech.
Um den Code zu vereinfachen, binden wir den Namespace mittels using ein:

using System.Speech.Synthesis;

Zur Sprachausgabe benötigen wir eine Instanz der Klasse SpeechSynthesizer, welcher über die Funktion Speak() der auszugebende Text übergeben werden kann.
Natürlich gibt es aber noch viele weitere Eigenschaften, mit denen herumexperimentiert werden darf.
Ein paar in der Übersicht:
- Rate: Wertebereich von -10 bis 10, Geschwindigkeit der Textausgabe
- Volume: Wertebereich 0 - 100, Lautstärke
- Voice: Stimme
Die letzte Eigenschaft ist schreibtgeschützt, ihr kann direkt nichts zugewiesen werden, sie kann allerdings über Funktionen geändert werden.
Nützlich ist die Funktion SelectVoiceByHints(), über die "Hinweise" gegeben werden können, nach denen eine passende Stimme gesucht werden soll.
Solche Kriterien sind zum Beispiel Geschlecht, Alter und sogar Kulturkreis.
So sucht zum Beispiel folgende Anweisung nach einem Stimmtyp, welcher weiblich und erwachsen klingt und legt diese Stimme bei Erfolg als Ausgabestimme fest:

Speaker.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult);

Allerdings wird auf vielen Windows Rechnern nur eine Stimme vorinstalliert sein (bei mir z.B. nur "Microsoft Anna").
Dann hat eine Stimmsuche keinerlei Auswirkung.
Die installierten Stimmen kann man über die Funktion Speaker.GetInstalledVoices() auslesen.
Die einzelnen Stimmen liegen als Objekt vom Typ Voice vor, folgendes Beispiel liest alle Stimmen aus und fügt ihren Namen zu der Liste InstalledVoices hinzu:

List<string> InstalledVoices = new List<string>();
foreach (InstalledVoice voice in Speaker.GetInstalledVoices())
{
    InstalledVoices.Add(voice.VoiceInfo.Name);
}

Kommentare:

  1. "Um den Code zu vereinfachen, binden wir die Klasse mittels using ein"

    Du meinst wahrscheinlich den Namespace, oder?

    AntwortenLöschen
  2. Hi Postremus,

    danke, sehr aufmerksam, ist geändert.

    AntwortenLöschen