我們都使用過(guò)一些某某詞霸的英語(yǔ)學(xué)習工具軟件,它們大多都有朗讀的功能,其實(shí)這就是利用的Windows的TTS(Text To Speech)語(yǔ)音引擎。它包含在Windows Speech SDK開(kāi)發(fā)包中。我們也可以使用此開(kāi)發(fā)包根據自己的需要開(kāi)發(fā)程序。雞啄米下面對TTS功能的軟件開(kāi)發(fā)過(guò)程進(jìn)行詳細介紹。
一.SAPI SDK的介紹
SAPI,全稱(chēng)是The Microsoft Speech API。就是微軟的語(yǔ)音API。由Windows Speech SDK提供。
Windows Speech SDK包含語(yǔ)音識別SR引擎和語(yǔ)音合成SS引擎兩種語(yǔ)音引擎。語(yǔ)音識別引擎用于識別語(yǔ)音命令,調用接口完成某個(gè)功能,實(shí)現語(yǔ)音控制。語(yǔ)音合成引擎用于將文字轉換成語(yǔ)音輸出。
SAPI包括以下幾類(lèi)接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API和Audio Objects API。我們要實(shí)現語(yǔ)音合成需要的是Voice Text API。
目前最常用的Windows Speech SDK版本有三種:5.1、5.3和5.4。
Windows Speech SDK 5.1版本支持xp系統和server 2003系統,需要下載安裝。XP系統默認只帶了個(gè)Microsoft Sam英文男聲語(yǔ)音庫,想要中文引擎就需要安裝Windows Speech SDK 5.1。
Windows Speech SDK 5.3版本支持Vista系統和Server 2008系統,已經(jīng)集成到系統里。Vista和Server 2003默認帶Microsoft lili中文女聲語(yǔ)音庫和Microsoft Anna英文女聲語(yǔ)音庫。
Windows Speech SDK 5.4版本支持Windows7系統,也已經(jīng)集成到系統里,不需要下載安裝。Win7系統同樣帶了Microsoft lili中文女聲語(yǔ)音庫和Microsoft Anna英文女聲語(yǔ)音庫。Microsoft lili支持中英文混讀。
二.SAPI SDK的下載和安裝
如果是在XP系統下進(jìn)行開(kāi)發(fā)則需要下載Microsoft Speech SDK 5.1,下載地址為:http://www.microsoft.com/download/en/details.aspx?id=10121。
根據微軟下載說(shuō)明,有幾點(diǎn)需要注意:
1.如果你想下載例子程序、文檔、SAPI和用于開(kāi)發(fā)的美國英文語(yǔ)音引擎,請下載SpeechSDK51.exe。
2.如果你想使用日文和簡(jiǎn)體中文引擎用于開(kāi)發(fā),請下載SpeechSDK51.exe和SpeechSDK51LangPach.exe。
3.如果你想將語(yǔ)音引擎集成到你的產(chǎn)品跟產(chǎn)品一起發(fā)布,就下載SpeechSDK51MSM.exe。
4.如果你僅想獲得XP系統下的Mike和Mary語(yǔ)音,就下載Sp5TTIntXP.exe。
5.如果你只想要文檔請下載sapi.chm。
下載完成后可先安裝引擎SpeechSDK51.exe,再安裝中文語(yǔ)言補丁包SpeechSDK51LangPach.exe,這樣就可以使用其中的中文男聲語(yǔ)音庫了。如果想要在Vista或Win7系統下使用Mike、Mary和Microsoft Simplified Chinese中文男聲語(yǔ)音庫也可以下載相應的文件安裝。
三.VC++環(huán)境配置
如果是在XP系統下開(kāi)發(fā),先安裝SpeechSDK51.exe再安裝SpeechSDK51LangPach.exe,假設安裝路徑為默認的C:\Program Files\Microsoft Speech SDK 5.1,則接下來(lái)需要配置VC++,以VS2010為例,在Solution Exporer中的工程名上點(diǎn)右鍵,在右鍵菜單中選擇properties,彈出Property Pages對話(huà)框,然后在左側樹(shù)中選擇節點(diǎn)”VC++Directories“,在右側列表的Include Directories處輸入”C:\Program Files\Microsoft Speech SDK 5.1\Include“,Library Directories處輸入”C:\Program Files\Microsoft Speech SDK 5.1\lib\i386“。VS2005、VS2008和VC6.0可以按照各自的方法設置。
最后,在程序中使用語(yǔ)音引擎以前包含頭文件和lib庫:
#include "sapi.h"
#include "sphelper.h"
#pragma comment(lib, "sapi.lib")
如果是在Vista或者Win7系統中開(kāi)發(fā)的話(huà),因為頭文件和lib庫所在路徑已默認附加到編譯器了,所以不需手動(dòng)添加,直接在程序中包含頭文件和lib庫即可。
四.SAPI接口的使用說(shuō)明
1.基本朗讀過(guò)程的實(shí)現
在使用語(yǔ)音引擎之前進(jìn)行初始化:
ISpVoice *pSpVoice; // 重要COM接口
::CoInitialize(NULL); // COM初始化
// 獲取ISpVoice接口
CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice);
獲取到ISpVoice接口以后,我們就可以通過(guò)pSpVoice指針調用SAPI接口了。
我們可以設置音量:pSpVoice->SetVolume(80);。SetVolume的參數即音量的范圍在0到100之間。
可以這樣朗讀字符串內容:pSpVoice->Speak(string, SPF_DEFAULT, NULL);。這樣string里的內容就會(huì )被朗讀出來(lái)了,第二個(gè)參數SPF_DEFAULT表示使用默認設置,包括同步朗讀的設置。異步朗讀可以設置成SPF_ASYNC。同步朗讀表示讀完string中的內容,speak函數才會(huì )返回,而異步朗讀則將字符串送進(jìn)去就返回,不會(huì )阻塞。
使用完語(yǔ)音引擎后應執行:
pSpVoice->Release();
::CoUninitialize();
這樣資源被釋放,語(yǔ)音朗讀過(guò)程結束。
以上就完成了一個(gè)簡(jiǎn)單的語(yǔ)音合成朗讀的功能。

2.ISpVoice的成員函數
雞啄米再簡(jiǎn)單說(shuō)明幾個(gè)ISpVoice接口的成員函數:
HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG *pulStreamNumber);
用于讀取字符串pwcs里的內容。參數pwcs為要朗讀的字符串。dwFlags是用于控制朗讀方式的標志,具體意義可以查看文檔中的枚舉SPEAKFLAGS。pulStreamNumber為輸出參數,它指向本次朗讀請求對應的當前輸入流編號,每次朗讀一個(gè)字符串時(shí)都會(huì )有一個(gè)流編號返回,異步朗讀時(shí)使用。
HRESULT SetRate( long RateAdjust); // 設置朗讀速度,取值范圍:-10到10
HRESULT GetRate(long *pRateAdjust); // 獲取朗讀速度
HRESULT SetVoice(ISpObjectToken *pToken); // 設置使用的語(yǔ)音庫
HRESULT GetVoice(ISpObjectToken** ppToken); // 獲取語(yǔ)音庫
HRESULT Pause ( void ); // 暫停朗讀
HRESULT Resume ( void ); // 恢復朗讀
// 在當前朗讀文本中根據lNumItems的符號向前或者向后跳過(guò)指定數量(lNumItems的絕對值)的句子。
HRESULT Skip(LPCWSTR *pItemType, long lNumItems, ULONG *pulNumSkipped);
// 播放WAV文件
HRESULT SpeakStream(IStream *pStream, DWORD dwFlags, ULONG *pulStreamNumber);
// 將聲音輸出到WAV文件
HRESULT SetOutput(IUnknown *pUnkOutput,BOOL fAllowFormatChanges);
HRESULT SetVolume(USHORT usVolume); // 設置音量,范圍:0到100
HRESULT GetVolume(USHORT *pusVolume); // 獲取音量
HRESULT SetSyncSpeakTimeout(ULONG msTimeout); // 設置同步朗讀超時(shí)時(shí)間,單位為毫秒
HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout); // 獲取同步朗讀超時(shí)時(shí)間
因為在同步朗讀時(shí),speak函數是阻塞的,如果語(yǔ)音輸出設備被其他程序占用,則speak則會(huì )一直等待,所以最好設置好超時(shí)時(shí)間,超時(shí)后speak函數自行返回。
3.使用XML朗讀
在進(jìn)行TTS開(kāi)發(fā)時(shí)可以使用XML,SAPI可以分析XML標簽,通過(guò)XML能夠實(shí)現一些ISpVoice的成員函數的功能。比如設置語(yǔ)音庫、音量、語(yǔ)速等。此時(shí)speak函數的dwFlags參數要設置為包含SPF_IS_XML。如:
// 選擇語(yǔ)音庫Microsoft Sam
pSpVoice->speak(L"<VOICE REQUIRED='NAME=Microsoft Sam'/>雞啄米", SPF_DEFAULT | SPF_IS_XML, NULL);
// 設置音量
<VOLUME LEVEL='90'>雞啄米</VOLUME>
// 設置語(yǔ)言
<lang langid='804'>雞啄米</lang>
804代表中文,409代表英文。如果用函數SpGetLanguageFromToken獲取語(yǔ)言時(shí),0x804表示中文,0x409表示英文。
五.Microsofot Speech SDK開(kāi)發(fā)程序舉例
::CoInitialize(NULL); // COM初始化
CLSID CLSID_SpVoice;
CLSIDFromProgID(_T("SAPI.SpVoice"), &CLSID_SpVoice);
ISpVoice *pSpVoice = NULL;
IEnumSpObjectTokens *pSpEnumTokens = NULL;
// 獲取ISpVoice接口
if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice)))
{
return -1;
}
// 列舉所有的語(yǔ)音token,可以通過(guò)pSpEnumTokens指向的接口得到
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens)))
{
ISpObjectToken *pSpToken = NULL;
// 依次獲取每個(gè)token并朗讀字符串
while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL)
{
pSpVoice->SetVoice(pSpToken); // 設置當前語(yǔ)音token為pSpToken
pSpVoice->Speak(L"Hello Word 世界你好", SPF_DEFAULT, NULL); // 朗讀中文和英文的混合字符串
pSpToken->Release(); // 釋放token
}
pSpEnumTokens->Release(); // 釋放pSpEnumTokens接口
}
pSpVoice->Release();
::CoUninitialize();
雞啄米通過(guò)調試和朗讀效果得出結論,Vista和Win7上的Microsoft Lili語(yǔ)音庫可以中英文混讀,Microsoft Speech SDK 5.1中的中文男聲Microsoft Simplified Chinese語(yǔ)音庫朗讀英文的時(shí)候只能一個(gè)字母一個(gè)字母的讀,Anna、Mike、Sam只能讀英文,中文略過(guò)。
那么Microsoft Simplified Chinese、Anna、Mike、Sam怎樣實(shí)現中英文混讀呢?雞啄米告訴大家,可以修改字符串,加入XML標記,將中文和英文分別處理,上面程序中的字符串可以修改為:L"<lang langid='409'>Hello Word</lang> <lang langid='804'>世界你好</lang>"。這樣當前語(yǔ)音庫不能讀的語(yǔ)言會(huì )自動(dòng)選擇同性別的其他語(yǔ)音來(lái)讀。
六.如何制作SAPI組件安裝包
SAPI開(kāi)發(fā)的程序想要正常運行,必須保證計算機上安裝了SAPI組件,所以我們的軟件發(fā)布時(shí)最好同時(shí)發(fā)布SAPI核心組件的安裝程序,如果需要安裝新的語(yǔ)言,還要有語(yǔ)言模塊。這就需要用到講SDK下載時(shí)提到的SpeechSDK51MSM.exe。
SpeechSDK51MSM.exe安裝完以后會(huì )生成三個(gè)文件夾:1033、1041和2052。其中,1033下主要是用于英文的TTS和SR的.msm文件,1041下主要是用于日文SR的.msm文件,2052下是用于中文TTS和SR的msm文件。
我們要開(kāi)發(fā)的是TTS程序,所以不需要SR的相關(guān)文件。英文TTS需要包含1033下的這些文件:Sp5.msm、Sp5Intl.msm、Sp5itn.msm、Sp5TTInt.msm、SpCommon.msm,如果需要Mike和Mary的語(yǔ)音還需Sp5TTIntXP.msm文件。如果還要支持中文TTS則需再包含2052下的文件:Sp5Intl.msm、Sp5itn.msm、SP5TTINTr.msm。
仍以VS2010為例,安裝包制作的具體過(guò)程如下:
1.選擇File->new->project,彈出New Project對話(huà)框,在左側面板中的Installed Templates下展開(kāi)Other Project Types,繼續展開(kāi)起子節點(diǎn)Setup and Deployment,最后選擇Visual Studio Installer,右側面板中選擇Setup Project,最后在對話(huà)框下部,設置好名稱(chēng)和路徑點(diǎn)“OK”就生成工程了。對于沒(méi)有集成Visual Studio Installer的老版本的編譯器,可以在網(wǎng)上下載Microsoft Visual Studio Installer。
2.在Solution Explorer中的工程名上點(diǎn)右鍵,然后在右鍵菜單中選擇Add->Merge Module,最后在彈出的對話(huà)框中選擇上面提到的所要包含的.msm文件即可。
3.編譯運行工程,若是Debug模式則會(huì )在工程目錄的Debug文件夾下生成相應的msi文件,若是Release模式則會(huì )在Release目錄下聲稱(chēng)msi文件。
SAPI安裝包到此就制作好了,我們也可以將我們的應用程序exe文件也一同打到安裝包里。這樣運行安裝程序后就會(huì )將應用程序和SAPI組件都裝到目標主機里,應用程序可以直接運行。
關(guān)于Windows TTS語(yǔ)音引擎編程入門(mén)的知識雞啄米就總結完了,大家可以繼續探索,開(kāi)發(fā)出各種有趣的語(yǔ)音程序。

