实例介绍
【实例简介】自动朗读文本内容并生成wav声音文件
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using TTS; using System.Runtime.InteropServices; using System.IO; using System.Media; using System.Threading; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int ret = 0; IntPtr session_ID; private void button1_Click(object sender, EventArgs e) { try { ///APPID请勿随意改动 string login_configs = "appid =58f4784c";//登录参数,自己注册后获取的appid string text = textBox1.Text.Trim();//待合成的文本 if (string.IsNullOrEmpty(textBox1.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 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(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();//退出登录 } } /// <summary> /// 结构体转字符串 /// </summary> /// <param name="structure"></param> /// <returns></returns> private byte[] StructToBytes(object structure) { int num = Marshal.SizeOf(structure); IntPtr intPtr = Marshal.AllocHGlobal(num); byte[] result; try { Marshal.StructureToPtr(structure, intPtr, false); byte[] array = new byte[num]; Marshal.Copy(intPtr, array, 0, num); result = array; } finally { Marshal.FreeHGlobal(intPtr); } return result; } /// <summary> /// 结构体初始化赋值 /// </summary> /// <param name="data_len"></param> /// <returns></returns> private WAVE_Header getWave_Header(int data_len) { return new WAVE_Header { RIFF_ID = 1179011410, File_Size = data_len 36, RIFF_Type = 1163280727, FMT_ID = 544501094, FMT_Size = 16, FMT_Tag = 1, FMT_Channel = 1, FMT_SamplesPerSec = 16000, AvgBytesPerSec = 32000, BlockAlign = 2, BitsPerSample = 16, DATA_ID = 1635017060, DATA_Size = data_len }; } /// <summary> /// 语音音频头 /// </summary> private struct WAVE_Header { public int RIFF_ID; public int File_Size; public int RIFF_Type; public int FMT_ID; public int FMT_Size; public short FMT_Tag; public ushort FMT_Channel; public int FMT_SamplesPerSec; public int AvgBytesPerSec; public ushort BlockAlign; public ushort BitsPerSample; public int DATA_ID; public int DATA_Size; } /// 指针转字符串 /// </summary> /// <param name="p">指向非托管代码字符串的指针</param> /// <returns>返回指针指向的字符串</returns> public static string Ptr2Str(IntPtr p) { List<byte> lb = new List<byte>(); while (Marshal.ReadByte(p) != 0) { lb.Add(Marshal.ReadByte(p)); p = p 1; } byte[] bs = lb.ToArray(); return Encoding.Default.GetString(lb.ToArray()); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论