一、前言
網上很多程序都可以閱讀英文和中文,典型的就是金山詞霸,最近找了一下,發現網上在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:[email protected]
本文配套源碼