Проблема синхронизации для SAPI или (текст в речь) ....... C#

Я работаю над проектом, который будет озвучивать содержимое просматриваемой веб-страницы. Браузер сделан мной с помощью WebControl. Я использую SAPI для речевого движка. Я хотел выделить строку на веб-странице во время чтения этого корка SpVoice.speak. Но проблема в том, что если я использую этот метод речь в асинхронном режиме, то будет выделена только последняя строка веб-страницы, потому что цикл не ожидает завершения голоса. Таким образом, это происходит так быстро, что выделена только последняя строка. Метод Highlight использует справочный файл Microsoft mshtml. КОД:

SpeechLib.SpVoice sound_object = new SpeechLib.SpVoice();
bool highlight(string senten)
    {
        if (senten != null)
        {
            IHTMLDocument2 doc = (IHTMLDocument2)GetCurrentBrowser().Document.DomDocument;
            IHTMLSelectionObject sel = (IHTMLSelectionObject)doc.selection;
            IHTMLTxtRange rng = (IHTMLTxtRange)sel.createRange();
            rng.collapse(false);
            if (rng.findText(senten, 1000000, 0))
            {
                rng.select();
                return true;
            }
            else
            {
                return false;
            }

        }
        else
        { return false; }

    }

private void Read_ButtonSpkBAR_Click (отправитель объекта, EventArgs e) { // вызов для получения sourceCode gettingSourceCode();

        if (highlightToolStripMenuItem.Checked == true)
        {

            if (PAUSE)
            {
                sound_object.Resume();
                PAUSE = false;
            }
            else
            {
                sound_object.Rate = tempoRate;
                sound_object.Volume = volume;


                string[] splitSentences = Regex.Split(SourceCode, @"(?<=['""A-Za-z0-9][\.\!\?\u2424])\s+(?=[A-Z])");



                for (int i = 0; i < splitSentences.Length; i++)
                {


                    highlight(splitSentences[i]);
                    //MessageBox.Show(splitSentences[i]);

                    sound_object.Speak(splitSentences[i],SpeechLib.SpeechVoiceSpeakFlags.SVSFlagsAsync);




                }
            }
        }

Теперь, если я вызываю sound_object.speak() способом Synchronize, то есть sound_object.Speak(splitSentences[i]); затем цикл ожидает завершения голоса, но я не знаю, почему он не показывает выделенную строку. Программное обеспечение зависает во время разговора. Это означает, что WebBrowser ничего не делает во время разговора, но в то время процедура речи работает нормально.

Для проверки выделения я поместил окно сообщения внутри цикла и увидел, что строки подсвечиваются, если цикл ожидает нажатия кнопки "ОК" из окна сообщения. Но нажимать "ОК" вообще не очень хорошая идея. кнопка для каждой строки. Так что кто-нибудь может мне помочь, пожалуйста, в чем заключается проблема и как я могу эффективно использовать SAPI или любой другой речевой движок, чтобы я мог читать и выделять все без зависания браузера........

2 ответа

Решение

Соберите все предложения в одну строку и позвоните по телефону только один раз. замените ur для цикла следующим:

string str1 = "";
for (int i = 0; i < splitSentences.Length; i++) 
{ 
     str1 += highlight(splitSentences[i]); 
}
sound_object.Speak(str1, SpeechLib.SpeechVoiceSpeakFlags.SVSFlagsAsync);

надеюсь это поможет!

Вам нужно сделать следующую строку после окончания предыдущей строки, используя событие завершения TTS.

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