Как подключить индикатор выполнения к синтезатору речи?

Я хотел бы подключить индикатор выполнения к моему синтезатору речи в моем приложении (чтобы показать, как далеко он читает текст).

Основными компонентами моего кода Speech Synthesizer являются следующие:

    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 ответ

Обработайте событие SpeakProgress вашего объекта SpeechSynthesizer.

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:

CharacterPosition включает в себя количество символов в тегах XML, включая заключенные в них квадратные скобки. При использовании любого из методов AppendText, AppendTextWithAlias, AppendTextWithHint, AppendSsmlMarkup или AppendTextWithPronception содержимое добавляется в приглашение SSML, которое включает в себя открывающие и закрывающие элементы разговора. Открывающий элемент говорит добавляет смещение 82 символов и пробелов в CharacterPosition всех слов и букв в приглашении...

Другие вопросы по тегам