E
Ich bin von System.Speech (alte Voices), bei denen man die Geschwindigkeit von -10 bis +10 einstellen konnte, auf die erweiterten/neueren Windows-Runtime-Voices (kostenlos in den Sprachpaketen bei Windows 10/11 enthalten) umgestiegen. Allerdings ist die Geschwindigkeitseinstellung hier sehr grob. Man kann in meinem Programm fast nur den Wert "0" für "Rate" nutzen, mit Einschränkungen "-1". Microsoft hat hier angeblich ein abgespecktes SSML umgesetzt. SSML benötige ich, um die Zeichensetzung in natürlich wirkende Pausen zu verwandeln. Kann ich diese Beschränkung überwinden/umgehen, ohne auf Azure Cognitive Services TTS (Nachteil: Cloud, API-Key, Kosten) umzusteigen?
private string ConvertToSsml(string text, string cultureCode, VoiceInformation? voice, int rate)
{
// Text sicher machen + leichte Prosodie (optional)
string ssmlSafe = EscapeForSsml(text);
// Leichte Pausen bei typischen Satzzeichen (aber KEIN Eingriff bei „¿“)
ssmlSafe = ssmlSafe.Replace(",", "<break time='50ms'/>")
.Replace(";", "<break time='50ms'/>")
.Replace(":", "<break time='50ms'/>")
.Replace(".", "<break time='50ms'/>")
.Replace("!", "<break time='50ms'/>")
.Replace("¡", "¡<break time='20ms'/>");
// ❌ kein Replace für '¿'
string trimmed = text.Trim();
if (trimmed.EndsWith("?"))
{
ssmlSafe = $"<prosody pitch='+15%'>{ssmlSafe}</prosody>";
}
else if (trimmed.EndsWith("!"))
{
ssmlSafe = $"<prosody volume='loud'>{ssmlSafe}</prosody>";
}
// Stimme explizit festlegen
string voiceName = voice?.DisplayName ?? "";
string voiceLang = voice?.Language ?? cultureCode;
string ssmlRate = rate switch
{
<= -2 => "x-slow",
-1 => "slow",
0 => "medium",
1 => "fast",
>= 2 => "x-fast",
};
return $@"
<speak version='1.0' xml:lang='{cultureCode}'>
<voice name='{EscapeForSsml(voiceName)}' xml:lang='{voiceLang}'>
<prosody rate='{ssmlRate}'>{ssmlSafe}</prosody>
</voice>
</speak>";
}