public void CloseXunFei() { int ret = TTSDll.MSPLogout(); if (ret != 0) { throw new Exception("逆初始化TTS引擎错误,错误代码:" + ret); } }
/// <summary> /// 语音识别 /// </summary> /// <param name="text"></param>文本内容 public void SpeechTest(String text, string ent, string vcn) { try { ///APPID请勿随意改动 string login_configs = "appid =59c4ae84 ";//登录参数,自己注册后获取的appid if (string.IsNullOrEmpty(text.Trim())) { text = "请输入合成语音的内容"; } //string filename = "Call.wav"; //合成的语音文件 uint audio_len = 0; SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA; ret = TTSDll.MSPLogin(string.Empty, string.Empty, login_configs);//第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在http://open.voicecloud.cn //MSPLogin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return; } string _params = "ssm=1,ent=" + ent + ",vcn=" + vcn + ",spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000"; session_ID = TTSDll.QTTSSessionBegin(_params, ref ret); //QTTSSessionBegin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return; } ret = TTSDll.QTTSTextPut(Ptr2Str(session_ID), text, (uint)Encoding.Default.GetByteCount(text), string.Empty); //QTTSTextPut方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return; } MemoryStream memoryStream = new MemoryStream(); memoryStream.Write(new byte[44], 0, 44); while (true) { IntPtr source = TTSDll.QTTSAudioGet(Ptr2Str(session_ID), ref audio_len, ref synth_status, ref ret); byte[] array = new byte[(int)audio_len]; if (audio_len > 0) { Marshal.Copy(source, array, 0, (int)audio_len); } memoryStream.Write(array, 0, array.Length); Thread.Sleep(1000); if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || ret != 0) { break; } } WAVE_Header wave_Header = getWave_Header((int)memoryStream.Length - 44); byte[] array2 = this.StructToBytes(wave_Header); memoryStream.Position = 0L; memoryStream.Write(array2, 0, array2.Length); memoryStream.Position = 0L; SoundPlayer soundPlayer = new SoundPlayer(memoryStream); soundPlayer.Stop(); soundPlayer.Play(); //if (filename != null) //{ // FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write); // memoryStream.WriteTo(fileStream); // memoryStream.Close(); // fileStream.Close(); //} } catch (Exception) { } finally { ret = TTSDll.QTTSSessionEnd(Ptr2Str(session_ID), ""); ret = TTSDll.MSPLogout();//退出登录 } }
private MemoryStream GetAudioData(string str) { int ret = 0; IntPtr session_ID; //APPID请勿随意改动 string login_configs = "appid = 5ac9f8d1"; //登录参数,自己注册后获取的appid string text = str; //text是待合成文本 uint audio_len = 0; SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA; ret = TTSDll.MSPLogin(string.Empty, string.Empty, login_configs); //第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在http://open.voicecloud.cn //MSPLogin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return(null); } //string parameter = "engine_type = local, voice_name=xiaoyan, tts_res_path =fo|res\\tts\\xiaoyan.jet;fo|res\\tts\\common.jet, sample_rate = 16000"; string _params = "ssm=1,ent=sms16k,vcn=xiaoyan,spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000"; //string @params = "engine_type = local,voice_name=xiaoyan,speed=50,volume=50,pitch=50,rcn=1, text_encoding = UTF8, background_sound=1,sample_rate = 16000"; session_ID = TTSDll.QTTSSessionBegin(_params, ref ret); //QTTSSessionBegin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return(null); } ret = TTSDll.QTTSTextPut(Ptr2Str(session_ID), text, (uint)Encoding.Default.GetByteCount(text), string.Empty); //QTTSTextPut方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return(null); } //内存流可直接在内存进行读写,不需要临时缓冲区或者临时文件 MemoryStream memoryStream = new MemoryStream(); memoryStream.Write(new byte[44], 0, 44);//为结构体开辟空间,后面用来存储音频文件结构体 while (true) { IntPtr source = TTSDll.QTTSAudioGet(Ptr2Str(session_ID), ref audio_len, ref synth_status, ref ret); byte[] array = new byte[(int)audio_len]; if (audio_len > 0) { Marshal.Copy(source, array, 0, (int)audio_len); } memoryStream.Write(array, 0, array.Length); //将合成的音频字节数据存放到内存流中 Thread.Sleep(150); //防止CPU频繁占用 if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || ret != 0) { break; } } WAVE_Header wave_Header = getWave_Header((int)memoryStream.Length - 44); byte[] array2 = StructToBytes(wave_Header); memoryStream.Position = 0L; //将指针定位到开头 memoryStream.Write(array2, 0, array2.Length); //存储结构体的字节数组 memoryStream.Position = 0L; //将指针定位到开头 ret = TTSDll.QTTSSessionEnd(Ptr2Str(session_ID), ""); //结束会话 ret = TTSDll.MSPLogout(); //退出登录 return(memoryStream); }
/// <summary> /// /// </summary> /// <param name="text">要转换的文字</param> /// <param name="guisy">生成声音文件的标识</param> public string txt2ShengYin(string text, string guisy) { try { ///APPID请勿随意改动 string login_configs = ZmConfig.XunFeiAppId;//登录参数,自己注册后获取的appid if (string.IsNullOrEmpty(text)) { return("请输入合成语音的内容"); } string filename = guisy + ".wav"; //合成的语音文件 uint audio_len = 0; SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA; //第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在http://open.voicecloud.cn // usr[in] 此参数保留,传入NULL即可。 //pwd[in] 此参数保留,传入NULL即可。 //params[in] 参见下表: //格式说明:每个参数和参数值通过key=value的形式组成参数对;如果有多个参数对,再用逗号进行拼接,如:key_1=value_1,key_2=value_2 //注意:每个参数(key)和参数值(value)均不得含有逗号(,)和等号(=),否则会被截断 //在线/离线业务 参数 名称 ret = TTSDll.MSPLogin(string.Empty, string.Empty, login_configs); //MSPLogin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return("MSPLogin:"******"engine_type = local, voice_name=xiaoyan, tts_res_path =fo|res\\tts\\xiaoyan.jet;fo|res\\tts\\common.jet, sample_rate = 16000"; string _params = "ssm=1,ent=sms16k,vcn=xiaoyan,spd=medium,aue=speex-wb;7,vol=x-loud,auf=audio/L16;rate=16000"; //string @params = "engine_type = local,voice_name=xiaoyan,speed=50,volume=50,pitch=50,rcn=1, text_encoding = UTF8, background_sound=1,sample_rate = 16000"; session_ID = TTSDll.QTTSSessionBegin(_params, ref ret); //QTTSSessionBegin方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return("QTTSSessionBegin:" + ret.ToString()); } ret = TTSDll.QTTSTextPut(Ptr2Str(session_ID), text, (uint)Encoding.Default.GetByteCount(text), string.Empty); //QTTSTextPut方法返回失败 if (ret != (int)ErrorCode.MSP_SUCCESS) { return("QTTSTextPut:" + ret.ToString()); } MemoryStream memoryStream = new MemoryStream(); memoryStream.Write(new byte[44], 0, 44); while (true) { IntPtr source = TTSDll.QTTSAudioGet(Ptr2Str(session_ID), ref audio_len, ref synth_status, ref ret); byte[] array = new byte[(int)audio_len]; if (audio_len > 0) { Marshal.Copy(source, array, 0, (int)audio_len); } memoryStream.Write(array, 0, array.Length); Thread.Sleep(1000); if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || ret != 0) { break; } } WAVE_Header wave_Header = getWave_Header((int)memoryStream.Length - 44); byte[] array2 = this.StructToBytes(wave_Header); memoryStream.Position = 0L; memoryStream.Write(array2, 0, array2.Length); memoryStream.Position = 0L; if (filename != null) { FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write); memoryStream.WriteTo(fileStream); memoryStream.Close(); fileStream.Close(); } } catch (Exception) { } finally { ret = TTSDll.QTTSSessionEnd(Ptr2Str(session_ID), ""); ret = TTSDll.MSPLogout();//退出登录 } return("ok:" + guisy); }