• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

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

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 118次 | 進入軟件測試論壇討論

    領測軟件測試網 信息產業部電子第二十二研究所青島分所 郎銳

    現在有些軟件尤其是翻譯類軟件多提供有語音輸出的功能,比較有名的有《金山詞霸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技術是建立在英文閱讀規則基礎上的語音合成技術,并非將單詞一個一個拆開機械得進行朗讀,因此在語氣的轉折和單詞的銜接上都非常自然,問句和祈使句的升降調也能很好的表現出來。 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>