Проблема синхронизации для SAPI или (текст в речь) ....... C # - PullRequest
0 голосов
/ 07 марта 2011

Я работаю над проектом, который будет озвучивать содержимое просматриваемой веб-страницы. Браузер сделан мной с использованием 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 ]

2 голосов
/ 07 марта 2011

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

0 голосов
/ 07 октября 2011

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

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

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

...