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