微軟TTS語音引擎編程入門


原文鏈接地址: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語音引擎編程入門的知識雞啄米就總結完了,大家可以繼續探索,開發出各種有趣的語音程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM