【问题标题】:Get text content from SAPI SpeakStarted event从 SAPI SpeakStarted 事件中获取文本内容
【发布时间】:2012-08-10 07:22:58
【问题描述】:

这是一个微软语音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 x x x”确实出现在参数中,如果你在那里放一个断点,但没有办法访问它。

如果有人可以帮助我,我将不胜感激。

.Net 4,windows 7 64 位,VS2010

【问题讨论】:

    标签: c# sapi text-to-speech


    【解决方案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);
        }
    

    【讨论】:

      猜你喜欢
      • 2022-07-10
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2013-10-29
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多