文档库 最新最全的文档下载
当前位置:文档库 › 浅谈MS Speech SDK

浅谈MS Speech SDK

浅谈MS Speech SDK
浅谈MS Speech SDK

淺談MS Speech SDK

前一段時間,金山公司在全國開展了"紅色風暴"營銷活動,"金山詞霸2000"的銷售勢頭非常強勁。有人也許注意到這次"金山詞霸"的升級最大的改進是"採用了世界先進的TTS全程語音系統"(廣告語),使得詞霸軟體能夠讀取任意的英文辭彙、短語、句子等。那麽什麽是TTS呢?簡單地說就是"Text to Speech"(文字到語音)英文縮寫,這是Microsoft 公司出品的Speech SDK(語音軟體發展工具)中提供的一個API介面功能,在金山詞霸2000中就使用了Speech SDK,下面我簡單介紹一下什麽是Speech SDK。

電腦軟體的介面設計一致是軟體設計中的一個重要方面,如何讓普通人也能自如地使用電腦是介面設計中要考慮的一個重要問題,隨著電腦的普及,採用語音與電腦進行交互操作是未來人機界面設計的一個發展方向。這裏的語音技術包括兩項內容:語音識別(speech recognition[SR))與語音合成(speech synthesis [SS)即TTS)。語音識別用於告訴電腦我想讓它做什麽,而語音合成用於電腦告訴我們它想讓我們知道什麽。利用這兩項技術即可以完成人機交互。既然語音技術那麽好,爲什麽很少有軟體採用呢?因爲這兩項技術很複雜,需要相關的語音引擎(speech engine)來支援,而許多軟體廠商都出品過自己的語音合成或語音識別引擎,這些引擎之間並不相容,如果一個軟體要使用語音功能,開發者必須得從衆多的語音引擎中挑選一個來使用,如果將來想要換一個語音引擎,就必須爲新引擎重新改寫程式,這使得許多軟體的開發者感到自己的開發沒有保證,於是他們乾脆就放棄了開發語音功能的計劃。爲了解決這個問題,微軟公司推出了一組新的API(應用程式開發介面)----- The Microsoft Speech API。微軟希望這組API能夠成爲業界標準,讓軟體設計者利用此API編寫語音軟體,Speech API結構在應用軟體與語音引擎之間,隔離了應用軟體與語音引擎之間的聯繫,使得語音引擎的更換不會影響到原有應用程式的運行。Speech API只提供了一系列介面,它本身並不能做任何事情,以此API編寫的程式還需要語音引擎的支援才能運行。於是微軟在此基礎上推出Speech SDK這個開發工具,幫助軟體發展者開發語音軟體,並在此工具中提供了一系列語音引擎(包括SR和SS),使得軟體發展人員輕而易舉地就能使自己的程式能說又能聽。(這是真的麽?簡直不敢相信)。不過,目前還沒有支援中文的語音引擎,所以我們的程式還不能說中文,也不能聽中文。不過"麵包總是會有的",我想以後中文語音引擎一定會出現的。說到這裏是不是有些人已經急不可待地想去試一試了。別著急,我再說說API的具體組織方法。

與其他微軟新推出的API一樣,這套API是架構在COM(Component Object Model)元件基礎之上,用物件的方式提供編程介面。(什麽?你不知道什麽叫COM?我肯定這兩年你一定是生活在深山當中!這是未來編寫WINDOWS程式的基礎,比較複雜,我只有另文介紹了),這使得用VB、C++、Delphi以及其他任何可以支援COM編程的語言都可以運用Speech API。而且在COM元件基礎之上微

軟還提供了Activex Control控制項(ActiveX 控制項是以COM元件技術爲基礎的一種元件控制項技術,可以嵌入瀏覽器以及OFFICE當中使用),這更方便了軟體編程者在網頁上使用SPEECH API 的功能,可以想象讓自己的網頁發聲是多麽激動人心啊!而且Activex控制項也能在VBA(VB FOR APPLICATION )中使用,在Excel裏也能夠利用Speech API,讓你的圖表會說話。這些技術給軟體發展者提供了廣泛的應用領域。如果你對COM元件感到陌生的話,可以使用微軟提供的C++ WRAPPERS,它用C++類重新封裝了Speech SDK 的COM物件,讓你無須與直接COM打交道,看來微軟已經是做到了"仁至義盡"了,爲各種開發人員都做了準備。

Speech API 本身分兩層結構,高級物件及低級物件,高級物件爲編程者提供較高級的介面形式,使得編制程式很容易,而低級物件則爲編程者提供了較低級的控制方式,可以更靈活地控制語音引擎,但也使得編制程式變得較爲複雜。在一般情況下,程式設計利用高級物件就足夠了,但如果更深層次地使用Speech API,就必須使用低級物件。其結構可參看圖一。

圖一

以下是各個組COM物件的簡介。

一、高級物件(HIGH LEVER SPEECH OBJECT):

1.V oice Commands API:功能是對應用程式進行控制,一般在語言識別系統識別了一個命令後,會調用此介面使某個應用程式完成一定的功能,如果你的程式想使用語音控制功能就必須使用此組物件

2.voice Dictation API:功能是進行聽寫輸入,即語音識別。

3.V oice Text API :此組物件完成從文字到語音的轉換功能,即語音合成。後面的例子會用到此物件。

4.V oice Telephony API :它把語音識別與語音合成綜合利用到了電話系統之上,利用此物件可以建立一個電話應答系統,甚至可以通過電話控制你的電腦。5.Audio Objects API :主要封裝了電腦上的發音系統。

以下是一個報時鐘錶的程式,在這個程式中採用了Voice Text API物件,當你按下按鈕時這個程式會報時間,同時它還有一個編輯框,當你在裏面輸入英文單詞以後,只要按一下按鈕,它也會把單詞讀出來。程式比較簡單,主要讓你有一個感性的認識。具體代碼如下:

//根源程式文件clock.cpp

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "resource.h"

#include

PIVOICETEXT gpIVTxt;

BOOL CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

static char tmpbuf[128];//存放時間的字元。

switch (uMsg) {

case WM_INITDIALOG:

{

SetTimer(hWnd,1,1000,NULL);//建立計時器

break;

}

case WM_TIMER:

{

_tzset();

/* Display operating system-style date and time. */

_strtime( tmpbuf );

SetDlgItemText(hWnd,IDC_STATICCLOCK,LPCSTR(tmpbuf));//顯示時間到對話方塊上。

break;

}

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDSPEAK:

{

char* pSpeak;

pSpeak=(char *)malloc(1024*64);//64KB

// Speak

GetDlgItemText(hWnd,IDC_EDIT, LPTSTR(pSpeak), 64*1024-1);//獲取編輯框內的字元,最大長度必須限制在64kb-1內。

gpIVTxt->Speak(LPTSTR(pSpeak), VTXTST_QUESTION | VTXTSP_NORMAL, NULL); //讀出編輯框中的字元

free(pSpeak);

return TRUE;

}

case IDCANCEL:

{ KillTimer(hWnd,1);

EndDialog (hWnd, IDCANCEL);

return TRUE;

}

case IDC_CLOCKSPEAK:

{gpIVTxt->Speak(LPCSTR(tmpbuf),VTXTST_QUESTION | VTXTSP_NORMAL, NULL);//讀出現在的時間

return TRUE;

}

case IDC_STOP:

{gpIVTxt->StopSpeaking();//停止發音

return TRUE;

}

}

break;

};

return FALSE; // didn't handle

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

CoInitialize(NULL);

if(CoCreateInstance(CLSID_VTxt,NULL, CLSCTX_LOCAL_SERVER,IID_IVoiceText, (LPVOID *) &gpIVTxt) != S_OK)

return 0;

gpIVTxt->Register(NULL,"Clock",NULL, IID_IVTxtNotifySink,NULL,NULL);

//必須使用這個註冊函數

// Bring up the dialog box

DialogBox(hInstance,MAKEINTRESOURCE(IDD_CLOCK), NULL, (DLGPROC) DialogProc);//啓動對話方塊

gpIVTxt->Release();//釋放介面

CoUninitialize();

return 0;

}

資源檔案clock.rc與資源頭文件resource.h在此省略,在VC中可以利用資源編輯器製作一個對話方塊,VC會自動生成這兩個文件,爲了與上述代碼配合,對話方塊的ID爲IDD_CLOCK。其他對話方塊上的控制項的ID如下所示:

注意在編譯以前,要把SDK的頭文件路徑在VC中設置好。

二、低級物件(LOW LEVER SPEECH OBJECT):1.DirectSpeechRecognition API :提供了更強大的語音識別控制功能,包括枚舉語音引擎等功能。

2.DirectTextToSpeech API:提供了更強大的語音合成功能。

如果我們用DirectTextToSpeech API修改發聲鐘錶程式,將會爲該程式提供更強大的功能,甚至可以調節發音頻率,發音者的年齡等,由於其應用很複雜,我這裏不再舉例。有興趣的人可以查閱SPEECH SDK中編程文檔。

那麽如何獲得這個SDK 呢?是不是得花很多錢呢?NO!微軟公司免費提供此SDK,大家可以到https://www.wendangku.net/doc/6f2692045.html, 網站上下載此程式。

通過以上介紹,我們只是看到了Speech SDK這個巨大冰山中的一個小角,如果要想全面掌握它就必須仔細閱讀Speech SDK自身的參考文檔。它的應用前景是廣闊的,我們可以利用它製作會說話的程式,雖然是只能說英文,但是畢竟是一個嶄新的功能,勢必會使你的程式更加引人注目,而且你還可以編寫英語聽寫軟體以及英語學習軟體,使自己的程式輕而易舉地就具有了多媒體的功能,不用再去費勁心思地去編寫語音識別與語音合成引擎,而在windows 2000當中,語音識別與語音合成功能和windows 2000結合在一起成爲標準配置,我想用不了多久,帶有語音人機界面的程式將會大量出現。

最後我想再談談在Delphi中使用Speech SDK時需注意的幾個問題,因爲Delphi目前在國內擁有廣泛的用戶。

1.如何Delphi中使用Activex 控制項:在Delphi 3.0中(其他版本我沒有

試過)使用Speech SDK提供的Activex控制項會産生一些問題,在往Delphi中Import Activex 控制項之後,如果你往表單上放置控制項,Delphi就會彈出一個錯誤資訊如圖二。

圖二

我經過仔細研究之後,初步判斷這可能是在表單在調用控制項提供的IVIEWOBJECT介面繪畫控制項的圖案時,Delphi 與控制項的自繪發生了衝突。解決的方法是修改控制項的註冊表資訊,改變控制項自繪方式。注意:修改註冊表不當,會導致WINDOWS啓動失常,因此我強烈建議在修改前備份註冊表文件。步驟如下:

①啓動"REGEDIT.EXE"。查找某個控制項的DLL文件,例如"Voice Text Control"的DLL檔案名叫"VTEXT.DLL",在查找對話方塊裏輸入"VTEXT.DLL",然後開始查找。查找會在此處停下,如圖三。

圖三

②選擇miscstatus子鍵,修改其default的值,改爲4。

③選擇miscstatus的子鍵1,按DEL鍵刪除它,然後給miscstatus加入一個新的子鍵,名稱爲4。這樣你就可以把V oice Text Control加到Delphi中的表單上去了。其他的控制項也可依法進行修改,只是每次查找時需確定要修改控制項所對應的DLL檔案名。

2.使用COM介面。在Delphi中也可以直接使用COM介面,但是由於SPEECH SDK只提供了介面的C語言的頭文件,使得DELPHI無法直接使用,必須把這個文件翻譯成PASCAL語言,幸好這個工作已經有人做了,讀者可以上網到https://www.wendangku.net/doc/6f2692045.html, 中下載一個文件,解壓縮之後按照說明使用即可。另外需說的是,在Delphi 中只使用ActiveX控制項的讀者最好也能下載這個PASCAL 頭文件,這會更加方便你使用控制項中的一些方法以及屬性。

相关文档