2011-03-07 29 views
0

私は、閲覧されたWebページの内容を話すプロジェクトに取り組んでいます.BrowserはWebControlを使用して作成されました。私は音声エンジンにSAPIを使用しています。私はその谷のSpVoice.speakを読んでいる間、Webページのラインを強調したかったのです。しかし、問題は、ループが音声が完了するのを待たないので、私が非同期の方法でこのspeakメソッドを使用し、Webページの最後の行だけがハイライト表示されるということです。したがって、非常に高速になり、最後の行だけがhighlighted.Highlightメソッドとして表示され、参照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; } 

    } 

ます。private void 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は発言中に何もしませんが、その時点では発言手順はうまくいきます。

ハイライトをチェックするために、私はループの中にメッセージボックスを入れ、ループがメッセージボックスの "OK"ボタンが押されるのを待つとハイライト表示されるのを見ました。しかし、これはまったく良い考えではありません各行に対して「OK」ボタンを押してください。 だから誰でも問題があると私はどのようにSAPIや他のスピーチエンジンを効率的な方法で使用することができますので、私はブラウザをハングアップせずに読むことができます。

答えて

0

すべての文を1つの文字列にして、話をただちに呼び出します。 は以下でループのウルを置き換える:

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