2012-08-10 54 views
0

獲取文本內容這是Microsoft Speech API的相關問題:從SAPI SpeakStarted事件

那就是當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 x x x」確實出現在參數中,如果你在那裏放置一個斷點,但是沒有辦法訪問它。

如果有人能夠幫助我,我會非常感激。

淨4,窗口7 64位,VS2010

回答

1

提示對象並不總是包含文本這就是爲什麼它不暴露作爲公共屬性。同樣的對象也可以使用標記或音頻文件構建。執行此操作的最佳方法是將您傳遞給SpeakAsync方法的值作爲全局參數存儲,當您想要顯示它們時可以將其傳遞到UI中。

private static string _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); 

你也可以看看使用反射打出來的私人文本字段中提示對象訪問值。雖然這將是更多的資源,而且不一定是穩定的:

靜態無效的主要(字串[] 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); 
    } 
+0

謝謝!你太棒了! – 2012-08-13 06:22:10