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

Anmelden zum Antworten