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


        
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


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





  
但是,这个方法本身并不知道你给的字符串是什么语言,所以需要我们它这个字符串用什么语言读出。
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就可以了,他能够完成中英文
的混合发音。

  
当然,对于发音的暂定、继续、停止等操作,上面也给出了简单的方法调用,很容易明白。

   下面简单介绍一下中文语音识别的方法:

   先把该语音识别的类源代码贴在下面,然后再做说明:
public
class SpRecognition
{
 
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()



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

posted @   thinksea  阅读(1999)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示