在.net Speech.Synthesizer内存泄漏?(Memory leak in .Net

2019-07-29 11:44发布

我发现在我的应用连续泄漏。 使用内存分析器检查后,我发现课程是由微软Speech.Synthesizer一些对象

所以,我建立了一个玩具项目,以验证这一假设:

//玩具为例,说明在Speech.Synthesizer对象内存泄漏

static void Main(string[] args)
{
    string text = "hello world. This is a long sentence";
    PromptBuilder pb = new PromptBuilder();
    pb.StartStyle(new PromptStyle(PromptRate.ExtraFast));
    pb.AppendText(text);
    pb.EndStyle();
    SpeechSynthesizer tts = new SpeechSynthesizer();

while (true)
{
    //SpeechSynthesizer tts = new SpeechSynthesizer();
    Console.WriteLine("Speaking..."); 
    tts.Speak(pb);

    //Print private working set sieze
    Console.WriteLine("Memory: {0} KB\n", (Process.GetCurrentProcess().PrivateMemorySize64 / 1024).ToString("0"));

    //tts.Dispose();    //also this doesn't work as well
    //tts = null;

    GC.Collect();   //a little help, but still leaks
}
}

而结果却证实了内存泄漏是从Speech.Synthesizer

Speaking...

内存:42184 KB

说起...内存:42312 KB

说起...内存:42440 KB

说起...内存:42568 KB

说起...内存:42696 KB

说起...内存:42824 KB

说起...内存:43016 KB

说起...内存:43372 KB

我用Google搜索了一下,发现很多人都遇到了同样的问题:1 在SpeechSynthesizer常量内存泄漏 2: http://connect.microsoft.com/VisualStudio/feedback/details/664196/system-speech-has-a-memory -泄漏

但可悲的是我没有找到任何解决的办法。 由于它的问题已经问很久以前的事了,所以我想问问,如果它解决了没有?

非常感谢。

更新:

好像在我切换使用SAPI的COM DLL而不是净Speech.Synthesizer包(虽然本质上它们是一回事),内存泄漏停止。

为什么两个调用行为(SAPI DLL VS .NET语音包)有不同的内存的行为呢? 由于后者似乎只是一个包装前SAPI DLL。

    static void Test2()
{
    //SAPI COM component this time
    SpeechLib.SpVoiceClass tts = new SpeechLib.SpVoiceClass();
    tts.SetRate(5);
    string text = "hello world. This is a long sentence";
    //tts.Speak("helloWorld", SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);
while (true)
{

    Console.WriteLine("Speaking...");
    tts.Speak(text, SpeechLib.SpeechVoiceSpeakFlags.SVSFDefault);

    //Print private working set sieze
    Console.WriteLine("Memory: {0} KB\n", (Process.GetCurrentProcess().PrivateMemorySize64 / 1024).ToString("0"));

    GC.Collect();
}

}

内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

说起...内存:32044 KB

Answer 1:

最终的解决方案:

谷歌,荷兰国际集团相关的关键字,告诉我,它实际上是从微软的错误。

好像在我切换使用SAPI的COM DLL而不是净Speech.Synthesizer包(虽然本质上它们是一回事),内存泄漏停止。



Answer 2:

我不知道所有的细节上SpeechSynthesizer,但你可以尝试使用这里的一次性模式。 由于SpeechSynthesizer实现了IDisposable

您的代码将如下所示:

while (true)
{
   using (SpeechSynthesizer tts = new SpeechSynthesizer())
   {
      Console.WriteLine("Speaking..."); 
      tts.Speak(pb);

      //Print private working set sieze
      Console.WriteLine("Memory: {0} KB\n",(Process.GetCurrentProcess().PrivateMemorySize64 / 1024).ToString("0"));
   }
}

如果你发现这是非常类似于微软的例子在这里

这看起来其实是一种内存泄漏,您是否尝试过使用Microsoft.Speech运行 ? 语法看起来很相似,他们都提到它不应该有同样的问题。



Answer 3:

我知道这是一个古老的线程,但对于这个问题的另一个解决方案。 使用Microsoft.Speech.Synthesis.SpeechSynthesizer代替System.Speech.Synthesis.SpeechSynthesizer。

Microsoft.Speech.Synthesis.SpeechSynthesizer被包含在Microsoft语音平台-软件开发工具包(SDK)(第11版) - https://www.microsoft.com/en-us/download/details.aspx?id=27226

该合成器的版本没有内存泄漏。



文章来源: Memory leak in .Net Speech.Synthesizer?