SpVoice和SpeechSynthesizer有什么区别

使用语音API或SAPI在C#中这两种方法有什么区别?

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

返回Apacela的声音 ,和

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

不适用于Apacela的声音 。

第一个声音返回所有声音但第二个声音只返回少量声音。 这是与SAPI 5.1和SAPI 5.3相关的吗?

在Vista和XP上的行为是相同的,在SpVoice能够检测到Apacela语音但是使用SpeechSynthesizer时,在XP和Vista上都没有检测到声音。

我猜XP使用SAPI 5.1,而Vista使用SAPI 5.3然后为什么在所有操作系统上都有相同的行为,但是与API的行为不同?

另外哪个API更强大,两种方式/ API之间有什么区别?

SpeechLib是一个Interop DLL,它使用了经典的基于COM的SAPI。 System.Speech由Microsoft开发,可直接从托管代码中与文本到语音(和语音识别)进行交互。

通常,在编写托管应用程序时,坚持使用托管库(System.Speech)会更清晰。

它绝对与SAPI版本无关 – 这里最可能的问题是语音供应商(在这种情况下是Acapela)必须明确地实现对某些System.Speechfunction的支持。 Acapela可能会说你支持所需要的一切,但也有可能他们不支持。 您最好的选择是直接询问Acapela集团 。

声音在HKLM \ SOFTWARE \ Microsoft \ Speech \ Tokens中注册,您应该看到Windows内置声音,以及您在其中列出的Acapela声音。 如果你发现他们的注册方式有任何明显的差异,你可以通过使他们的注册与例如MS-Anna的注册相匹配来使Acapela的声音有效。

但我要说的最可能的是,Acapela语音尚未更新,无法支持System.Speech所需的所有接口。

SpeechLib是一个互操作DLL,因此映射到它为其创建的任何版本的SpeechLib(您可以检查它的属性)。

System.Speech。*是.NET框架中语音的“官方”支持。 SpeechSynthesizer选择在运行时使用哪个语音库(很像System.Web.Mail类所做的那样)。

我不确定为什么他们会返回不同数量的声音,但它可能与正在使用的SAPI版本有关。