zoukankan      html  css  js  c++  java
  • 一、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/

  • 相关阅读:
    arc路径例子-磊哥
    使用路径arc-奥运五环
    arc路径-磊哥
    使用路径arc-七彩
    html5- 摘自网友dudu
    使用路径arc
    textBaseline
    html5-磊哥
    【洛谷1345】 [USACO5.4]奶牛的电信(最小割)
    【洛谷1231】 教辅的组成(网络流)
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/3057443.html
Copyright © 2011-2022 走看看