저는 C# WPF 프로젝트에서 TTS를 구현했습니다.C# SAPI SSML 문자열을 말할 수 있습니까?
이전에는 System.Speech.Synthesis 네임 스페이스의 TTS를 사용하여 말합니다.
<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는 I로, 메모리 누수 문제가 : 말하는 내용이 SSML 형식으로 다음과 같이 (음성 합성기 마크 업 언어는 음성이 강조 말하기 속도를 사용자 지원) 질문에 언급 된 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 말하기 동작을 지정하는 SpeechVoiceSpeakFlags enumerations를 사용
tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);
입니다. 여러 플래그 조합을 시도했지만 SSML 내용을 성공적으로 말한 사람은 없습니다.
특히, 또한 다음과 같은 예외를 발생합니다 위의 코드는 :
소스 = "Interop.SpeechLib"
함께 System.Runtime.InteropServices.COMException는
메시지 = "0x80045003 HRESULT에서 예외"처리되지 않은했다 ErrorCode가 = -2147201021 스택 트레이스 : D에 SpeechSynthesisMemLeakTest.Program.Test2()에서 SpeechLib.SpVoiceClass.Speak (문자열 텍스트, SpeechVoiceSpeakFlags 플래그) 에서 : \ Proj를 \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs : 라인 에서SpeechSynthesisMemLeakTest.Program.Main D에 (문자열 []에 args) : \ Proj를 \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs : 라인 System.AppDomain._nExecuteAssembly (조립 조립, 문자열 []에 args) 마이크로 소프트 에서. VisualStudio.HostingProcess.HostProc.RunUsersAssembly() System.Threading.ExecutionContext.Run에서 (의 ExecutionContext의 ExecutionContext, ContextCallback 콜백 상태 개체) System.Threading.ThreadHelper.ThreadStart에서 ()의 InnerException :
사람이 말할 수 SSML 컨텐츠를 말하기 위해 플래그를 올바르게 사용하는 방법은 무엇입니까?