2009-02-12 38 views
10

這兩種方法在C#中使用語音API或SAPI有什麼區別?SpVoice和SpeechSynthesizer之間的區別

using SpeechLib; 
SpVoice speech = new SpVoice(); 
speech.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync); 

返回Apacela voices

SpeechSynthesizer ss = new SpeechSynthesizer(); 
ss.SpeakAsync ("Hello, world"); 

不能與Apacela voices工作。

第一個返回所有的聲音,但第二個只返回幾個聲音。這與SAPI 5.1和SAPI 5.3有關嗎?

Vista和XP上的行爲是相同的,兩個SpVoice都能夠檢測到Apacela聲音,但使用SpeechSynthesizer,在XP和Vista上均未檢測到聲音。

我猜XP使用SAPI 5.1,而Vista使用SAPI 5.3,那麼爲什麼所有操作系統上的行爲都一樣,但是與API的行爲不同呢?

另外哪個API更強大,兩種方式/ API有什麼區別?

+0

2017總結在這裏:https://www.webbie.org.uk/blog/microsoft-speech/ – 2017-11-19 07:14:36

回答

3

SpeechLib是一個interop DLL,因此映射到它創建的任何版本的SpeechLib(您可以檢查它的屬性)。

System.Speech。*是.NET框架中的「官方」語音支持。 SpeechSynthesizer選擇在運行時使用哪個語音庫(很像System.Web.Mail類)。

我不知道爲什麼他們返回不同數量的聲音,但它很可能是與正在使用的SAPI版本。

+0

編輯更多描述的問題,我希望你想分享更多的信息,因爲問題是無關的運行時,但API差異。 – 2009-02-12 09:46:11

+0

我的猜測是Apacela語音不支持SAPI 5.3中的新API,因此System.Speech(在Vista上使用5.3)無法訪問它。顯然5。3代表微軟將支持未來,但如果你需要這種聲音,也許你應該使用SpeechLib。 – 2009-02-12 10:00:12

6

SpeechLib是一個Interop DLL,它使用經典的基於COM的SAPI。 System.Speech由Microsoft開發,用於直接從託管代碼中與文本到語音(和語音識別)進行交互。

在一般情況下,它的清潔劑堅持與託管庫(System.Speech)當你寫一個託管應用程序。

這肯定不相關的SAPI版本 - 在這裏最有可能的問題是,一個聲音供應商(在這種情況下Acapela)已明確實施某些System.Speech功能的支持。 Acapela的聲音有可能支持你所需要的一切,但也有可能他們不支持。你最好的選擇是ask the Acapela Group directly

聲音在HKLM \ SOFTWARE \ Microsoft \ Speech \ Tokens中註冊,您應該看到Windows內置聲音以及您在其中列出的Acapela聲音。如果你發現他們是如何註冊的任何明顯的差異,你可能能夠使Acapela通過使他們的註冊匹配的是,例如,MS-安娜配音工作。

但我要說最有可能的可能性是,Acapela聲音沒有被更新,以支持所有System.Speech所需的接口。