0

これは、Microsoft 音声 API 関連の質問です。

SpeechSynthesizer が SpeakStarted イベントをトリガーしたときに、このイベント内で SpeechSynthesizer が何を言おうとしているのかを知りたいという考えです。これで、音声と GUI 表示を同期させることができます。

コード:

SpeechSynthesizer _reader = new SpeechSynthesizer();


_reader.SpeakStarted += new EventHandler<SpeakStartedEventArgs>(_reader_SpeakStarted);


  void _reader_SpeakStarted(object sender, SpeakStartedEventArgs e)
        {
            // now _speak started!
            Console.WriteLine("_reader_SpeakStarted\t" + e.ToString());
           // string textContent=????
          //  updateGUI(textContent);

        }


_reader.SpeakAsync("Hello world A B C"); //asynchronize method!!!
_reader.SpeakAsync("Hello world B C D");
_reader.SpeakAsync("Hello world C D E");

問題:

SpeakStarted イベント内では、テキスト コンテンツを読み上げることができませんでした。

そこにブレークポイントを置いた場合、「Hello world xx x」が引数に表示されるのは奇妙ですが、それにアクセスする方法はありません。

誰かが親切に私を助けてくれたら、とても感謝しています。

.Net 4、Windows 7 64 ビット、VS2010

4

1 に答える 1

1

プロンプトオブジェクトには常にテキストが含まれているとは限らないため、パブリックプロパティとして公開されません。同じオブジェクトは、マーカーアップまたはオーディオファイルを使用して作成することもできます。これを実行する最良の方法は、SpeakAsyncメソッドに渡す値を、表示するときにUIに渡すことができるグローバル引数として格納することです。

プライベート静的文字列_spokenWords;

    static void Main(string[] args)
    {

        SpeechSynthesizer _reader = new SpeechSynthesizer();

        _reader.SpeakStarted += ReaderSpeakStarted;

        _spokenWords = "Hello world A B C";
        _reader.SpeakAsync(_spokenWords); //asynchronize method!!! 


    }


    static void ReaderSpeakStarted(object sender, SpeakStartedEventArgs e)
    {
        // now _speak started! 
        Console.WriteLine("_reader_SpeakStarted\t" + _spokenWords);

        // string textContent=???? 
        //  updateGUI(textContent); 

リフレクションを使用してプロンプトオブジェクトのプライベートテキストフィールドを分割し、値にアクセスすることもできます。これはより多くのリソースを消費し、必ずしも安定しているとは限りませんが、

static void Main(string [] args){

        SpeechSynthesizer _reader = new SpeechSynthesizer();

        _reader.SpeakStarted += ReaderSpeakStarted;

        _reader.SpeakAsync("Hello world A B C"); //asynchronize method!!! 
        _reader.SpeakAsync("Hello world B C D"); 
        _reader.SpeakAsync("Hello world C D E"); 

    }


    static void ReaderSpeakStarted(object sender, SpeakStartedEventArgs e)
    {
        // now _speak started! 
        var spokenWord = GetTextFieldValue(e.Prompt);
        Console.WriteLine("_reader_SpeakStarted\t" + spokenWord);

        // string textContent=???? 
        //  updateGUI(textContent); 

    }

    private static string GetTextFieldValue(Prompt p)
    {
        var text = typeof(Prompt).GetField("_text", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(p);
        return (string)(text.GetType() == typeof(String) ? text : string.Empty);
    }
于 2012-08-13T05:21:19.587 に答える