0

私は閲覧したウェブページの内容を話すプロジェクトに取り組んでいます。ブラウザは私がWebControlを使用して作成しています。音声エンジンにSAPIを使用しています。そのトラフSpVoice.speakを読みながら、Webページの行を強調表示したかったのです。しかし、問題は、このspeakメソッドを非同期で使用すると、ループが音声の完了を待たないため、Webページの最後の行だけが強調表示されることです。したがって、非常に高速に発生するため、最後の行のみが強調表示されます。強調表示方法では、参照Microsoftmshtmlを使用しています。コード:

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を取得するための呼び出し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(splitSentences [i]);であるSynchronizeの方法でsound_object.speak()を呼び出すと、次に、ループは音声が完了するのを待ちますが、強調表示された行が表示されなかった理由はわかりません。話している間、ソフトウェアがハングします。つまり、WebBrowserは話している間は何もしませんが、話している手順はその時点では正常に機能します。

ハイライトを確認するために、ループ内にメッセージボックスを配置し、ループがメッセージボックスの[OK]ボタンが押されるのを待つと、行がハイライトされることを確認しました。ただし、[OK]を押すのはまったく良い考えではありません。各行のボタン。だから誰かが私に問題が何であるか、そしてブラウザをハングアップさせることなく私が完全に読んでハイライトできるように、SAPIまたは他の音声エンジンを効率的に使用する方法を教えてください........

4

2 に答える 2

2

TTSの完了イベントを使用して、前の行が終了した後に次の行を実行する必要があります。

于 2011-03-07T15:41:35.183 に答える
0

すべての文を1つの文字列にまとめ、speakを1回だけ呼び出します。urforループを以下に置き換えます。

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

お役に立てれば!

于 2011-10-07T17:42:41.113 に答える