测试TTS(文本到语音功能)
2015-12-08 10:43
525 查看
由于要求程序在windows 2003 server这种低版本系统上运行,所以用了MS Speech SDK 51,质量差点,但是也够用了.
第一部份:如何调用
第二部份:我封装的代码
注意:
[1]如果要在Win2003上运行上面的代码,SpVoice实例的生命期必须是在函数体内的,如果像上面的代码一样生命期是在Class实例内,会抛出异常.
[2]上面的代码在Win7SP1下测试通过.
第一部份:如何调用
private void btnTestTTS_Click(object sender, RoutedEventArgs e) { //_spVoice.SpeakXml("This sounds normal <pitch middle = '-10'/> but the pitch drops half way through"); _spVoice.SpeakXml("<rate absspeed=\"1\"/>,<rate speed=\"1\"/><pitch absmiddle=\"2\"/><pitch middle=\"5\"/>你的验证码是<spell>1432</spell>"); } private void btnTestTTS2Wave_Click(object sender, RoutedEventArgs e) { _spVoice.Save("<rate absspeed=\"1\"/>,<rate speed=\"1\"/><pitch absmiddle=\"2\"/><pitch middle=\"5\"/>你的验证码是<spell>1432</spell>", "e:\\temp.wav", "e:\\a.wav"); }
第二部份:我封装的代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SpeechLib; using System.Threading; using System.Diagnostics; using NAudio.Wave; using NAudio.Wave.SampleProviders; namespace WpfApplicationTestTTS { /* * Title:测试TTS(文本到语音功能) * Author:Kagula * Date:2015-12-08 * Environment:VS2010SP1、SpeechSDK51、Win7SP1、Win2003 * SpeechSDK51LangPack(用于支持中文) * .NetFramework 4.0 Client Profile. * Reference: * 《关于Microsoft Speech SDK 中TTS的研究 [转] 》 * http://www.cnblogs.com/lxinxuan/archive/2007/03/17/678606.html * */ internal class SpVoiceClass { SpVoice voice = new SpVoice(); //直接在Speak上播放 internal void SpeakXml(string xml) { voice.Speak(xml, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync); } //保存音频到wav文件 internal void Save(string xml, string tempFileName, string fileName) { SpFileStream stream = new SpFileStream(); stream.Open(tempFileName, SpeechStreamFileMode.SSFMCreateForWrite, false); voice.AudioOutputStream = stream; voice.Speak(xml, SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFIsXML); voice.WaitUntilDone(Timeout.Infinite); stream.Close(); //输出文件默认采样率为22khz,16bit精度,单声道,所以这里要转换为8khz的音频. //用到了NAudio第三方库,下载地址为http://naudio.codeplex.com/ //下载后会发现两个dll,只需引入NAudio.dll. using (var reader = new AudioFileReader(tempFileName)) { var resampler = new WdlResamplingSampleProvider(reader, 8000); WaveFileWriter.CreateWaveFile16(fileName, resampler); } //经测试,2秒时长的audio可以从88k size减少到32k size. } } }
注意:
[1]如果要在Win2003上运行上面的代码,SpVoice实例的生命期必须是在函数体内的,如果像上面的代码一样生命期是在Class实例内,会抛出异常.
[2]上面的代码在Win7SP1下测试通过.
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总
- C#简单的向量用法实例教程