Geschwindigkeit bei
-
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>"; }