2011-02-12 20 views
11

我試圖通過SSML和.NET SpeechSynthesizer(System.Speech.Synthesis)SpeechSynthesizer .NET控件間距

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

的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> 

率是公認的:「8兩本書」是speaken比其他人要慢得多,但不管是什麼值設置爲「間距」,它沒有什麼區別!允許值可以在這裏找到:

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

我缺少的東西或更改的只是不被微軟語音引擎支持的間距?

弗裏茨

回答

2

雖然發動機SsmlParser通過System.Speech用於接受在ProcessProsody方法的pitch屬性,它不會處理它。

它只處理range,rate,volumeduration屬性。它還解析contour但被處理爲range(不知道爲什麼)...

編輯:如果你不真正需要閱讀從SSML XML文件中的文本,您可以編程方式創建的文本。
而不是

builder.AppendSsml(@"C:\Users\me\Documents\ssml1.xml"); 

使用

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(); 
+0

我不知道是否有任何其他的語音引擎API,可以使用.NET使用以及處理瀝青的命令? – fritz

+0

@fritz:沒有太多的.NET API。雖然有很多本地API,但其中許多並不是「免費」的。我用** ** eSpeak時(不是.NET)成功 - 不是從'System.Speech'更好的輸出,但沒讀好SSML。 –

+0

有沒有一種方法可以用.NET語言或其他方法唱歌?我在尋找一個支持三種控制功能的API:1)語音2)準確的穩定音調3)持續時間控制。有這樣的事嗎?我顯然更喜歡音樂驅動的API。 – Shimmy