2012-06-26 2 views
2

저는 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 컨텐츠를 말하기 위해 플래그를 올바르게 사용하는 방법은 무엇입니까?

답변

2

어떤 TTS 엔진/음성을 사용하고 있습니까? Microsoft TTS 엔진은 사용중인 코드를 사용하여 SSML을 확실히 지원합니다. 그러나 다른 음성/엔진은 SSML을 지원하지 않을 수 있습니다.

오류 0x80045003은 SPERR_UNSUPPORTED_FORMAT입니다. 호출자가 지원되지 않는 형식을 지정했기 때문에 SSIS를 지원하는 다른 TTS 엔진을 사용해야한다고 생각합니다.

0

대신 사용

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

  • SpeechLib 5를 사용하여 테스트이 플래그.4
  • C : \의 Program Files (x86) \ 참조 어셈블리 \ 마이크로 소프트 \ Framework.NETFramework \ V4.5 \ System.Speech.dll
관련 문제