失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C#调用科大讯飞语音合成(Windows)

C#调用科大讯飞语音合成(Windows)

时间:2019-11-22 05:22:37

相关推荐

C#调用科大讯飞语音合成(Windows)

1、下载在线语音合成SDK,SDK中如下图是官方提供的在线语音合成C语言的例子

(在开始用C#做时,可以先研究下他们的例子)

这是整个工程的流程:

2、创建自己的C#工程,将SDK中msc.dll文件复制到C#工程中的debug文件下

(msc和appid是相互对应的,要是自己SDK中的)

3、下面便是代码部分了

首先要封装自己的dll:

因为msc.dll是C语言写的,所以自己要封yibu装一个C#的dll,就是把工程里需要的函数和结构体封装到自己的dll中,因为代码太长,我就粘了主要的一部分

public enum SynthStatus{MSP_TTS_FLAG_STILL_HAVE_DATA = 1,MSP_TTS_FLAG_DATA_END = 2,MSP_TTS_FLAG_CMD_CANCELED = 0}#endregionpublic class TTSDll{#region TTS dll import[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern int MSPLogin(string user, string password, string configs);[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern int MSPLogout();[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern IntPtr QTTSSessionBegin(string _params, ref int errorCode);[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern int QTTSTextPut(string sessionID, string textString, uint textLen, string _params);[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern IntPtr QTTSAudioGet(string sessionID, ref uint audioLen, ref SynthStatus synthStatus, ref int errorCode);[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern IntPtr QTTSAudioInfo(string sessionID);[DllImport("msc.dll", CallingConvention = CallingConvention.Winapi)]public static extern int QTTSSessionEnd(string sessionID, string hints);#endregion}

接着便是主要合成语音了(主代码如下):

private static void button1_Click(string str){int ret = 0;IntPtr session_ID;//APPID请勿随意改动string login_configs = "appid = 5ac9f8d1";//登录参数,自己注册后获取的appidstring text=str;//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);//第一个参数为用户名,第二个参数为密码,第三个参数是登录参数,用户名和密码需要在//MSPLogin方法返回失败if (ret != (int)ErrorCode.MSP_SUCCESS){return;}//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;}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(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;//将指针定位到开头SoundPlayer soundPlayer = new SoundPlayer(memoryStream);//通过读取内存流中的数据创建播放器//soundPlayer.Stop();soundPlayer.Play();//播放音频if (filename != null){//通过文件名创建音频文件流FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write);memoryStream.WriteTo(fileStream);//将内存流中的数据写入到文件流,文件流写入到音频文件中ImemoryStream.Close();//关闭流fileStream.Close();}ret = TTSDll.QTTSSessionEnd(Ptr2Str(session_ID), "");//结束会话ret = TTSDll.MSPLogout();//退出登录}

运行结果如下(输入想转换的文字内容,支持中英文,打回车就会播放转换的语音,同时在工程的debug目录下生成音频文件):

文章参考:/wyq1153/article/details/72178422/

文章对应demo:/download/hyy_sui_yuan/10634487

如有问题欢迎提问,看到一定及时解答

如果觉得《C#调用科大讯飞语音合成(Windows)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。