【问题标题】:How can I wire up a progress bar to my Speech Synthesizer?如何将进度条连接到我的语音合成器?
【发布时间】:2013-04-29 17:33:24
【问题描述】:

我想在我的应用程序中将进度条连接到我的语音合成器(以显示它阅读文本的程度)。

我的 SpeechSynthesizer 代码的主要组件如下:

    private void button1_Click(object sender, EventArgs e)//Start button
        {
            reader.Dispose();
            if (Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text != "")
            {
                reader = new SpeechSynthesizer();
                reader.SpeakAsync(Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text);
                button2.Enabled = true;
                button4.Enabled = true;
                reader.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(reader_SpeakCompleted);
            }
            else
            {
                MessageBox.Show("Please insert text before launching Text to Speech.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

private void button2_Click(object sender, EventArgs e)//Pause button
        {
            if (reader != null)
            {
                if (reader.State == SynthesizerState.Speaking)
                {
                    reader.Pause();
                    button3.Enabled = true;
                }
            }

 private void button3_Click(object sender, EventArgs e)//Resume button
        {
            if (reader != null)
            {
                if (reader.State == SynthesizerState.Paused)
                {
                    reader.Resume();
                }
                button3.Enabled = false;
            }
            }


        private void button4_Click(object sender, EventArgs e)//Stop button
        {
            if (reader != null)
            {
                reader.Dispose();
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
            }
        }

我想将此代码连接到进度条,以便它显示语音合成器的当前状态(并在用户暂停/停止进度条时暂停/停止。这可能吗?我从未使用过进度条正确,所以我想要一些关于如何做到这一点的帮助。

谢谢。

【问题讨论】:

  • 您只能为可以实际检测到进度的事物显示“真实”进度条。 reader.SpeakAsync() 不是其中之一。您可以通过估计给定长度的文本需要多长时间才能阅读和基于此进度来创建“假”进度条。这些更为常见,正如安装人员一次又一次地填补他们的酒吧所见证的那样......
  • 问题是文本长度不同,因为它是一个文本编辑器。
  • 你需要一些你可以计数的东西在阅读时被退回,但事实似乎并非如此
  • 那么是不是不可能做到这一点呢?
  • 我会创建一个计时器。假设你读了 200 个单词,估计每个单词是 1 秒。创建一个每 2 秒计时一次的计时器,将进度条增加 1%。或类似的东西。

标签: c# .net-4.0 progress-bar progress speechsynthesizer


【解决方案1】:

处理 SpeechSynthesizer 对象的 SpeakProgress 事件。

reader.SpeakProgress += reader_SpeakProgress;

SpeakProgressEventArgs 传递足够的信息以在说出每个单词后更新进度条。

private void reader_SpeakProgress(Object sender, SpeakProgressEventArgs e)
{
    ProgressBar.Value = (Int32)((e.CharacterPosition + e.CharacterCount - 82F) / richTextBoxPrintCtrl1.Text.Length * 100);
}

- 82F”偏移在以下来自 Microsoft 的 SpeakProgressEventArgs.CharacterPosition Property 文档的摘录中进行了解释:

CharacterPosition 包括 XML 标记中字符的计数,包括它们的括号。使用 AppendText、AppendTextWithAlias、AppendTextWithHint、AppendSsmlMarkup 或 AppendTextWithPronunciation 方法中的任何一个时,内容将添加到包含开头和结尾发言元素的 SSML 提示。开头的 speak 元素为提示中所有单词和字母的 CharacterPosition 添加了 82 个字符和空格的偏移量...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2018-04-06
    • 2011-12-29
    • 2019-09-23
    相关资源
    最近更新 更多