基于Speech SDK开发中英文混合朗读程序
2020-06-19 11:33
232 查看
钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>
摘 要 中英文混合朗读一直是个难点,本文在分析Microsoft Speech SDK中英文引擎的基础上,提出了根据文本类型实时切换中英文引擎的方法,在Visual C++6.0中实现了一个示例程序。 关键词 Speech SDK;中英文混合朗读;Visual C++1 Speech SDK简介
语音识别(SR)和语音合成(TTS)一直是计算机应用的热点,如果你想在Windows平台上开发具有语音识别和语音合成功能的应用程序,使用Microsoft Speech SDK是较好的选择。现在许多应用程序的语音识别和语音合成部分,例如金山词霸,就是在此基础上开发的。 Microsoft Speech SDK是微软公司推出的支持语音应用程序开发的工具包,其最新版本是5.1,可以在微软的网站免费下载,如果要支持中文,还要下载相应的Language Pack。下载后先安装Speech SDK,再安装简体中文语言包,这样你的计算机就具有中英文语音能力了。 下面介绍在Visual C++6.0中如何利用Speech SDK开发中英文全文朗读的程序。2 SpVoice类介绍
SpVoice类是支持语音合成(TTS)的核心类。通过SpVoice对象调用TTS引擎,从而实现朗读功能。 SpVoice类有以下主要属性: Voice:表示发音类型,相当于进行朗读的人,包括Microsoft Mary,Microsoft Mike,Microsoft Sam和Microsoft Simplified Chinese四种。其中前三种只能读英文,最后一种可以读中文,也可以读英文,但对于英文单词只能将其包括的各个字母逐一朗读出来。下面的程序中我们将会想办法解决这个问题。 Rate:语音朗读速度,取值范围为-10到+10。数值越大,速度越快。 Volume:音量,取值范围为0到100。数值越大,音量越大。 SpVoice有以下主要方法: Speak:完成将文本信息转换为语音并按照指定的参数进行朗读,该方法有Text和Flags两个参数,分别指定要朗读的文本和朗读方式(同步或异步等)。 Pause:暂停使用该对象的所有朗读进程。该方法没有参数。 Resume:恢复该对象所对应的被暂停的朗读进程。该方法没有参数。3 建立工程并导入类型库
建立一个名字为mytts的MFC AppWizard(exe) 工程,在step1里面选择Dialog Based,在step2里面把Automation选项勾上。 其它的选默认值。 查找 spai.dll,将其拷贝到工程的res 目录,打开 MFC ClassWizard,选择 Automation 页,单击按钮"Add Class…",选择"From a type library…",选中"sapi.dll"文件,这时系统会出现 confirm Classes 对话框,询问将要导入的类,我们全部选中。4 增加控件
给对话框IDD_MYTTS_DIALOG增加控件,结果如图1所示。 图1 程序界面5 编写代码
这里只说明关键的代码,完整代码可参考源文件。 1) 对话框的初始化 这里主要完成语音对象的速度,音量等基本参数的设置。 BOOL CMyttsDlg::OnInitDialog() { …… CLSIDFromProgID(L"SAPI.SpVoice",&CLSID_ SpVoice); voice.CreateDispatch(CLSID_SpVoice); //创建一个对象 pDisp = voice.m_lpDispatch; HRESULT hr = pDisp->QueryInterface(CLSID_SpVoice,(void**)&voice.m_lpDispatch); if (hr == S_OK) { pDisp->Release();} else { voice.AttachDispatch(pDisp,TRUE);} //关联对象与接口 voice.SetRate(0);//设置速度 voice.SetVolume(100);//设置音量 voiceList=voice.GetVoices(NULL,NULL); //读取语音列表: …… m_Text="你好How are you";//设置要阅读的初始文本 UpdateData(FALSE); …… } 2) 阅读按钮的代码 这部分代码是本程序的核心,主要解决的问题是实现中英文引擎的实时切换。实现方法是这样:依次处理文本中的每个字符,判断该字符的中英文类型,若其类型与前面的字符一致,继续处理后面的字符。直到发现一个字符与前面字符的类型不一致时,将前面的字符读出来(当然要根据字符类型设置相应的引擎),然后再处理后面的字符。具体代码如下: void CMyttsDlg::OnBtnRead() { long i,len; char curr; CString str; int flagPre,flagCur; int icnt,first; UpdateData(TRUE); len=m_Text.GetLength(); flagPre=iChn;icnt=0;first=0; for (i=0;i<len;i++) { curr=m_Text.GetAt(i); if (curr==' ') flagCur=flagPre;//如果是空格,标志不变 else { if ((curr>='A' && curr<='Z') || (curr>='a' && curr<='z')) flagCur=iEng;//如果是英文字母,标志设为0 else flagCur=iChn;//否则标志设为3 } if (flagCur==flagPre) icnt++; else { if (icnt!=0) //字符类型变化,读出前面的文本 { voice.SetRefVoice(voiceList.Item(flagPre)); str=m_Text.Mid(first,icnt); voice.Speak(str,1); } flagPre=flagCur;first=i;icnt=1; } } //读出最后一段文本 voice.SetRefVoice(voiceList.Item(flagPre)); str=m_Text.Mid(first,icnt); voice.Speak(str,1); }6 总结
本文给出了一种根据文本类型实时切换Microsoft Speech SDK的中英文引擎的方法,程序在Windows 2000和Visual C++6.0环境中调试通过。读者可以在此基础上添加其它功能。参考文献
[1] 毕晓君,静广宇,徐先锋.利用TTS技术实现文本文件的语音合成[J].自动化技术与应用,2004,23(9):49-51 [2] 徐雨明.在VFP中调用MSTTS技术实现英文语音输出的方法[J].电脑编程技巧与维护,2001(1):17,24 [3] 陈再良,沈海澜.基于MSTTS英文朗读功能的实现[J].计算机时代,2002(4):34-35相关文章推荐
- 基于Speech SDK开发中英文混合朗读程序
- 针对辽宁联通09年短信竞赛开发的基于VB.NET C#.NET 混合模式的短信群发程序
- 基于。NET的模块化网络服务应用程序服务器开发 第一章
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序
- Linux网络编程:基于UDP的程序开发回顾篇
- 基于Java SpringBoot的微信校园二手交易小程序平台开发系列(一)
- Matlab开发教程|基于Matlab的几个扬声器开发程序
- 基于mpvue开发微信小程序,vue能用的,用mpvue哪些情况不能用
- OS X上基于OpenMP进行并行程序开发
- Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法
- 在Windows平台上基于虚拟机开发iPhone程序
- Spark API编程动手实战-08-基于IDEA使用Spark API开发Spark程序-01
- VC和LUA混合开发之VC程序调用Lua脚本函数
- 基于Xcode4开发第一个iPhone程序:“Hello World” [转自:宝玉]
- 基于pygame的象棋游戏一:搭建程序开发环境
- Android蓝牙聊天程序的扩展开发(基于Google Sample,类QQ设计)
- Mahout分步式程序开发 基于物品的协同过滤ItemCF
- 使用Eclipse基于Maven使用Java开发WordCount程序项目
- 《基于Windows 7特性的程序开发系列》视频分享
- 基于微信小程序的系统开发准备工作