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