SpeechSynthesizer .NET控制音高

fri*_*itz 11 c# text-to-speech

我试图通过SSML和.NET SpeechSynthesizer(System.Speech.Synthesis)改变语音文本的音高

SpeechSynthesizer synthesizer = new SpeechSynthesizer();
PromptBuilder builder = new PromptBuilder();
builder.AppendSsml(@"C:\Users\me\Documents\ssml1.xml");
synthesizer.Speak(builder);
Run Code Online (Sandbox Code Playgroud)

ssml1.xml文件的内容是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<ssml:speak version="1.0"
xmlns:ssml="http://www.w3.org/2001/10/synthesis"
xml:lang="en-US">
<ssml:sentence>
Your order for <ssml:prosody pitch="+30%" rate="-90%" >8 books</ssml:prosody>
will be shipped tomorrow.
</ssml:sentence>
</ssml:speak>
Run Code Online (Sandbox Code Playgroud)

价格被认可:"8本书"比其他人说得慢得多,但无论"音调"的价值是多少,都没有区别!允许的值可以在这里找到:

http://www.w3.org/TR/speech-synthesis/#S3.2.4

我错过了什么或正在改变微软语音引擎不支持的音调?

弗里茨

Jar*_*dek 2

SsmlParser虽然所使用的引擎System.Speech接受方法pitch中的属性ProcessProsody,但它不会对其进行处理。

它仅处理rangerate和属性。它也解析但被处理为(不知道为什么)......volumedurationcontourrange

编辑:如果您确实不需要从 SSML xml 文件读取文本,则可以以编程方式创建文本。
代替

builder.AppendSsml(@"C:\Users\me\Documents\ssml1.xml");
Run Code Online (Sandbox Code Playgroud)

使用

builder.Culture = CultureInfo.CreateSpecificCulture("en-US");
builder.StartVoice(builder.Culture);
builder.StartSentence();

builder.AppendText("Your order for ");

builder.StartStyle(new PromptStyle() { Emphasis = PromptEmphasis.Strong, Rate = PromptRate.ExtraSlow });
builder.AppendText("8 books");
builder.EndStyle();

builder.AppendText(" will be shipped tomorrow.");

builder.EndSentence();
builder.EndVoice();
Run Code Online (Sandbox Code Playgroud)