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(object sender,EventArgs e){//调用获取sourceCode的getsSourceCode();

  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+(?=[AZ])"); 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(),这是sound_object.Speak(splitSentences [i]); 然后循环等待语音完成,但我不知道为什么它没有显示突出显示的行。 该软件在讲话时被绞死。这意味着WebBrowser在讲话时没有做任何事情,但是讲话程序在那时工作正常。

为了检查突出显示,我在循环内部放置了一个消息框,并看到如果循环等待按下“确定”按钮按下消息框,行会突出显示。但是这根本不是一个好主意来推送“确定”每行按钮。 所以有人可以帮助我解决问题是什么,如何以有效的方式使用SAPI或任何其他语音引擎,以便我可以完全阅读和突出显示而不会让浏览器被挂起……..

将所有句子都写成一个字符串,然后只调用一次。 用以下代码替换你的循环:

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

希望这可以帮助!

您需要使用TTS的完成事件在上一行完成后执行下一行。