JXI*_*ITC 5 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>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,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);
Run Code Online (Sandbox Code Playgroud)
代码的重要部分是
tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);
Run Code Online (Sandbox Code Playgroud)
它使用SpeechVoiceSpeakFlags 枚举来指定 TTS 说话行为。我尝试了几种标志组合,但没有一个成功说出 SSML 内容。
特别是,上面的代码还会引发以下异常:
System.Runtime.InteropServices.COMException 未处理
Message="Exception from HRESULT: 0x80045003"
Source="Interop.SpeechLib" ErrorCode=-2147201021 StackTrace: 在 SpeechLib.SpVoiceClass.Speak(String Text, SpeechVoiceSpeakFlags Flags) 在 SpeechSynthesisMemLeakTest.Program.Test2 () 在 D:\Proj\TestSolutions\CSharp_Quick_Apps\SpeechSynthesisMemLeakTest\Program.cs:第 60 行,在 D:\Proj\TestSolutions\CSharp_Quick_Apps\SpeechSynthesisMemLeakTest\Program.cs:第 17 行中的 SpeechSynthesisMemLeakTest.Program.Main(String[] args)在System.AppDomain._nExecuteAssembly(Assembly程序集,String [] args)在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()在System.Threading.ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态)在System.Threading。 ThreadHelper.ThreadStart() 内部异常:
谁能告诉我如何正确使用该标志来说出 SSML 内容?
您使用什么 TTS 引擎/语音?Microsoft TTS 引擎绝对支持使用您正在使用的代码的 SSML;但是,其他语音/引擎可能不支持 SSML。
错误 0x80045003 是 SPERR_UNSUPPORTED_FORMAT (调用者指定了不支持的格式),这使我相信您需要使用不同的 TTS 引擎(支持 SSML)。
| 归档时间: |
|
| 查看次数: |
2763 次 |
| 最近记录: |