如何将进度条连接到语音合成器?

时间:2013-04-29 17:33:24

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

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

我的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;
            }
        }

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

感谢。

1 个答案:

答案 0 :(得分:0)

处理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提示中。开头说话元素为提示中的所有单词和字母的CharacterPosition添加了82个字符和空格的偏移量...