C#SAPI可以说SSML字符串吗?

时间:2012-06-26 20:53:45

标签: c# speech sapi text-to-speech ssml

我在C#WPF项目中实现了一个TTS。

以前,我使用System.Speech.Synthesis命名空间中的TTS来说话。口语内容采用SSML格式(语音合成器标记语言,支持自定义语速,语音,强调)如下:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="en-US"><prosody rate="x-fast">hello world. This is a long sentence speaking very fast!</prosody></speak>

但遗憾的是System.Speech.Synthesis TTS存在内存泄漏问题,正如我在问题Memory leak in .Net Speech.Synthesizer?中提到的那样。

所以我决定使用SAPI COM组件。我可以轻松地让SAPI说纯文本内容。但后来我继续尝试让它说出SSML字符串,我失败了。代码如下:

//Initialize TTS instance

SpeechLib.SpVoiceClass tts = new SpeechLib.SpVoiceClass();

//Generate SSML string

string textToSpeak = "hello world speak Extra Fast.";
PromptBuilder pb = new PromptBuilder();
pb.StartStyle(new PromptStyle(PromptRate.ExtraFast));
pb.AppendText(textToSpeak);
pb.EndStyle();

ssmlString = pb.ToXml();    //ssmlString = @"<speak version=""1.0"" .... 

//Speak!

tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);

代码的基本部分是

tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);

使用SpeechVoiceSpeakFlags enumerations指定TTS发言行为。我尝试了几种标志组合,但没有一种能成功说出SSML内容。

特别是,上述代码也会引发以下例外情况:

  

System.Runtime.InteropServices.COMException未处理
  消息=“HRESULT异常:0x80045003”
  Source =“Interop.SpeechLib”ErrorCode = -2147201021 StackTrace:          在SpeechLib.SpVoiceClass.Speak(String Text,SpeechVoiceSpeakFlags Flags)          在D:\ Proj \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs中的SpeechSynthesisMemLeakTest.Program.Test2():行   60          在D:\ Proj \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs中的SpeechSynthesisMemLeakTest.Program.Main(String [] args):行   17          在System.AppDomain._nExecuteAssembly(Assembly assembly,String [] args)          在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()          在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)          在System.Threading.ThreadHelper.ThreadStart()InnerException:

有谁能告诉我如何正确使用该标志来说出SSML内容?

2 个答案:

答案 0 :(得分:2)

您使用的TTS引擎/语音是什么? Microsoft TTS引擎肯定支持使用您正在使用的代码的SSML;但是,其他声音/引擎可能不支持SSML。

错误0x80045003是SPERR_UNSUPPORTED_FORMAT(调用者指定了不支持的格式),这使我相信您需要使用不同的TTS引擎(支持SSML)。

答案 1 :(得分:0)

使用此标志代替

tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFIsXML);

使用

进行测试
  
      
  • SpeechLib 5.4
  •   
  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5 \ System.Speech.dll
  •