一、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/

 

 

 

posted @ 2013-05-03 20:11  武沛齐  阅读(1944)  评论(0编辑  收藏  举报