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

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

Основные компоненты моего кода 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;
            }
        }

Я хотел бы связать этот код с индикатором выполнения, чтобы он отображал текущий статус синтезатора речи (и приостанавливал/останавливал, когда пользователь приостанавливал/останавливал индикатор выполнения. Возможно ли это? Я никогда не использовал индикатор выполнения правильно, поэтому мне нужна помощь в том, как это сделать.

Спасибо.


person Toby    schedule 29.04.2013    source источник
comment
Вы можете показать реальный индикатор выполнения только для тех вещей, где вы действительно можете обнаружить прогресс. reader.SpeakAsync() не из таких. Вы можете создать поддельный индикатор выполнения, оценив, сколько времени потребуется для чтения текста заданной длины, и продвигаясь на основе этого. Они гораздо более распространены, о чем свидетельствуют установщики, которые снова и снова заполняют свою планку ...   -  person Bobson    schedule 29.04.2013
comment
Проблема в том, что длина текста варьируется, так как это текстовый редактор.   -  person Toby    schedule 29.04.2013
comment
Вам нужно что-то, что вы могли бы посчитать, чтобы вернуться во время чтения, что, похоже, не так.   -  person Jonesopolis    schedule 29.04.2013
comment
Так неужели этого нельзя добиться?   -  person Toby    schedule 29.04.2013
comment
Ну, Бобсон говорил, что вы можете это оценить. Вы можете получить количество слов/символов/слогов из текста и угадать, сколько времени это займет.   -  person Jonesopolis    schedule 29.04.2013
comment
Но, как я уже сказал, длина текста варьируется, так как это текстовый редактор, поэтому это трудно предсказать...   -  person Toby    schedule 29.04.2013
comment
Вы получаете текст с помощью Basic_Word_Processor.Instance.richTextBoxPrintCtrl1.Text, верно? Почему ты не можешь это посчитать?   -  person Jonesopolis    schedule 29.04.2013
comment
О.. Извините, я неправильно прочитал его комментарий. Как я мог это сделать?   -  person Toby    schedule 29.04.2013
comment
Я бы создал таймер. Скажем, вы прочитали 200 слов и оценили каждое слово в 1 секунду. Создайте таймер, который тикает каждые 2 секунды, что увеличивает индикатор выполнения на 1%. Или что-то подобное.   -  person Jonesopolis    schedule 29.04.2013
comment
Хорошо. Я посмотрю на это.   -  person Toby    schedule 29.04.2013
comment
Что сказал @Jonesy. Вам придется поэкспериментировать, чтобы получить хорошую длину галочки, и если есть много слов, которые он читает медленно (или быстро), вы ошибетесь, но в большинстве случаев он должен быть средним.   -  person Bobson    schedule 29.04.2013


Ответы (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" объясняется в следующем отрывке из Свойство SpeakProgressEventArgs.CharacterPosition документация:

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

person user3440358    schedule 27.03.2017