一、Text To Speech
站在巨人的肩膀上,这里我将做一下整理,也是对自己所学的总结。
本节介绍 文字 to 语音 包含两部分:
1、微软是实现TTS
2、微软将声音保存为语音文件
3、利用Google翻译实现TTS
微软TTS
微软的SAPI(Speech Application Programming Interface)提供了强大的Text To Speech接口,而且支持自动化。
通过微软的SAPI,可以实现TTS(Text to Speech),即“从文本到语音”,是人机对话的一部分,让机器能够说话。
使用方式:
使用COM组件技术实现TTS---注意:Xp需要安装Microsoft Speech SDK Version 5.1,先安装SDK再安装语言包。
下面我们就来用几句代码来实现TTS的功能
COM组件技术
添加引用:在COM选项卡里面,添加Microsoft Speech object library的引用
在代码区添加 Using SpeechLib
private void btnRead_Click(object sender, EventArgs e) { string strContent = txtContent.Text.Trim(); SpeechVoiceSpeakFlags Speak = SpeechVoiceSpeakFlags.SVSFlagsAsync ; SpVoice voice = new SpVoice(); voice.Speak(strContent, Speak); }
如此简单就可以实现了TTS。但是,这种方式只能利用默认的声音。即:控制面板--语音识别--文本到语音转换(我Win7是Lili Chinese的声音)
实现多语音的画,网上查阅如此即可。但是在我Win7本机上用vs2010米有作用,我觉得应该是没有安装其他语音包的缘故,稍后再试
SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice voice = new SpVoice(); voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); //Item(0)单词男声Sam //Item(1)单词男声Mike //Item(2)单词女声Mary //Item(3)中文发音,如果是英文,就依单词字母一个一个发音 voice.Speak(textBox1.Text, flag);
既然晓得了如何简单的用,再稍稍去了解下其如何实现的呢?
1、SpeechVoiceSpeakFlags是一个枚举类型
//这里的枚举都是什么意思呢? public enum SpeechVoiceSpeakFlags { SVSFUnusedFlags = -512, SVSFDefault = 0, SVSFParseAutodetect = 0, SVSFlagsAsync = 1, SVSFPurgeBeforeSpeak = 2, SVSFIsFilename = 4, SVSFIsXML = 8, SVSFIsNotXML = 16, SVSFPersistXML = 32, SVSFNLPMask = 64, SVSFNLPSpeakPunc = 64, SVSFParseSapi = 128, SVSFParseSsml = 256, SVSFParseMask = 384, SVSFVoiceMask = 511, }
2、SpVoice是一个接口,但是....
namespace SpeechLib { [CoClass(typeof(SpVoiceClass))] //CoClass是组件类 [Guid("269316D8-57BD-11D2-9EEE-00C04F797396")] public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event { } }
如果上例子中对SpVoiceClass实例化时,就会报错无法嵌入互操作类型“SpeechLib.SpVoiceClass”。请改用适用的接口。这是为什么呢?
[CoClass(typeof(SpVoiceClass))] 应该是让SpVoice和SpVoiceClass建立了某种关系吧,因为上面调用的voice.Voice和voice.GetVoice以及voice.Speak都是SpVoiceClass的成员,暂且先介个样子理解,学习CoClass之后再做更正吧!!!!
--COM coclass 在 C# 中表示为具有无参数构造函数的类。
--MSDN解释:http://msdn.microsoft.com/zh-cn/library/aa288455(v=vs.71).aspx
SpVoiceClass类
namespace SpeechLib { [ComSourceInterfaces("SpeechLib._ISpeechVoiceEvents")] [TypeLibType(2)] [ClassInterface(0)] [Guid("96749377-3391-11D2-9EE3-00C04F797396")] public class SpVoiceClass : ISpeechVoice, SpVoice, _ISpeechVoiceEvents_Event, ISpVoice, ISpPhoneticAlphabetSelection { //这里只列举了部分的成员
public SpVoiceClass(); [DispId(5)] public virtual int Rate { get; set; } [DispId(6)] public virtual int Volume { get; set; } [DispId(18)] public virtual void GetRate(out int pRateAdjust); public virtual void GetVoice(out ISpObjectToken ppToken); [DispId(14)] public virtual void Pause(); [DispId(15)] public virtual void Resume(); public virtual void SetVolume(ushort usVolume); [DispId(12)] public virtual int Speak(string Text, SpeechVoiceSpeakFlags Flags = SpeechVoiceSpeakFlags.SVSFDefault); public virtual void Speak(string pwcs, uint dwFlags, out uint pulStreamNumber); } }
此处只是列举出了部分成员,简单介绍下其中某些成员的作用!
pause/Resume 暂停/继续
SetVoice/GetVoice 设置声音
SetRate 设置读取速度
SetVolume/GetVolume 声音大小
...
...
-------遗留问题:DispId和ComSourceInterfaces等都是什么意思?
将声音保存为语音文件
SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync; SpVoice voice = new SpVoice(); voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite; SpFileStream SpFileStream = new SpFileStream(); SpFileStream.Open(@"C:\test.wav", SpFileMode, false); voice.AudioOutputStream = SpFileStream;//设定voice的输出为Stream voice.Speak(textBox1.Text.Trim(), flag); voice.WaitUntilDone(Timeout.Infinite);//Using System.Threading; SpFileStream.Close();
利用谷歌翻译来实现TTS
谷歌翻译有朗读的功能
根据朗读时浏览器的请求,得到其请求URL
中文发音:
http://translate.google.cn/translate_tts?ie=UTF-8&q=%E6%B2%B3%E5%8C%97%E5%A4%A7%E5%AD%A6&tl=zh-CN&total=1&idx=0&textlen=4&prev=input
英文发音:
http://translate.google.cn/translate_tts?ie=UTF-8&q=Hebei%20University&tl=en&total=1&idx=0&textlen=16
分析请求的URL:
ie 编码方式
q 要朗读的关键字
&tl 语言
total ???
idex ???
textlen 应该关键字长度
prev ???
还有其他方式和可以实现C#播放声音
1、利用DirectX
2、MS的COM组件
3、引用SoundPlayer
4、利用Windows Media Player
详细见:http://www.soaspx.com/dotnet/csharp/csharp_20090922_407.html
补充:今天在C#Coner看见一篇文章(含实例),也是有关TTS的,写得非常好,个人非常喜欢!
http://www.c-sharpcorner.com/uploadfile/mahesh/programming-speech-in-wpf-speech-synthesis/