Esempio n. 1
0
        public TTS(string config)
        {
            this.config = config;
            int ret = MSPAPI.MSPLogin(null, null, config);

            if (ret != 0)
            {
                if (ttsSpeakErrorEvent != null)
                {
                    ttsSpeakErrorEvent.Invoke("登录TTS引擎错误,错误代码:" + ret);
                }
            }
            else
            {
                active = true;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 把文字转化为声音,单路配置,一种语音
        /// </summary>
        /// <param name="speekText">要转化成语音的文字</param>
        /// <param name="outWaveFlie">把声音转为文件,默认为不生产wave文件</param>
        public void Speak(string speekText, string szParams, string outWaveFlie)
        {
            byte[] bytes = null;
            int    ret   = 0;

            try
            {
                sessionID = Marshal.PtrToStringAuto(MSPAPI.QTTSSessionBegin(szParams, ref ret));
                if (ret != 0)
                {
                    if (ttsSpeakErrorEvent != null)
                    {
                        ttsSpeakErrorEvent.Invoke("初始化TTS引会话错误,错误代码:" + ret);
                    }
                    return;
                }
                ret = MSPAPI.QTTSTextPut(sessionID, speekText, (uint)Encoding.Unicode.GetByteCount(speekText), string.Empty);
                if (ret != 0)
                {
                    if (ttsSpeakErrorEvent != null)
                    {
                        ttsSpeakErrorEvent.Invoke("向服务器发送数据,错误代码:" + ret);
                    }
                    return;
                }
                IntPtr      audio_data;
                int         audio_len    = 0;
                SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
                using (MemoryStream ms = new MemoryStream())
                {
                    ms.Write(new byte[44], 0, 44);
                    //写44字节的空文件头
                    while (synth_status == SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA)
                    {
                        audio_data = MSPAPI.QTTSAudioGet(sessionID, ref audio_len, ref synth_status, ref ret);
                        if (audio_data != IntPtr.Zero)
                        {
                            byte[] data = new byte[audio_len];
                            Marshal.Copy(audio_data, data, 0, audio_len);
                            ms.Write(data, 0, data.Length);
                            if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || ret != 0)
                            {
                                if (ret != 0)
                                {
                                    if (ttsSpeakErrorEvent != null)
                                    {
                                        ttsSpeakErrorEvent.Invoke("下载TTS文件错误,错误代码:" + ret);
                                    }
                                    return;
                                }
                                break;
                            }
                        }
                        Thread.Sleep(150);
                    }
                    System.Diagnostics.Debug.WriteLine("wav header");
                    WAVE_Header header     = getWave_Header((int)ms.Length - 44); //创建wav文件头
                    byte[]      headerByte = StructToBytes(header);               //把文件头结构转化为字节数组                      //写入文件头
                    ms.Position = 0;                                              //定位到文件头
                    ms.Write(headerByte, 0, headerByte.Length);                   //写入文件头
                    bytes = ms.ToArray();
                    ms.Close();
                }

                if (outWaveFlie != null)
                {
                    if (File.Exists(outWaveFlie))
                    {
                        File.Delete(outWaveFlie);
                    }
                    File.WriteAllBytes(outWaveFlie, bytes);
                }
            }
            catch (Exception ex)
            {
                if (ttsSpeakErrorEvent != null)
                {
                    ttsSpeakErrorEvent.Invoke("Error:" + ex.Message);
                }
                return;
            }
            finally
            {
                ret = MSPAPI.QTTSSessionEnd(sessionID, "");
                if (ret != 0)
                {
                    if (ttsSpeakErrorEvent != null)
                    {
                        ttsSpeakErrorEvent.Invoke("结束TTS会话错误,错误代码:" + ret);
                    }
                }
                else
                {
                    if (tts_SpeakFinishedEvent != null)
                    {
                        tts_SpeakFinishedEvent.Invoke(speekText, bytes);
                    }
                }
            }
        }