Проблема синхронизации для 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.