使用语音API或SAPI?
在C#中这两种方法有什么区别?using SpeechLib;
SpVoice speech = new SpVoice();
speech.Speak(text, SpeechVoiceSpeakFlags.SVSFlagsAsync);
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 :(得分: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语音。如果你发现他们的注册方式有任何明显的差异,你可能能够通过使他们的注册与MS-Anna的注册相匹配来使Acapela的声音有效。
但我想说最有可能的是,Acapela的声音尚未更新,无法支持System.Speech所需的所有接口。
答案 1 :(得分:3)
SpeechLib是一个互操作DLL,因此映射到它为其创建的任何版本的SpeechLib(您可以检查它的属性)。
System.Speech。*是.NET框架中语音的“官方”支持。 SpeechSynthesizer选择在运行时使用哪个语音库(很像System.Web.Mail类那样)。
我不确定为什么他们会返回不同数量的声音,但很可能与正在使用的SAPI版本有关。