我正在研究一個項目,它將講述瀏覽的網頁的內容。瀏覽器是由我使用WebControl製作的。我正在使用SAPI作爲語音引擎。我想在閱讀該低谷SpVoice.speak時在網頁中突出顯示該行。但問題是,如果我以異步方式使用這種說法,那麼只有網頁的最後一行突出顯示,因爲循環不會等待語音完成。因此,它發生得太快,只有最後一行顯示爲突出顯示。高亮方法使用的是參考Microsoft mshtml。 CODE:SAPI或(文本到語音)的同步問題....... C#
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; }
}
私人無效Read_ButtonSpkBAR_Click(對象發件人,EventArgs的) { //呼叫用於獲得源代碼 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()是一個同步方式,其是sound_object.Speak(splitSentences [I]);然後循環等待語音完成,但我不知道爲什麼它沒有顯示突出顯示的行。說話時軟件會被掛起。這意味着WebBrowser在講話時不會做任何事情,但當時講話過程正常。
爲了檢查高光,我把一個消息框放到循環中,並且看到如果循環等待「確定」按鈕被推入消息箱,那麼這些行會突出顯示。但這根本不是一個好主意,每行按下「確定」按鈕。 所以任何人都可以幫助我解決問題,以及如何以有效的方式使用SAPI或任何其他語音引擎,這樣我就可以完全閱讀和突出顯示,而不會導致瀏覽器被掛起........
我不明白。你能寫下代碼嗎?或者舉個例子! – AtanuCSE 2011-03-07 18:24:48