線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2118
推到 Plurk!
推到 Facebook!

混合編程實現英文文章的語音輸出

 
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-04 12:20:50 IP:61.221.xxx.xxx 未訂閱
http://www.powerba.com/develop/delphi/article/20010501002.htm 混合編程實現英文文章的語音輸出 資訊産業部電子第二十二研究所青島分所 郎銳 現在有些軟體尤其是翻譯類軟體多提供有語音輸出的功能,比較有名的有《金山詞霸2000》、《不知不覺背單詞》等,他們所提供的英文朗讀功能是通過直接使用了Microsoft的TTS(Text-to-Speech)全程化語音技術來實現的。其實我們也可以在自己的程式中通過對MS Speech API的調用來增加語音輸出功能,尤其是對於翻譯類軟體,如果沒有語音功能可以說這個軟體是不完備的。 一、準備工作 爲實現TTS技術,一個必要的前提條件是系統中要有MS TTS引擎,可以通過查看Windows目錄下是否有speech的目錄來判斷是否安裝過該引擎。如果沒有,可以從《金山詞霸2000》光碟上的ciba子目錄下的mstts.exe來安裝MS TTS引擎和spchapi(MS Speech API)或是直接從互連網上下載:可以從http://bcbsrc.home.chinaren.com/ttsapi.exe下載語音介面程式TTSapi.exe; 可以從http://bcbsrc.home.chinaren.com/ttssetup.exe下載男聲語音引擎程式TTSSetup.exe;可以從http://bcbsrc.home.chinaren.com/ttssetup2.exe下載女聲語音引擎程式TTSSetup2.exe。  二、引言 在整個設計過程中,主要是圍繞著Vtxtauto.tlb這個類型庫展開的,由於在VC下實現類型庫比較煩瑣,我們選擇使用TLB類型庫比較方便的Delphi來同Vtxtauto.tlb進行交互,並將幾個主要的功能如"朗讀"、"暫停"、"恢復"、"停止"等用幾個相應的功能函數來實現,最終通過DLL(動態連結程式庫)將其封裝在內,對外則僅提供幾個簡單介面,可以很方便的爲Delphi或其他語言調用。在此我們通過採用VC 6.0來調用這個由Delphi開發的擁有TTS技術的動態連結程式庫來實現英文文本的語音輸出。  三、Delphi動態連結程式庫的實現 1、選"File"、"New…",在"New Items"對話方塊中選擇"DLL",新建一動態連接庫工程Project1。 2、選"File"、"New…",在"New Items"中選擇"Unit",新建一單元TTSDLL。 3、選"Project"、"Import Type Library…",點擊"Add"按鈕,選擇C:\windows\speech\目錄下的Vtxtauto.tlb類型庫,便將其添加到工程中來了。 4、編輯TTSDll單元如下: unit TTSDLL; interface uses VtxtAuto_TLB; procedure Create;export; {待導出的過程和函數} procedure Read(text:PChar);export; procedure Pause;export; procedure Resume;export; procedure Stop;export; function IsSpeaking:Boolean;export; procedure Destory;export;  var TTS: IVTxtauto;  implementation procedure Create; begin TTS:=CoVTxtAuto.Create; {創建物件} TTS.Register('Project1','Project1'); {註冊 } end;  procedure Read(text:PChar); begin TTS.Speak(text,vtxtst_READING); {朗讀函數。第一參數是待朗讀的文本。第二參數用於控制朗讀的語氣和優先順序,主要有以下幾種,可以根據需要靈活選擇,如需多種選擇將其進行或運算即可: vtxtst_STATEMENT = 1;平時說話時語氣,默認。 vtxtst_QUESTION = 2; 提問的語氣。 vtxtst_COMMAND = 4; 命令的語氣。 vtxtst_WARNING = 8; 警告的語氣。 vtxtst_READING = 16; 閱讀文檔時的語氣。 vtxtst_NUMBERS = 32; 閱讀數位時的語氣。 vtxtst_SPREADSHEET = 64; 閱讀試算表中元素時的語氣。 vtxtsp_VERYHIGH = 128; 立即讀出,可以打斷當前正讀的內容。 vtxtsp_HIGH = 256; 儘快讀出,加入播放佇列開始。 vtxtsp_NORMAL = 512; 默認,加入播放佇列末尾。} end;  procedure Pause; begin TTS.AudioPause; {暫停朗讀} end;  procedure Stop; begin TTS.StopSpeaking;{終止朗讀} end;  procedure Resume; begin TTS.AudioResume;{恢復朗讀} end;  function IsSpeaking:Boolean; var Check:Boolean; begin if TTS.IsSpeaking then {判斷當前狀態} begin Check:=TRUE;{當前正在朗讀} end else begin Check:=FALSE;{當前沒有朗讀} end; Result:=Check;{返回狀態值} end;  procedure Destory; begin TTS:=nil;{釋放物件} end; end. 5、在Project1.dpr的begin前面添加如下待導出過程函數列表: exports Create index 1, Read index 2, Pause index 3, Resume index 4, Stop index 5, IsSpeaking index 6, Destory index 7; 編譯通過後即可得到封裝有TTS語音介面的動態連結程式庫: Project1.dll。  四、在VC 中調用TTS動態連結程式庫 1、選"File","New…"新建一MFC AppWizard(exe)工程TTSCall。最後一步選擇基類爲CformView。其餘可取缺省設置。 2、在Form上添加四個按鈕,分別爲:IDC_BUTTON1"朗讀";IDC_BUTTON2"暫停";IDC_BUTTON4"恢復";IDC_BUTTON3"停止",以及一編輯框IDC_EDIT1。並添加四個按鈕的處理函數:OnRead、OnPause、OnResume、OnStop和編輯框EN_CHANGE事件的回應函數:OnChangeEdit。通過ClassWizard爲編輯框同一變數m_Text綁定。 3、爲CTTSCallView類添加兩個變數: BOOL m_bCreated; HINSTANCE m_DLL;並在構造函數中初始化之。 CTTSCallView::CTTSCallView() : CFormView(CTTSCallView::IDD) { //{{AFX_DATA_INIT(CTTSCallView) m_Text = _T("Hello! Welcome to use this software developed by LangRui."); //}}AFX_DATA_INIT m_DLL = NULL; m_bCreated=FALSE; } 4、在視類中的初始化函數中添加代碼: void CTTSCallView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); } 5、實現朗讀功能: void CTTSCallView::OnRead() { m_DLL=LoadLibrary("Project1.dll"); //動態載入動態連接庫 void (*Create)(void); //取得DLL中的Create函數 Create=(void(*)(void))::GetProcAddress(m_DLL,"Create"); Create(); m_bCreated=TRUE; void (*Read)(char*); //取得DLL 中的Read函數 Read=(void(*)(char*))::GetProcAddress(m_DLL,"Read"); //獲取編輯框內容 UpdateData(TRUE); char buf[10000]; ::strcpy(buf,m_Text); Read(buf);//朗讀編輯框的內容。 GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);//"朗讀"按鈕不可用 GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); //"暫停"按鈕可用 GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);//"恢復"按鈕不可用 GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); //"停止"按鈕可用 } 6、實現暫停功能: void CTTSCallView::OnPause() { m_DLL=LoadLibrary("Project1.dll"); void (*Pause)(); Pause=(void(*)())::GetProcAddress(m_DLL,"Pause"); BOOL (*IsSpeaking)(); //判斷是否正在朗讀 IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); if(IsSpeaking()) { Pause(); GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); } } 7、實現恢復功能: void CTTSCallView::OnResume() { m_DLL=LoadLibrary("Project1.dll"); void (*Resume)(); Resume=(void(*)())::GetProcAddress(m_DLL,"Resume"); BOOL (*IsSpeaking)(); IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); if(!IsSpeaking()) { Resume(); GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); } } 8、實現停止功能: void CTTSCallView::OnStop() { m_DLL=LoadLibrary("Project1.dll"); void (*Stop)(); Stop=(void(*)())::GetProcAddress(m_DLL,"Stop"); Stop();//停止朗讀 GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); } 9、當編輯框內容發生改變,而又沒有進行朗讀時,應當處於準備朗讀狀態: void CTTSCallView::OnChangeEdit() { if(m_bCreated) { m_DLL=LoadLibrary("Project1.dll"); BOOL (*IsSpeaking)(); IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); if(!IsSpeaking()) { GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); } } } 10、當程式退出時應釋放載入的動態連結程式庫,添加虛函數DestoryWindow() BOOL CTTSCallView::DestroyWindow() { AfxFreeLibrary(m_DLL); return CFormView::DestroyWindow(); } 五、運行測試 將由Delphi編制的動態連結程式庫Project1.dll複製到VC的TTSCall 工程的Debug 目錄下。編譯並運行TTSCall工程,在編輯框上寫一端英文,按下"朗讀"按鈕,就可以聽到利用TTS全程化語音技術所發出的抑揚頓挫的聲音。 小結:TTS是全程化語音技術,它可以實現英文單詞以及短語的準確發音,甚至可以獨立完成整篇英文文章的流暢朗讀。而且TTS技術是建立在英文閱讀規則基礎上的語音合成技術,並非將單詞一個一個拆開機械得進行朗讀,因此在語氣的轉折和單詞的銜接上都非常自然,問句和祈使句的升降調也能很好的表現出來。
系統時間:2024-07-03 18:03:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!