持续时间 属性 的 SpeechSynthesizer?

SpeechSynthesizer with a duration property?

我需要一个带有可设置持续时间 属性 的语音合成器来指定朗读文本需要多长时间。 System.Speech.Synthesis.SpeechSynthesizer class 只有一个比率 属性.

有一个 System.Speech.Synthesis.TtsEngine 名称空间,其韵律 class 可设置 Duration 属性。但我找不到任何有关如何使用 TtsEngine 或此 属性 如何应用于 SpeechSynthesizer class 的示例(如果可能的话)。或者是否有其他我应该研究的语音合成库?

我想我明白了,多亏了对此 question 的第一个回复的提示。

    using System.Speech.Synthesis;
    
    SpeechSynthesizer synthesizer = new SpeechSynthesizer();

    void speak_utterance(string utterance_text, int duration_millisec = 0) {

        if (duration_millisec <= 0) {
            synthesizer.Speak(utterance_text);
        }
        else {
            PromptBuilder builder = new PromptBuilder();
            builder.AppendSsmlMarkup("<prosody duration='" + duration_millisec.ToString() + "ms'>" + utterance_text + "</prosody>");
            synthesizer.Speak(builder);
        }
    }

我注意到持续时间和合成器说出数字时出现了一些意想不到的交互。例如:

    string clearance0 = "american one twenty three cleared to land runway one left"
    string clearance1= "american 123 cleared to land runway one left"

    speak_utterance(clearance0, 10000);
    speak_utterance(clearance1, 10000);

第一次通话时,整个语音都比较慢,拖了 10 多秒。

对于第二次通话,“美国 123”与第一次通话一样缓慢且拉长,但话语的后半部分以正常速度说出,总持续时间小于预期。所以我必须将数字转换为文字以获得一致的性能。 (或者可能有一个 属性 影响合成器处理数字的方式,可以纠正这个问题。如果我发现任何东西,将会更新。)