2012-06-26 4 views
2

Я реализовал TTS в своем проекте C# WPF.Может ли C# SAPI говорить SSML-строку?

Раньше я использовал TTS в пространстве имен System.Speech.Synthesis, чтобы говорить. Говоря содержание в SSML формате (Speech Synthesizer Markup Language, поддержка настройки скорости речи, голос, подчеркнуть), как следующее:

<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 было необработанное
Message = "Исключение из HRESULT: 0x80045003"
Источник = "Interop.SpeechLib" ErrorCode = -2147201021 StackTrace: в SpeechLib.SpVoiceClass.Speak (String Text, SpeechVoiceSpeakFlags Flags) на SpeechSynthesisMemLeakTest.Program.Test2() в D: \ Рго \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs: линии вSpeechSynthesisMemLeakTest.Program.Main (String [] арг) в D: \ Рго \ TestSolutions \ CSharp_Quick_Apps \ SpeechSynthesisMemLeakTest \ Program.cs: линия на System.AppDomain._nExecuteAssembly (сборки Ассамблеи, String [] арг) в Microsoft. VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния) в System.Threading.ThreadHelper.ThreadStart() InnerException:

Может кто-нибудь сказать мне, как правильно использовать флаг для высказывания контента SSML?

ответ

2

Какой двигатель/голос TTS вы используете? Механизмы Microsoft TTS определенно поддерживают SSML с использованием кода, который вы используете; однако другие голоса/двигатели могут не поддерживать SSML.

Ошибка 0x80045003 is SPERR_UNSUPPORTED_FORMAT (вызывающий указал неподдерживаемый формат), что заставляет меня думать, что вам нужно использовать другой движок TTS (который поддерживает SSML).

0

Используйте этот флаг вместо

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

Испытано использованием

  • SpeechLib 5.4
  • C: \ Program Files (x86) \ Ссылка Сборки \ Microsoft \ Framework.NETFramework \ v4.5 \ System.Speech.dll
Смежные вопросы