哦 各位我的意思是这样的 我用tts做的一个语音界面我想在 用spvoice 调用 speak函数的时候触发相应的事件 
例如 audiolevel , book, viseme , word , phoneme等。
我想获取这些事件结果数据 ,我该如何写呢 谢谢高手们啦!我已经加到100 分了

解决方案 »

  1.   

    实列变量等,构造函授等  取得所有的 识别对象模块集合,放入下拉框代码  object _spVoiceCls =
    null;    //保存朗读用的 SAPI.SpVoice const
    int SpFlags =
    1; //SpeechVoiceSpeakFlags.SVSFlagsAsynobject _oISpeechObjectTokens =
    null; //保存 SAPI.ISpeechObjectTokens 就是系统有的语音引擎集合int TokensCount =
    0; // 语音引擎集合 数
            DictionaryEntry[] _deTokens=null; //榜定下拉框用的        public MainForm()
            {
                InitializeComponent();
                this.HandleDestroyed +=
    new EventHandler(Form1_HandleDestroyed);
            }private
    void Form1_Load(object sender, EventArgs e)
            {            InitSAPI();
                
            }系统事件:程序加载  取得所有的 识别对象模块集合,放入下拉框代码  void InitSAPI()
            {
                //创建语音对象朗读用
                _spVoiceCls = CreateComObject("SAPI.SpVoice");            if (_spVoiceCls == null)
                {                MessageBox.Show("您的系统没有,微软语音组件");
                    Application.Exit();
                }
                else
                {//取得所有的 识别对象模块集合                
                    _oISpeechObjectTokens = CallComMethod("GetVoices", _spVoiceCls); //取得SAPI.ISpeechObjectTokens
                    //识别对象集合 Count;
                    object r = GetComPropery("Count", _oISpeechObjectTokens);
                    if (r is int)
                    {                    TokensCount = (int)r;                    if (TokensCount > 0)
                        {
                            //取得全部语音识别对象模块,及名称,以被以后使用
                            _deTokens = new DictionaryEntry[TokensCount];
                            for (int i = 0; i < TokensCount; i++)
                            {
                                //从集合中取出单个 识别对象模块
                                object oSpObjectToken = CallComMethod("Item", _oISpeechObjectTokens, i); //返回 SAPI.SpObjectToken
                                //取名称
                                string Description = CallComMethod("GetDescription", oSpObjectToken) as string;
                                //放到 DictionaryEntry 对象中,key 是 识别对象模块,value 是名称
                                _deTokens= new DictionaryEntry(oSpObjectToken, Description);                        }
                            //邦定到 下拉框
                            cboxTokens.DisplayMember = "Value";
                            cboxTokens.ValueMember = "Key";
                            cboxTokens.DataSource = _deTokens;
                            cboxTokens.SelectedIndex = 0;
                        }                }            }        }用户事件:朗读  朗读输入的文本信息代码private void btnSynthesis_Click(object sender, EventArgs e)
            {
                string msg = rTxtMsg.Text.Trim();
                if (msg.Length != 0)
                {                if (_spVoiceCls != null)
                    {
                        
                        //设置语言引擎
                        SetComProperty("Voice", _spVoiceCls, cboxTokens.SelectedValue);
                        //调用Speak 函数,msg 是要播放的文本,1 是异步播放,因为是异步的 com 对象不立刻释放
                        CallComMethod("Speak", _spVoiceCls, msg, SpFlags);                }
                }        }
    用户事件:保存声音  将输入的文本信息生成音频文件保存到文件代码
      private void Save()
            {
                string msg = rTxtMsg.Text.Trim();
                if (msg.Length != 0)
                {
                    using (SaveFileDialog sfd = new SaveFileDialog())
                    {
                        sfd.Filter = "wav 文件 (*.wav)|*.wav";
                        sfd.RestoreDirectory = true;
                        if (sfd.ShowDialog() == DialogResult.OK)
                        {
                            /*
                            Enum SpeechStreamFileMode;
                                  SSFMOpenForRead = 0;
                                  SSFMOpenReadWrite = 1;
                                  SSFMCreate = 2;
                                  SSFMCreateForWrite = 3;                        */                        int SpFileMode = 3;// SpeechStreamFileMode.SSFMCreateForWrite                                            object oSpFileStream = CreateComObject("SAPI.SpFileStream"); //创建 SAPI.SpFileStream                        object oSpVoice = CreateComObject("SAPI.SpVoice"); //创建 SAPI.SpVoice                        
                            try
                            {
                                CallComMethod("Open", oSpFileStream, sfd.FileName, SpFileMode, false); //打开流
                                SetComProperty("Voice", oSpVoice, cboxTokens.SelectedValue); //设置 Voice 属性,让谁朗读
                                SetComProperty("AudioOutputStream", oSpVoice, oSpFileStream); //设置流                            CallComMethod("Speak", oSpVoice, msg, SpFlags); //调用 Speak                            CallComMethod("WaitUntilDone", oSpVoice, Timeout.Infinite); //等
                                CallComMethod("Close", oSpFileStream); //关闭流                            MessageBox.Show("保存成功");
                            }                        
                            finally
                            {
                                Marshal.ReleaseComObject(oSpVoice);
                                Marshal.ReleaseComObject(oSpFileStream);
                            }                        
                                                }                }
                }        }
            private void btnSave_Click(object sender, EventArgs e)
            {            try
                {
                    btnSave.Enabled = false;
                    Save();            }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    btnSave.Enabled = true;
                }        }
    调用com组件,功能函数  自己写的一些帮助函数可以方便调用反射,要不太郁闷(如果是VB 就不用如此费尽了)
    #region 调用com组件,功能通用函数
            /// <summary>
            /// 设置属性
            /// </summary>
            /// <param name="name"></param>
            /// <param name="o"></param>
            /// <param name="vlaue"></param>
            private static void SetComProperty(string name, object o, object vlaue)
            {
                Type t = o.GetType();
                t.InvokeMember(name, BindingFlags.Instance | BindingFlags.SetProperty, null, o, new
    object[] { vlaue });
            }
            /// <summary>
            /// 取得属性
            /// </summary>
            /// <param name="name"></param>
            /// <param name="o"></param>
            /// <returns></returns>
            private static object GetComPropery(string name, object o)
            {
                Type t = o.GetType();
                return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.GetProperty, null, o, null);
            }
            /// <summary>
            /// 调用方法函授
            /// </summary>
            /// <param name="name"></param>
            /// <param name="o"></param>
            /// <param name="parms"></param>
            /// <returns></returns>
            private static object CallComMethod(string name, object o, params object[] parms)
            {
                Type t = o.GetType();            return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, parms);
            }
            /// <summary>
            /// 创建 com 对象
            /// </summary>
            /// <param name="FromProgID"></param>
            /// <returns></returns>
            private static object CreateComObject(string FromProgID)
            {
                Type comType = Type.GetTypeFromProgID(FromProgID);
                object rVar = null;
                if (comType != null)
                    rVar = System.Activator.CreateInstance(comType);            return rVar;
            }
            #endregion
    释放com对象
      很简单的就一行即可代码
    void Form1_HandleDestroyed(object sender, EventArgs e)
            {
                //释放com对象
                Marshal.ReleaseComObject(_spVoiceCls);        }
      

  2.   

    MS TTS5.1 截图
    http://blog.csdn.net/spmzfz/archive/2010/04/05/5451431.aspxMS TTS5.1 源代码
    http://download.csdn.net/source/2204019
      

  3.   

     xk1126 (未来的明天)这位朋友 很感谢你了啊 
    但是我是在aspx页面上做的这个事情。
    我很菜,aspx页面上我该如何写啊?谢谢了。
      

  4.   

    <script language=vbscript> 
    sub OnSpeaking()
    EventElement="中国人123"
    set objNet=CreateObject("SpeakInChinese.Speaker")
    objNet.Speak(EventElement)
    end sub
    OnSpeaking()
    </script> 网页只要几句话,比啥语言都简单.如果这都看不懂的话我表示压力很大
      

  5.   

    我要实现的应该不会这么简单啊!
    但是 还要感谢你啊 微软的一个中国专家说了:大概是这样的----asp。net 没有循环机制 所以不会的到触发结果。
    无语 我只能用socket编程了高了 但是 还没有搞定啊 
    ---------------