相关疑难解决方法(0)

SpeechSynthesizer中的常量内存泄漏

我开发了一个项目,我想发布它使用c#,WPF和System.Speech.Synthesizer对象.阻止此项目发布的问题是,无论何时调用SpeakAsync,都会导致内存泄漏,从而导致最终失败.我相信在使用这个物体后我已经正确清理,但找不到治愈方法.我通过Ants Memory Profiler运行程序,它报告WAVEHDR和WaveHeader随着每次调用而增长.

我已经创建了一个示例项目来试图查明原因,但我仍然处于亏损状态.任何帮助,将不胜感激.

该项目使用VS2008,是针对.NET 3.5和Any CPU的ac#WPF项目.您需要手动添加对System.Speech的引用.

这是代码:

<Window x:Class="SpeechTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel Orientation="Vertical">

        <Button Content="Start Speaking" Click="Start_Click" Margin="10" />
        <Button Content="Stop Speaking" Click="Stop_Click" Margin="10" />
        <Button Content="Exit" Click="Exit_Click" Margin="10"/>

    </StackPanel>
</Grid>
Run Code Online (Sandbox Code Playgroud)



// Start of code behind
using System;
using System.Windows;
using System.Speech.Synthesis;

namespace SpeechTest
{
    public partial class Window1 : Window
    {

        // speak setting
        private bool speakingOn = false;
        private int curLine = 0;
        private string [] speakLines = {
            "I am wondering",
            "Why …
Run Code Online (Sandbox Code Playgroud)

c# wpf memory-leaks text-to-speech

8
推荐指数
2
解决办法
2790
查看次数

C# SAPI 可以讲 SSML 字符串吗?

我在我的 C# WPF 项目中实现了 TTS。

以前,我使用 System.Speech.Synthesis 命名空间中的 TTS 来说话。说话内容为SSML格式(语音合成器标记语言,支持自定义语速、语音、强调)如下:

<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>
Run Code Online (Sandbox Code Playgroud)

但不幸的是,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);
Run Code Online (Sandbox Code Playgroud)

代码的重要部分是

tts.Speak(ssmlString, SpeechLib.SpeechVoiceSpeakFlags.SVSFParseSsml);
Run Code Online (Sandbox Code Playgroud)

它使用 …

c# speech sapi text-to-speech ssml

5
推荐指数
1
解决办法
2763
查看次数

标签 统计

c# ×2

text-to-speech ×2

memory-leaks ×1

sapi ×1

speech ×1

ssml ×1

wpf ×1