在.net中使用语音识别和语音合成技术

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

      SDK组成结构

       

     演练

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


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

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

using SpeechLib;

 

4.         button的事件处理程序代码如下。
       

        private void button1_Click(object sender, EventArgs e)
        {
            SpVoiceClass voice = new SpVoiceClass();
            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); //其中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码进行判断,进而分辨传入的字符串是中文还是英文。以下是判断的代码。
    1 public bool Analyse(string strSpeak)
 2         {
 3              int iCbeg = 0 ;
 4              int iEbeg = 0 ;
 5              bool IsChina = true ;
 6              for(int i=0;i<strSpeak.Length;i++)
 7              {
 8                   char chr = strSpeak[i] ;
 9                   if (IsChina)
10                   {
11                       if (chr<=122&&chr>=65)
12                       {
13                            int iLen = i - iCbeg ;
14           string strValue =
15strSpeak.Substring(iCbeg,iLen) ;
16                            SpeakChina(strValue) ;
17                            iEbeg = i ;
18                            IsChina = false ;
19                       }
20                   }
21                   else
22                   {
23                       if (chr>122||chr<65)
24                       {
25                            int iLen = i - iEbeg ;
26                            string strValue =
27strSpeak.Substring(iEbeg,iLen) ;
28                            this.SpeakEnglishi(strValue) ;
29                            iCbeg = i ;
30                            IsChina = true ;
31                       }
32                   }
33              }
34   return IsChina;
35} 
对于Speak方法的参数,第一个是一个字符串类型,第二个是一个SpeechVoiceSpeakFlags类型的枚举。当将其设置为SVSFDefault时,则第一个就是要读的文本,若将其设置为SVSFIsFilename时,第一个参数就是所要读的文本的文件名,而不是要读的内容。
 

下面介绍这个类的SpeakStream方法,这个方法有2个参数,第一个是SpeechBaseStream,第二和Speak一样,是一个SpeechVoiceSpeakFlags类型的枚举。SpeechBaseStream是一个接口,继承它的有3个对象,这3个都很相似,先介绍其中之一SpFileStream。SpFileStream有3个比较常用的方法: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(); 
下面的代码将用于展示Speak与SpeakStream:

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.youkuaiyun.com/solond/archive/2008/03/09/2159449.aspx

转载于:https://www.cnblogs.com/vhtt/archive/2010/01/07/1641266.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值