2011-03-07 82 views
0

我正在研究一個項目,它將講述瀏覽的網頁的內容。瀏覽器是由我使用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或任何其他語音引擎,這樣我就可以完全閱讀和突出顯示,而不會導致瀏覽器被掛起........

回答

0

把所有的句子放到一個字符串中,然後只說一次。 用以下替換ur for循環:

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

希望這有助於!

2

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

+0

我不明白。你能寫下代碼嗎?或者舉個例子! – AtanuCSE 2011-03-07 18:24:48