我們都使用過(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ǔ)音程序。