【问题标题】:How to avoid narrator and string to speech Overlapping in c#?c# - 如何避免叙述者和字符串与c#中的语音重叠?
【发布时间】:2013-07-07 14:33:30
【问题描述】:
    Process process;

    // Read Contetnt Mouse click event
    private SpeechSynthesizer readerSpeak;
    private void btnSpeakContent_Click(object sender, EventArgs e)
    {
        if(richTextBoxThanglish.Text.Trim() == string.Empty)
        {
            if (process.HasExited == false)
                process.Kill();
            MessageBoxWrapper.ShowWarning("Textbox is Empty.", "ABTS", "Textbox is Empty.");
            process = Process.Start("narrator.exe");
        }
        else
        {
            if (process.HasExited == false)
                process.Kill();

            readerSpeak = new SpeechSynthesizer();                
            readerSpeak.SpeakAsync(richTextBoxThanglish.Text.ToString());

            if (process.HasExited == true)
                process = Process.Start("narrator.exe");
        }
    }       

    private void btnStopSpeak_Click(object sender, EventArgs e)
    {
        if (process.HasExited == true)
            process = Process.Start("narrator.exe");

        if (!(readerSpeak == null))
        {                
            readerSpeak.Dispose();
        }
    }

假设上面的程序有两个按钮调用 speakContent 和 stop_speak。我运行 narrator.exe 进程来获取 Windows 旁白。 我确实想在不重叠语音的情况下说出richtextbox 内容。我知道 Synchronos speak,但它会暂停我的应用程序,直到 speakContent 完成。我需要这个和 SpeakAsyn()。 无论如何在语音旁白中添加静音?实际上我需要那个文本语音,在 3 秒之后。我曾使用“System.Threading.Thread.Sleep(3000);”。但仍然会发生文本重叠, 表示旁白和字符串到语音一起播放。

请帮忙。

【问题讨论】:

    标签: .net c#-4.0 narrator


    【解决方案1】:

    您可能想在后台线程中处理相关的事情...这是一个使用BackgroundWorker 的示例。它在 Visual Studio 的 WinForms 工具箱中可用,因此您应该能够直接拖放到您的表单上。

    BackgroundWorkerDoWork 事件创建一个处理程序。这是您将在后台线程中调用其他进程的地方。您可以在此处等待该过程完成,而无需停止您的应用。

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        process = Process.Start("narrator.exe");
        process.WaitForExit();
    }
    

    当有人点击按钮阅读时,您只需检查BackgroundWorker当前是否正在运行,如果是,则什么也不做。

    if(this.backgroundWorker1.IsBusy) return;
    

    【讨论】:

    • 感谢您的宝贵时间。我已经使用 key_Leave 事件修复了它。
    • 如果您愿意,您可以自己发布一个答案(并接受它)以记录您是如何修复它的(使用代码示例等),因此将来遇到此问题的任何人都会知道如何解决它。
    猜你喜欢
    • 2016-11-20
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多