Я реализовал 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?