.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,为其添加事件。在代码页顶端先添加命名空间,代码如:
4. button的事件处理程序代码如下。
{
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 | 阻塞进程,直到声音播放完毕或者超时。. |
但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出。
SpVoiceClass 类的Voice 属性就是用来设置语种的,我们可以通过SpVoiceClass 的GetVoices方法得到所有的语种列表,
然后在根据参数选择相应的语种,比如设置语种为汉语如下所示:
{
voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ;
}
{
SetChinaVoice() ;
Speak(strSpeak) ;
}
只发英语语音的方法也是类似的,上面程序里有。
中文调用SpeakChina方法,英文调用SpeakEnglishi方法;至于怎样判断一个字符是英文还是中文,我采用的是判断
asc码的方法,具体的类方法是通过AnalyseSpeak实现的。
的混合发音。
{
private static SpRecognition _Instance = null ;
private SpeechLib.ISpeechRecoGrammar isrg ;
private SpeechLib.SpSharedRecoContextClass ssrContex =null;
private System.Windows.Forms.Control cDisplay ;
private SpRecognition()
{
ssrContex = new SpSharedRecoContextClass() ;
isrg = ssrContex.CreateGrammar(1) ;
SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle = new _ISpeech
RecoContextEvents_RecognitionEventHandler(ContexRecognition) ;
ssrContex.Recognition += recHandle ;
}
public void BeginRec(Control tbResult)
{
isrg.DictationSetState(SpeechRuleState.SGDSActive) ;
cDisplay = tbResult ;
}
public static SpRecognition instance()
{
if (_Instance == null)
_Instance = new SpRecognition() ;
return _Instance ;
}
public void CloseRec()