zoukankan      html  css  js  c++  java
  • 在.net中使用语音识别和语音合成技术

    .net中使用语音识别和语音合成技术,需要借助微软的Speech SDK,如果是要在Web应用程序中使用,则需要Speech Application SDK。其中Speech SDK可以在http://www.microsoft.com/speech/download/sdk51/下载,其中有两个文件Speech SDK 5.15.1 Language Pack,前者是开发包,但是其中只包含对英文的支持,后者是中文和日文的语言包,装完就能支持中文了。

     SDK组成结构

           

         演练

    1.         打开vs2005,建立一个windows application,在设计窗体中加入一个label,一个richtextbox(用于输入要读的文本),以及一个button。并分别设置的labelbuttonText属性。如下图
               

    2.         添加必要的引用,项目->添加引用->COM选择Microsoft Speech Object Library确定退出。

    3.         双击button,为其添加事件。在代码页顶端先添加命名空间,代码如

                using SpeechLib;

    4.         button的事件处理程序代码如下。
    private void button1_Click(object sender, EventArgs e)

    {
        //SpVoiceClass voice = new SpVoiceClass();//SAPI 5.1
               SpVoice voice = new SpVoice();//SAPI 5.4
               voice.Voice 
    = voice.GetVoices(string.Empty, string.Empty).Item(0); //其中3为中文,024为英文
               voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);

    }

    5.         F5运行,在空白区域输入文字,点朗读,试试效果吧。

         SpVoiceClass详解

    属性

    描述

    AlertBoundary

    取得或设置停顿分界线。

    AllowAudioOutputFormatChangesOnNextSet

    设置是否允许声音自动调整到合适状态以适应其音频输出。

    AudioOutput

    .取得或设置当前声音使用的的音频输出对象

    AudioOutputStream

    取得或设置当前声音使用的的音频输出流对象。

    EventInterests

    取得或设置当前声音返回的事件类型。

    Priority

    取得或设置声音的优先级。

    Rate

    取得或设置阅读的速度。

    Status

    返回一个ISpeechVoiceStatus 对象用于显示当前阅读和事件的状态

    SynchronousSpeakTimeout

    取得或设置一个时间间隔,用于标识多久未获得一个输出设备后,一个同步的Speak SpeakStream将终止,以毫秒计算。

    Voice

    取得或设置发音对象。

    Volume

    取得或设置声音的大小

    方法

    描述

    DisplayUI

    是否在控制面板中展示详细设置。

    GetAudioOutputs

    返回一个可用的音频输出标记。

    GetVoices

    返回一个可用的发音对象。

    IsUISupported

    决定是否能通过控制棉板的音频设置来控制。

    Pause

    暂停朗读。.

    Resume

    恢复暂停,继续播放。

    Skip

    在当前输入的文本流中向前或向后跳一定距离再播放。

    Speak

    阅读一个字符串。

    SpeakCompleteEvent

    得到一个朗读完毕的时间句柄

    SpeakStream

    朗读一个文本流或一个声音文件。

    WaitUntilDone

    阻塞进程,直到声音播放完毕或者超时。

     介绍了关于语音合成的一些基础知识,就是先j建立一个SpVoiceClass类的对象,然后调用对象的GetVoices方法取的一个发音的对象,但是通过设置该方法的参数只能建立中文发音或是英文发音的对象,而对于中英文混合的文本却没有办法。为解决这个问题,可以对字符串中的每的字符的ASC码进行判断,进而分辨传入的字符串是中文还是英文。以下是判断的代码。

    public bool Analyse(string strSpeak)
    {
         int iCbeg = 0 ;
         int iEbeg = 0 ;
         bool IsChina = true ;
        for(int i=0;i<strSpeak.Length;i++)
        {
               char chr = strSpeak[i] ;
               if (IsChina)
               {
                        if (chr<=122&&chr>=65)
                       {
                              int iLen = i - iCbeg ;
                              string strValue = 
                              strSpeak.Substring(iCbeg,iLen) ;
                              SpeakChina(strValue) ;
                              iEbeg = i ;
                              IsChina = false ;
                       }
               }
               else
               {
                      if (chr>122||chr<65)
                      {
                            int iLen = i - iEbeg ;
                            string strValue =  strSpeak.Substring(iEbeg,iLen) ;
                            this.SpeakEnglishi(strValue) ;
                            iCbeg = i ;
                            IsChina = true ;
                       }
               }
         }
    return IsChina;
    }
     

    对于Speak方法的参数,第一个是一个字符串类型,第二个是一个SpeechVoiceSpeakFlags类型的枚举。当将其设置为SVSFDefault时,则第一个就是要读的文本,若将其设置为SVSFIsFilename时,第一个参数就是所要读的文本的文件名,而不是要读的内容。
     

    下面介绍这个类的SpeakStream方法,这个方法有2个参数,第一个是SpeechBaseStream,第二和Speak一样,是一个SpeechVoiceSpeakFlags类型的枚举。SpeechBaseStream是一个接口,继承它的有3个对象,这3个都很相似,先介绍其中之一SpFileStreamSpFileStream3个比较常用的方法:Read,Seek,Write。其中Read方法可以创建一个*.wav文件,以下代码演示了创建文件的步骤:

                  SpFileStreamClass fs1 = new SpFileStreamClass();
                SpVoiceClass v = new SpVoiceClass();
                fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMCreateForWrite, false);

                //textBox1.text是要创建的文件的路径。
                v.AudioOutputStream = fs1;

                  string[] ss = new string[4] { "this", "is", "a", "demo" };

                foreach (string s in ss)
                  {
                       v.Speak(s, SpeechVoiceSpeakFlags.SVSFlagsAsync);
                  }
                fs1.Close();
     

    下面的代码将用于展示SpeakSpeakStream

                  SpFileStreamClass fs1 = new SpFileStreamClass();
                SpFileStreamClass fs2 
    = new SpFileStreamClass();
                SpVoiceClass v 
    = new SpVoiceClass();
                fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMOpenForRead, 
    false);
                fs2.Open(textBox2.Text, SpeechStreamFileMode.SSFMOpenForRead, 
    false);
                v.Speak(
    "This is the first sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
                v.SpeakStream(fs1, SpeechVoiceSpeakFlags.SVSFlagsAsync);
                v.Speak(
    "This is the second sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
                v.SpeakStream(fs2, SpeechVoiceSpeakFlags.SVSFlagsAsync);
                fs1.Close();
                fs2.Close();

    转(http://blog.csdn.net/solond/article/details/2159449

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/softimagewht/p/2427984.html
Copyright © 2011-2022 走看看