4

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 コンテンツを発言する方法を誰か教えてもらえますか?

4

2 に答える 2

3

どの TTS エンジン/音声を使用していますか? Microsoft TTS エンジンは、使用しているコードを使用して SSML を確実にサポートします。ただし、他の音声/エンジンは SSML をサポートしていない場合があります。

エラー 0x80045003 は SPERR_UNSUPPORTED_FORMAT (呼び出し元がサポートされていない形式を指定した) であり、別の TTS エンジン (SSML をサポートする) を使用する必要があると思われます。

于 2013-09-13T19:15:27.743 に答える
0

代わりにこのフラグを使用してください

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

を使用してテスト済み

  • スピーチライブラリ 5.4
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Speech.dll
于 2016-02-18T00:45:32.360 に答える