基本信息
源码名称:C# 语音播报 自定义文本内容(基于msc.dll)
源码大小:1.75M
文件格式:.rar
开发语言:C#
更新时间:2019-11-14
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
自动朗读文本内容并生成wav声音文件
自动朗读文本内容并生成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()); } } }