我在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>


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

因此,我决定使用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
  Message =“来自HRESULT的异常:0x80045003”
  Source =“ Interop.SpeechLib” ErrorCode = -2147201021 StackTrace:
         在SpeechLib.SpVoiceClass.Speak处(字符串文本,SpeechVoiceSpeakFlags标志)
         在D:\ Proj \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs:line中的SpeechSynthesisMemLeakTest.Program.Test2()
  60
         在D:\ Proj \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs:line中的SpeechSynthesisMemLeakTest.Program.Main(String [] args)中
  17
         在System.AppDomain._nExecuteAssembly(程序集程序集,String []参数)
         在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
         在System.Threading.ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态)
         在System.Threading.ThreadHelper.ThreadStart()处InnerException:


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

最佳答案

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

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

09-06 16:07