朗讀練習小程式出現ole的錯誤 |
答題得分者是:cmf
|
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
|
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
不要用複製的
用安裝的 http://microsoft.com/speech/
------
︿︿ |
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
出現ole的錯誤 REGDB_E_CLASSNOTREG
Indicates that a specified class is not registered in the registration database. E_OUTOFMEMORY
Out of memory. E_INVALIDARG
Indicates one or more arguments are invalid. E_UNEXPECTED
Indicates an unexpected error occurred. CLASS_E_NOAGGREGATION
Indicates this class cannot be created as part of an aggregate.
------
︿︿ |
flyup
資深會員 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
混合編程實現英文文章的語音輸出 現在有些軟體尤其是翻譯類軟體多提供有語音輸出的功能,比較有名的有《金山詞霸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技術是建立在英文閱讀規則基礎上的語音合成技術,並非將單詞一個一個拆開機械得進行朗讀,因此在語氣的轉折和單詞的銜接上都非常自然,問句和祈使句的升降調也能很好的表現出來。
|
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
語音sdk
http://www.cnetseek.com/gb/index.html william 的回應
This one is strange. However maybe the COM on 95 is too old (try installing the latest IE) or try compiling the application under 95 as the last method. I have encountered similar problem long ago running application compiled under 98SE not working on 95, at that time I need to compile the application in 95. Hope this helps.
------
︿︿ |
jackkcg
站務副站長 發表:891 回覆:1050 積分:848 註冊:2002-03-23 發送簡訊給我 |
不知問的人 問題解決了嗎? 這一題 c sir 可熱心問了粉多人 *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
********************************************************** 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind |
flyup
資深會員 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
利用Text To Speech技術編程 用金山詞霸2000進行查字典時,可以同時讀出相應的英文單詞,這大大方便了用戶的使用。 其實,我們也可以在自己的應用程序中加入這種功能。金山詞霸2000中利用的語音發聲就是微軟的Text To Speech技術,簡稱為MSTTS。 在金山詞霸2000的安裝過程中,將自動安裝MSTTS,我們也可以利用金山詞霸2000安裝光盤中的MSTTS.EXE文件單獨安裝。 安裝成功後,系統的Windows目錄下將有一個Speech子目錄,其中安裝了相應的支持文件。其中的Vcmd.exe作為進程外的自動化服務器,提供將文本轉換為語音的服務。 Vtxtauto.tlb為相應的類型庫,對服務器的介面給出了與語言無關的描述。在註冊表中註冊了相應的介面和自動化對像Speech.VoiceText.1。 下面給出一個使用Delphi利用相應介面進行開發的簡單例子,程序可以讀出一個文本編輯元件中的文本。例子主要利用Win32的COM API進行編程,該方法同樣適用於VC等開發語言。 首先,選擇Project|Import Type Library選單項檢查是否註冊了相應的類型庫文件Vtxtauto.tlb,如果沒有,選擇安裝目錄下的Vtxtauto.tlb文件進行註冊,此時,Delphi將在Import子目錄下生成該類型庫的Object Pascal"包裝"文件VtxtAuto_TLB.Pas,打開該文件可以看到該自動化對像支持的介面較為簡單,只有一個IVTxtAuto介面,下面是該介面的說明: IVTxtAuto = interface(IDispatch) ['{FF2C7A50-78F9-11CE-B762-00AA004CD65C}'] procedure Register(const pszSite: WideString; const pszApp: WideString); safecall; procedure Speak(const pszBuffer: WideString; dwFlags: Integer); safecall procedure StopSpeaking; safecall; procedure AudioPause; safecall; procedure AudioResume; safecall; procedure AudioRewind; safecall; procedure AudioFastForward; safecall; procedure Set_Callback(const Param1: WideString); safecall; procedure Set_Speed(pdwSpeed: Integer); safecall; function Get_Speed: Integer; safecall; procedure Set_Enabled(pdwEnabled: Integer);safecall; function Get_Enabled: Integer; safecall; function Get_IsSpeaking: WordBool; safecall; property Callback: WideString write Set_Callback; property Speed: Integer write Set_Speed; property Enabled: Integer write Set_Enabled; property IsSpeaking: WordBool read Get_IsSpeaking; end; 新建一個應用程序,在新建的工程中加入VtxtAuto_TLB.Pas,並在主視窗單元中引用該文件。 在主視窗中加入一個編輯元件(TEdit)和一個按鈕(TButton),在主視窗單元中說明全局變量IVTxtAuto1:IVTxtAuto。 在主視窗的創建過程中加入如下程式碼: IVTxtAuto1:=nill; CoInitialize(nil);//初始化COM庫 OleCheck(CoCreateInstance(CLASS_VTxtAuto_,nil,CLSCTX_ALL,ⅡD_IVTxtAuto,IVTxtAuto1));//創建IVTxtAuto介面 IVTxtAuto1.Register('Demo1','Project1.Exe');//向服務器註冊 IVTxtAuto1.Set_Enabled(1);//使能TTS功能 IVTxtAuto1.Set_Speed(150);//設置語音速度 IVTxtAuto1.Speak('Hi,I am trying to speak to you, Do you hear me?',vtxtsp_VERYHIGH);//發聲 在Button1的Click事件處理過程中加入如下的程式碼: if IVTxtAuto1<>nil then IVTxtAuto1.Speak(Edit1.Text,vtxtsp_VERYHIGH) Else ShowMessage('服務器沒用初始化成功'); 編譯執行程序就可以聽到相應的Edit1編輯元件中文本的發音了。 對於介面的其他方法可以參照類型庫的說明進行使用。 另外,也可以利用註冊的OLE自動化對像Speech.VoiceText.1進行更為簡潔的開發。 宣告變量msttsServer:OleVariant,利用如下的語句產生自動化對像,msttsServer:=CreateOleObject('Speech.VoiceText.1')。 接著利用msttsServer自動化對像同樣可以調用前面介紹的介面方法,這和通常利用自動化對像對MS Word等進行編程的方法一樣。 利用相應的螢幕取詞技術,我們同樣可以實現金山詞霸2000的功能。以上程序在Win98和Delphi5.0下調試執行通過。
|
flyup
資深會員 發表:280 回覆:508 積分:385 註冊:2002-04-15 發送簡訊給我 |
Microsoft Text-to-speech engines Lernout & Hauspie TruVoice American English http://ftp.nctu.edu.tw/ftp/Vendors/Softking/soft/en/t/tv_enua.exe
http://ftp.isu.edu.tw/Windows/softking/soft/en/t/tv_enua.exe
ftp://ftp.nctu.edu.tw/Vendors/Softking/soft/en/t/tv_enua.exe 免費軟體:檔案大小 :998 k 有許多的軟體可以朗讀出英文來,但是很奇怪,裝了這些軟體卻一點都發不出英文來,到底是哪理出了問題。
很多會朗讀出英文的軟體都會用到所謂TTS(Text-to-speech)若你發布出英文來,你可以加裝這個軟體,這是American English 美式英文版。 或另一套
由微軟所出的Text-to-Speech (TTS) Package 可以讓你的電腦正確的朗讀出英文來。
Microsoft Text-to-Speech Package(TTS) 1.0
下載:
http://ftp.nctu.edu.tw/ftp/Vendors/Softking/soft/en/r/ReaderTTSInstallENG.exe http://ftp.isu.edu.tw/Windows/softking/soft/en/r/ReaderTTSInstallENG.exe ftp://ftp.nctu.edu.tw/Vendors/Softking/soft/en/r/ReaderTTSInstallENG.exe
|
kan0515
中階會員 發表:56 回覆:120 積分:50 註冊:2002-06-24 發送簡訊給我 |
|
mobitaco
一般會員 發表:19 回覆:22 積分:8 註冊:2003-09-24 發送簡訊給我 |
|
mobitaco
一般會員 發表:19 回覆:22 積分:8 註冊:2003-09-24 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
這個題目我也做過,不過到最後的結果,感覺到微軟重簡輕繁的政策,讓我非常感冒~~~~裝了MSTTS,除了英文正常,簡体中文正常以外,遇到繁体字,就念的亂七八糟~~
可能是BIG5用的人不多(相對數字),就不管這塊市場,反正能寫能看繁体字就好,是不是? 我也真的很怨恨台灣資策會早期匯整這個BIG5內碼,無法與世界通用的UNICODE直接簡單對應,中國的GBK碼都完整收錄了繁体字,而且繁簡字還有符號表都可以簡單與UNICODE表對照(加個數字就對上了),人家肯把繁体字完整收錄進字庫,為什麼台灣官方就一定要堅守什麼怪原則,導至在非UNICODE的環境下(DELPHI大部份的元件都不支持UNICODE),繁体系統看簡体程式是一片亂碼,簡体系統看繁体程式卻大部份正常~這不太公平吧~
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
|
cxg
中階會員 發表:116 回覆:192 積分:76 註冊:2004-02-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |