我們都使用過一些某某詞霸的英語學(xué)習(xí)工具軟件,它們大多都有朗讀的功能,其實這就是利用的Windows的TTS(Text To Speech)語音引擎。它包含在Windows Speech SDK開發(fā)包中。我們也可以使用此開發(fā)包根據(jù)自己的需要開發(fā)程序。雞啄米下面對TTS功能的軟件開發(fā)過程進行詳細介紹。
一.SAPI SDK的介紹
SAPI,全稱是The Microsoft Speech API。就是微軟的語音API。由Windows Speech SDK提供。
Windows Speech SDK包含語音識別SR引擎和語音合成SS引擎兩種語音引擎。語音識別引擎用于識別語音命令,調(diào)用接口完成某個功能,實現(xiàn)語音控制。語音合成引擎用于將文字轉(zhuǎn)換成語音輸出。
SAPI包括以下幾類接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API和Audio Objects API。我們要實現(xiàn)語音合成需要的是Voice Text API。
目前最常用的Windows Speech SDK版本有三種:5.1、5.3和5.4。
Windows Speech SDK 5.1版本支持xp系統(tǒng)和server 2003系統(tǒng),需要下載安裝。XP系統(tǒng)默認只帶了個Microsoft Sam英文男聲語音庫,想要中文引擎就需要安裝Windows Speech SDK 5.1。
Windows Speech SDK 5.3版本支持Vista系統(tǒng)和Server 2008系統(tǒng),已經(jīng)集成到系統(tǒng)里。Vista和Server 2003默認帶Microsoft lili中文女聲語音庫和Microsoft Anna英文女聲語音庫。
Windows Speech SDK 5.4版本支持Windows7系統(tǒng),也已經(jīng)集成到系統(tǒng)里,不需要下載安裝。Win7系統(tǒng)同樣帶了Microsoft lili中文女聲語音庫和Microsoft Anna英文女聲語音庫。Microsoft lili支持中英文混讀。
二.SAPI SDK的下載和安裝
如果是在XP系統(tǒng)下進行開發(fā)則需要下載Microsoft Speech SDK 5.1,下載地址為:http://www.microsoft.com/download/en/details.aspx?id=10121。
根據(jù)微軟下載說明,有幾點需要注意:
1.如果你想下載例子程序、文檔、SAPI和用于開發(fā)的美國英文語音引擎,請下載SpeechSDK51.exe。
2.如果你想使用日文和簡體中文引擎用于開發(fā),請下載SpeechSDK51.exe和SpeechSDK51LangPach.exe。
3.如果你想將語音引擎集成到你的產(chǎn)品跟產(chǎn)品一起發(fā)布,就下載SpeechSDK51MSM.exe。
4.如果你僅想獲得XP系統(tǒng)下的Mike和Mary語音,就下載Sp5TTIntXP.exe。
5.如果你只想要文檔請下載sapi.chm。
下載完成后可先安裝引擎SpeechSDK51.exe,再安裝中文語言補丁包SpeechSDK51LangPach.exe,這樣就可以使用其中的中文男聲語音庫了。如果想要在Vista或Win7系統(tǒng)下使用Mike、Mary和Microsoft Simplified Chinese中文男聲語音庫也可以下載相應(yīng)的文件安裝。
三.VC++環(huán)境配置
如果是在XP系統(tǒng)下開發(fā),先安裝SpeechSDK51.exe再安裝SpeechSDK51LangPach.exe,假設(shè)安裝路徑為默認的C:\Program Files\Microsoft Speech SDK 5.1,則接下來需要配置VC++,以VS2010為例,在Solution Exporer中的工程名上點右鍵,在右鍵菜單中選擇properties,彈出Property Pages對話框,然后在左側(cè)樹中選擇節(jié)點”VC++Directories“,在右側(cè)列表的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可以按照各自的方法設(shè)置。
最后,在程序中使用語音引擎以前包含頭文件和lib庫:
#include "sapi.h"
#include "sphelper.h"
#pragma comment(lib, "sapi.lib")
如果是在Vista或者Win7系統(tǒng)中開發(fā)的話,因為頭文件和lib庫所在路徑已默認附加到編譯器了,所以不需手動添加,直接在程序中包含頭文件和lib庫即可。
四.SAPI接口的使用說明
1.基本朗讀過程的實現(xiàn)
在使用語音引擎之前進行初始化:
ISpVoice *pSpVoice; // 重要COM接口
::CoInitialize(NULL); // COM初始化
// 獲取ISpVoice接口
CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice);
獲取到ISpVoice接口以后,我們就可以通過pSpVoice指針調(diào)用SAPI接口了。
我們可以設(shè)置音量:pSpVoice->SetVolume(80);。SetVolume的參數(shù)即音量的范圍在0到100之間。
可以這樣朗讀字符串內(nèi)容:pSpVoice->Speak(string, SPF_DEFAULT, NULL);。這樣string里的內(nèi)容就會被朗讀出來了,第二個參數(shù)SPF_DEFAULT表示使用默認設(shè)置,包括同步朗讀的設(shè)置。異步朗讀可以設(shè)置成SPF_ASYNC。同步朗讀表示讀完string中的內(nèi)容,speak函數(shù)才會返回,而異步朗讀則將字符串送進去就返回,不會阻塞。
使用完語音引擎后應(yīng)執(zhí)行:
pSpVoice->Release();
::CoUninitialize();
這樣資源被釋放,語音朗讀過程結(jié)束。
以上就完成了一個簡單的語音合成朗讀的功能。
2.ISpVoice的成員函數(shù)
雞啄米再簡單說明幾個ISpVoice接口的成員函數(shù):
HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG *pulStreamNumber);
用于讀取字符串pwcs里的內(nèi)容。參數(shù)pwcs為要朗讀的字符串。dwFlags是用于控制朗讀方式的標志,具體意義可以查看文檔中的枚舉SPEAKFLAGS。pulStreamNumber為輸出參數(shù),它指向本次朗讀請求對應(yīng)的當前輸入流編號,每次朗讀一個字符串時都會有一個流編號返回,異步朗讀時使用。
HRESULT SetRate( long RateAdjust); // 設(shè)置朗讀速度,取值范圍:-10到10
HRESULT GetRate(long *pRateAdjust); // 獲取朗讀速度
HRESULT SetVoice(ISpObjectToken *pToken); // 設(shè)置使用的語音庫
HRESULT GetVoice(ISpObjectToken** ppToken); // 獲取語音庫
HRESULT Pause ( void ); // 暫停朗讀
HRESULT Resume ( void ); // 恢復(fù)朗讀
// 在當前朗讀文本中根據(jù)lNumItems的符號向前或者向后跳過指定數(shù)量(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); // 設(shè)置音量,范圍:0到100
HRESULT GetVolume(USHORT *pusVolume); // 獲取音量
HRESULT SetSyncSpeakTimeout(ULONG msTimeout); // 設(shè)置同步朗讀超時時間,單位為毫秒
HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout); // 獲取同步朗讀超時時間
因為在同步朗讀時,speak函數(shù)是阻塞的,如果語音輸出設(shè)備被其他程序占用,則speak則會一直等待,所以最好設(shè)置好超時時間,超時后speak函數(shù)自行返回。
3.使用XML朗讀
在進行TTS開發(fā)時可以使用XML,SAPI可以分析XML標簽,通過XML能夠?qū)崿F(xiàn)一些ISpVoice的成員函數(shù)的功能。比如設(shè)置語音庫、音量、語速等。此時speak函數(shù)的dwFlags參數(shù)要設(shè)置為包含SPF_IS_XML。如:
// 選擇語音庫Microsoft Sam
pSpVoice->speak(L"<VOICE REQUIRED='NAME=Microsoft Sam'/>雞啄米", SPF_DEFAULT | SPF_IS_XML, NULL);
// 設(shè)置音量
<VOLUME LEVEL='90'>雞啄米</VOLUME>
// 設(shè)置語言
<lang langid='804'>雞啄米</lang>
804代表中文,409代表英文。如果用函數(shù)SpGetLanguageFromToken獲取語言時,0x804表示中文,0x409表示英文。
五.Microsofot Speech SDK開發(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;
}
// 列舉所有的語音token,可以通過pSpEnumTokens指向的接口得到
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens)))
{
ISpObjectToken *pSpToken = NULL;
// 依次獲取每個token并朗讀字符串
while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL)
{
pSpVoice->SetVoice(pSpToken); // 設(shè)置當前語音token為pSpToken
pSpVoice->Speak(L"Hello Word 世界你好", SPF_DEFAULT, NULL); // 朗讀中文和英文的混合字符串
pSpToken->Release(); // 釋放token
}
pSpEnumTokens->Release(); // 釋放pSpEnumTokens接口
}
pSpVoice->Release();
::CoUninitialize();
雞啄米通過調(diào)試和朗讀效果得出結(jié)論,Vista和Win7上的Microsoft Lili語音庫可以中英文混讀,Microsoft Speech SDK 5.1中的中文男聲Microsoft Simplified Chinese語音庫朗讀英文的時候只能一個字母一個字母的讀,Anna、Mike、Sam只能讀英文,中文略過。
那么Microsoft Simplified Chinese、Anna、Mike、Sam怎樣實現(xiàn)中英文混讀呢?雞啄米告訴大家,可以修改字符串,加入XML標記,將中文和英文分別處理,上面程序中的字符串可以修改為:L"<lang langid='409'>Hello Word</lang> <lang langid='804'>世界你好</lang>"。這樣當前語音庫不能讀的語言會自動選擇同性別的其他語音來讀。
六.如何制作SAPI組件安裝包
SAPI開發(fā)的程序想要正常運行,必須保證計算機上安裝了SAPI組件,所以我們的軟件發(fā)布時最好同時發(fā)布SAPI核心組件的安裝程序,如果需要安裝新的語言,還要有語言模塊。這就需要用到講SDK下載時提到的SpeechSDK51MSM.exe。
SpeechSDK51MSM.exe安裝完以后會生成三個文件夾:1033、1041和2052。其中,1033下主要是用于英文的TTS和SR的.msm文件,1041下主要是用于日文SR的.msm文件,2052下是用于中文TTS和SR的msm文件。
我們要開發(fā)的是TTS程序,所以不需要SR的相關(guān)文件。英文TTS需要包含1033下的這些文件:Sp5.msm、Sp5Intl.msm、Sp5itn.msm、Sp5TTInt.msm、SpCommon.msm,如果需要Mike和Mary的語音還需Sp5TTIntXP.msm文件。如果還要支持中文TTS則需再包含2052下的文件:Sp5Intl.msm、Sp5itn.msm、SP5TTINTr.msm。
仍以VS2010為例,安裝包制作的具體過程如下:
1.選擇File->new->project,彈出New Project對話框,在左側(cè)面板中的Installed Templates下展開Other Project Types,繼續(xù)展開起子節(jié)點Setup and Deployment,最后選擇Visual Studio Installer,右側(cè)面板中選擇Setup Project,最后在對話框下部,設(shè)置好名稱和路徑點“OK”就生成工程了。對于沒有集成Visual Studio Installer的老版本的編譯器,可以在網(wǎng)上下載Microsoft Visual Studio Installer。
2.在Solution Explorer中的工程名上點右鍵,然后在右鍵菜單中選擇Add->Merge Module,最后在彈出的對話框中選擇上面提到的所要包含的.msm文件即可。
3.編譯運行工程,若是Debug模式則會在工程目錄的Debug文件夾下生成相應(yīng)的msi文件,若是Release模式則會在Release目錄下聲稱msi文件。
SAPI安裝包到此就制作好了,我們也可以將我們的應(yīng)用程序exe文件也一同打到安裝包里。這樣運行安裝程序后就會將應(yīng)用程序和SAPI組件都裝到目標主機里,應(yīng)用程序可以直接運行。
關(guān)于Windows TTS語音引擎編程入門的知識雞啄米就總結(jié)完了,大家可以繼續(xù)探索,開發(fā)出各種有趣的語音程序。