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; } }
/// <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); } } } }