在Visual C++6.0中使用Text-to-Speech
2006-07-22 22:02:05 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

本文示例源代码或素材下载
一、前言
网上很多程序都可以阅读英文和中文,典型的就是金山词霸,最近找了一下,发现网上在VC这方面的资料不是很多,好些程序都是基于API的(比如VCKBASE ::首页 >> 文档中心 >> 在线杂志 >> 音频技术 中的文章"文本语音转换入门"作者:Suyu),加之我在 VCKBASE 获益良多,现在想回报一二,所以就写了个基于MFC的程序,希望抛砖引玉,请高手指点。
二、安装TTS引擎
要使用TTS必须安装微软的TTS引擎,这点Suyu已经说明了,作为用户需要下载两个文件MSTTS.EXE和SPCHAPI.EXE,如果需要阅读中文,还需要下载中文发音包SimpChinese Speech Package。这三个软件都可以在微软主页上找到,如果您发布程序,则需要将其打包在一起。作为程序员,您可以去微软主页下载Microsoft Speech SDK, version 5.1,顺便把中文和日文的语言包SpeechSDK51LangPack.exe下载回来。
三、建立程序项目
- 1. 建立一个MFC AppWizard(exe)
- 2. 在step1里面选择Dialog Based
- 3. 在step2里面把Automation选项勾上(必需这么做)
- 4. 结束
四、导入类型库
查找 spai.dll,将其拷贝到你程序的 res 目录(不拷贝也行 ^_^),打开 MFC ClassWizard,选择 Automation 页,单击按钮"Add Class…",选择"From a type library…",选中"sapi.dll"文件,这时系统会出现 confirm Classes 对话框,询问将要导入的类,呵呵,反正闲着也是闲着,全选中吧。到此,准备工作全部完成。
五、示例程序
我写了个演示程序,界面如下:

单击"Speak English"将女声读出"apple",单击"Speak Chinese"将男声读出"苹果",
单击"English"和"Chinese"在下面的Input Text框里面分别将出现英文和中文,单击"Read"即可读出,单击"Stop"即可停止阅读。"Rate"表示阅读速度,"+"、"-"可以改变;"Volume"表示音量大小,"+"、"-"可以改变。"Voice"列出了系统当前有的声音,但是,实际上我的计算机只能阅读四种,我列在了右边"Mary,Mike,Sam,Chinese",关于这点,原因未知,请高手赐教。要注意的是,如果输入中文,要首先在Voice里面选择chinese后才能正确发声,读英文时也要选择非中文才可以。
发声的关键代码为:
CLSID CLSID_SpVoice; // class ID for the SAPI SpVoice object
LPDISPATCH pDisp; // dispatch interface for the class
ISpeechVoice voice; // use the MFC Class Wizard generated wrapper
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.Speak("Hello World", 1); // asynchronous call to Speak method of ISpeechVoice interface
我的程序大家详见代码。
六、抛砖引玉
我现在有几个问题希望和大家一起讨论,请高手不吝赐教。
- 1. 如何调节语调。声音之所以有Mary和Sam的 区别,实际上是语调不同。
- 2. 阅读时语音和文本同步,即读到哪个单词就把哪个单词高亮显示。
- 3. 如何把 Windows 上的 TTS 移植到 PocketPC 上面。这个问题是我最为关心的,如果有高人知道,小生有礼再有礼,一定告诉我啊,谢谢谢谢再谢谢。
小生的 Email:skysoft_z@sina.com
更多精彩
赞助商链接