C# WPF プロジェクトに TTS を実装しました。
以前は、System.Speech.Synthesis 名前空間の TTS を使用して話しました。話すコンテンツは、次のような 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 にはメモリ リークの問題があります。.
そこで、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 列挙を使用して、TTS の発話動作を指定します。フラグのいくつかの組み合わせを試しましたが、どれも SSML コンテンツをうまく読み上げることができませんでした。
特に、上記のコードは次の例外も発生させます。
System.Runtime.InteropServices.COMException が処理されませんでした
Message="HRESULT からの例外: 0x80045003"
Source="Interop.SpeechLib" ErrorCode=-2147201021 StackTrace: D:\Proj\TestSolutions\CSharp_Quick_Apps\SpeechSynthesisMemLeakTest\Program.cs の SpeechSynthesisMemLeakTest.Program.Test2() で SpeechLib.SpVoiceClass.Speak(文字列テキスト、SpeechVoiceSpeakFlags フラグ) で: Microsoft. VisualStudio.HostingProcess.HostProc.RunUsersAssembly() System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクト状態) で System.Threading.ThreadHelper.ThreadStart() InnerException:
フラグを正しく使用して SSML コンテンツを発言する方法を誰か教えてもらえますか?