语音合成与识别技术在C#中的应用 (转 )
我们要想实现中文发音或中文语音识别,必需先安装微软的Speech Application SDK(SASDK),它的最新版本是 SAPI 5.1 他能够识别中、日、英三种语言,你可以在这里下载:http://www.microsoft.com/speech/download/sdk51/,需要安装这两个文件Speech SDK 5.1和5.1 Language Pack,其中5.1 Language Pack可以选择安装支持的语言。 安装好以后,我们就可以开始进行语音程序的开发了。
下面我们设计一个能够朗读中英文混合语言的类:
我们将用单例模式实现该类,类的代码如下,我们将详细解释:
public class Speach
{ private static Speach _Instance = null ; private SpeechLib.SpVoiceClass voice =null; private Speach() { BuildSpeach() ; } public static Speach instance() { if (_Instance == null) _Instance = new Speach() ; return _Instance ; } private void SetChinaVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; } private void SetEnglishVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ; } private void SpeakChina(string strSpeak) { SetChinaVoice() ; Speak(strSpeak) ; } private void SpeakEnglishi(string strSpeak) { SetEnglishVoice() ; Speak(strSpeak) ; } public void AnalyseSpeak(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 ; } } }//end for if (IsChina) { int iLen = strSpeak.Length - iCbeg ; string strValue = strSpeak.Substring(iCbeg,iLen) ; SpeakChina(strValue) ; } else { int iLen = strSpeak.Length - iEbeg ; string strValue = strSpeak.Substring(iEbeg,iLen) ; SpeakEnglishi(strValue) ; } } private void BuildSpeach() { if (voice == null) voice = new SpVoiceClass() ; } public int Volume { get { return voice.Volume ; } set { voice.SetVolume((ushort)(value)) ; } } public int Rate { get { return voice.Rate ; } set { voice.SetRate(value) ; } } private void Speak(string strSpeack) { try { voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; } catch(Exception err) { throw(new Exception("发生一个错误:"+err.Message)) ; } } public void Stop() { voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ; } public void Pause() { voice.Pause() ; } public void Continue() { voice.Resume() ; } }//end class |
在 private SpeechLib.SpVoiceClass voice =null;这里,我们定义个一个用来发音的类,并且在第一次调用该类时,对它用BuildSpeach方法进行了初始化。
我们还定义了两个属性Volume和Rate,能够设置音量和语速。
我们知道,SpVoiceClass 有一个Speak方法,我们发音主要就是给他传递一个字符串,它负责读出该字符串,如下所示。
private void Speak(string strSpeack)
{ try { voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ; } catch(Exception err) { throw(new Exception("发生一个错误:"+err.Message)) ; } } |
其中SpeechVoiceSpeakFlags.SVSFlagsAsync表示异步发音。
但是,这个方法本身并不知道你给的字符串是什么语言,
所以需要我们它这个字符串用什么语言读出。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 _ISpeechRecoContextEvents_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() { isrg.DictationSetState(SpeechRuleState.SGDSInactive) ; } private void ContexRecognition(int iIndex,object obj,SpeechLib.SpeechRecognitionType type,SpeechLib.ISpeechRecoResult result) { cDisplay.Text += result.PhraseInfo.GetText(0,-1,true) ; } } |
我们定义了ssrContex 和isrg为语音识别的上下文和语法,通过设置isrg的DictationSetState方法,我们可以开始或结束识别,在上面的程序中是BeginRec和CloseRec方法。cDisplay 是我们用来输出识别结果的地方,为了能够在大部分控件上都可以显示结果,我用了一个Control 类来定义它。当然,每次语音识别后都会触发ISpeechRecoContextEvents_RecognitionEventHandler 事件,我们定义了一个这样的方法ContexRecognition来响应事件,并且在这个方法里输出识别结果。
转载于:https://www.cnblogs.com/yanbinboy/archive/2008/10/30/1322792.html
语音合成与识别技术在C#中的应用 (转 )相关推荐
- OCR识别技术在行业中的应用
OCR识别一般是指OCR图像文字识别技术,经过多年的发展,OCR识别技术累积了大量经验,逐渐推出了针对不同行业的OCR识别接口,识别的精度更加准确.速度更快.支持在多种平台运用,满足了不同行业信息录入 ...
- 网络不良视频内容识别技术初探
网络不良视频内容识别技术初探 网络中的图片.视频及音频等多媒体信息具有内容丰富.感观性强等特点,已经逐渐成为不良信息在互联网上传播所采取的主要方式之一.网络中不良多媒体信息的数量与日俱增,所造成的文化 ...
- 声扬科技声纹识别技术,为工商银行构建多模态反欺诈能力
中国工商银行(INDUSTRIAL AND COMMERCIAL BANK OF CHINA,简称ICBC ,工行)成立于1984年,是中央管理的大型国有银行,国家副部级单位.工商银行是中国资产规模最 ...
- 上市公司虚假会计报表识别技术(珍藏版)
<上市公司虚假会计报表识别技术(珍藏版)> 基本信息 作者: 刘姝威 丛书名: 名家财务经典 出版社:机械工业出版社 ISBN:9787111428244 上架时间:2013-6-20 出 ...
- 商汤科技3D人脸识别技术加持智能门锁,帮你解放双手
刚刚过去的元旦佳节,很多人选择聚餐聚会,共同迎接新年的到来,或是跟恋人一起度过浪漫的跨年夜. 在外有欢声笑语的氛围,回到家也应该有舒适的惬意.若是来到家门口,还要放下拎着的大包小包年货,腾出手来去掏钥 ...
- 多模态人物识别技术及其在爱奇艺视频场景中的应用 | 公开课笔记
[12月公开课预告],入群直接获取报名地址 12月11日晚8点直播主题:人工智能消化道病理辅助诊断平台--从方法到落地 12月12日晚8点直播:利用容器技术打造AI公司技术中台 12月17日晚8点直播 ...
- 多模态人物识别技术及其在视频场景中的应用 | CSDN技术公开课
不用倍速播放,还有什么功能可以让你高效追剧? 爱奇艺的「只看TA」了解一下?而这个功能背后离不开多模态人物识别技术的支撑. 识别视频中的人物涉及哪些信息?只有人脸识别就足够了吗?其实不然,这样一个看似 ...
- 文字识别技术在内容安全中的应用
导读:文字在日常生活中发挥着重要的作用,甚至在考古发现中文字也作为识别文明的重要标志.特别是在当前短视频和内容爆炸的时代,文字广泛应用于人们观点的表达和传播以及商品营销等各个领域.这些内容中肯定会存在 ...
- 物联网生物识别技术在工作场所中发挥更大作用
组织可以使用生物识别技术通过传感器和监视来提高工作场所的安全性和员工安全性,但雇主还必须评估其潜在影响. 随着健康和安全问题成为每个企业未来的核心,人们将发现一个新的数字接口:他们的身体. 生物识别交 ...
最新文章
- 谈谈Android重打包--初语
- 2010年12月blog汇总:敏捷个人
- linux 内存交换参数,Ubuntu Linux:处理交换内存和内存使用情况
- centos部署mysql5.6免安装版
- MyEclipse部署Web项目Servers报错:NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment
- npm和yarn的区别,我们该如何选择?
- STL源码剖析 序列式容器 deque双端队列
- Vue_案例_初始化显示_采用组件化编写页面_实现组件间通信---vue工作笔记0022
- H5 游戏 俄罗斯方块 双人互动游戏
- 华中师范大学计算机专硕和学硕,学硕?专硕?该如何选
- 程序员增加收入实用指南,基于android的app开发平台综述
- Microsoft Office Home and Student 2007 密匙
- pthread_cond_signal与pthread_cond_broadcast的使用区别
- Scrum立会报告+燃尽图(Beta阶段第三次)
- 鱼缸里一条贪吃的鱼跳缸了
- 20条职场潜规则!小心那些城府很深的人(建议收藏)
- 数据结构—— 一元多项式的加法运算
- AutoGPT:自主完成任务工具
- bash脚本中的if else
- 2019财年:TUV莱茵保持稳定增长
热门文章
- TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化
- LeetCode 1619. 删除某些元素后的数组均值
- LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)
- 南通大学python期末考试试卷答案_南通大学2015-2016年1学期《软工》作业点评总结...
- mqtt如何判断设备离线_反渗透纯水设备膜元件如何离线清洗?
- Python 中操作 MySQL 步骤
- java权限框架_Java高级工程师必备技术栈-由浅入深掌握Shiro权限框架
- 深度学习,路在何方?
- spring-boot-starter-swagger 1.3.0.RELEASE:新增对JSR-303的支持和host的配置
- 最强京东Java面试题(共现场4面)