碧空雪狐

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.net中语音识别和语音合成(一)入门篇   

 

   http://www.cnblogs.com/likaincu/articles/440997.html

 准备

在.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的事件处理程序代码如下。
       

.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客        private void button1_Click(object sender, EventArgs e)
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客        .net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客{
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客            SpVoiceClass voice = new SpVoiceClass(); 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); //其中3为中文,024为英文
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客            voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客        }

 

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

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



.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客
   但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出。
SpVoiceClass 类的Voice 属性就是用来设置语种的,我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表,
然后在根据参数选择相应的语种,比如设置语种为汉语如下所示:
private void SetChinaVoice() 

  voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; 
}
   0表示是汉用,1234都表示英语,就是口音不同。
   这样,我们就设置了语种,如果结合发音方法,我们就可以设计出一个只发汉语语音的方法
private void SpeakChina(string strSpeak) 

  SetChinaVoice() ; 
  Speak(strSpeak) ; 

   只发英语语音的方法也是类似的,上面程序里有。
   对于一段中英文混合的语言,我们让程序读出混合语音的方法就是:编程把这段语言的中英文分开,对于
中文调用SpeakChina方法,英文调用SpeakEnglishi方法;至于怎样判断一个字符是英文还是中文,我采用的是判断
asc码的方法,具体的类方法是通过AnalyseSpeak实现的。
   这样,对于一段中英文混合文字,我们只需把它作为参数传递给AnalyseSpeak就可以了,他能够完成中英文
的混合发音。
   当然,对于发音的暂定、继续、停止等操作,上面也给出了简单的方法调用,很容易明白。
   下面简单介绍一下中文语音识别的方法:
   先把该语音识别的类源代码贴在下面,然后再做说明:
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客public class SpRecognition 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  private static SpRecognition _Instance = null ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  private SpeechLib.ISpeechRecoGrammar isrg ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  private SpeechLib.SpSharedRecoContextClass ssrContex =null; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  private System.Windows.Forms.Control cDisplay ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  private SpRecognition() 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  .net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   ssrContex = new SpSharedRecoContextClass() ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   isrg = ssrContex.CreateGrammar(1) ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle = new _ISpeech
RecoContextEvents_RecognitionEventHandler(ContexRecognition) ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   ssrContex.Recognition += recHandle ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  } 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  public void BeginRec(Control tbResult) 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  .net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   isrg.DictationSetState(SpeechRuleState.SGDSActive) ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   cDisplay = tbResult ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  } 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  public static SpRecognition instance() 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  .net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客   if (_Instance == null) 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客    _Instance = new SpRecognition() ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客    return _Instance ; 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  } 
.net中语音识别和语音合成(一)入门篇  - sandbox - 我的博客  public void CloseRec() 

 

 

http://www.cnblogs.com/likaincu/articles/441000.html

posted on 2011-11-25 14:30  碧空雪狐  阅读(668)  评论(0编辑  收藏  举报