• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            轉(zhuǎn) VC使用TTS發(fā)聲

            Posted on 2010-05-18 23:32 S.l.e!ep.¢% 閱讀(1959) 評論(0)  編輯 收藏 引用 所屬分類: VC
            轉(zhuǎn) VC使用TTS發(fā)聲
            2010-01-08 17:13
            MFC使用TTS發(fā)音,后來在VC知識庫發(fā)現(xiàn)一篇不錯的文章,大家可以上去看一下(http://www.vckbase.com/document/viewdoc/?id=1051)但是文章寫得太簡單,而且他實現(xiàn)的方法一定要在創(chuàng)建MFC項目的時候在選上Automation,而我現(xiàn)在講一下在我們以有的項目上添加TTS發(fā)音功能(創(chuàng)建項目的時候沒有選上Automation)。
            ????? 下面我把實現(xiàn)步驟寫下來:
            1、??????? 下載Microsoft Speech SDK, version 5.1,要實現(xiàn)中文發(fā)音的話要再下載個SimpChinese Speech Package。
            2、??????? 安裝了Microsoft Speech SDK, version 5.1后在C:\Program Files\Common Files\Microsoft Shared\Speech目錄下找到sapi.dll。
            3、??????? sapi.dll復(fù)制到你的項目文件下。
            4、??????? 打開 MFC ClassWizard,選擇 Automation 頁,單擊按鈕"Add Class…",選擇"From a type library…",選中"sapi.dll"文件,這時系統(tǒng)會出現(xiàn) confirm Classes 對話框,詢問將要導(dǎo)入的類(有20多個類)。如果只要實現(xiàn)發(fā)音功能,只要導(dǎo)入IspeechObjectTokenIspeechObjectTokens,IspeechVoice3個,其它類的功能我還在研究中。(如果在建項目的時候勾選了Automation,系統(tǒng)會自動幫你生成3個文件,分別是DlgProxy.cppDlgProxy.h還有一個根據(jù)你項目名.odl文件,如果沒有勾選上Automation就不會創(chuàng)建這三個文件,所以我們要實現(xiàn)發(fā)音功能,就要自己添加修改這三個文件)
            5、??????? 沒有自動生成的文件怎么辦呢?最好的辦法就是新建一個項目,它的名稱和你現(xiàn)有的項目名稱一樣,然后在創(chuàng)建MFC Dialog Based項目的時候,選上Automation,然后做步驟4,將它生成的3個文件復(fù)制并加入到你現(xiàn)有項目中。
            6、??????? 復(fù)制好后,就要在一些文件上添加修改代碼了。下面我以一個名為test的工程為例子首先在test.cpp文件添加這些代碼(紅色):
            ???? BOOL CTestApp::InitInstance()
            {
            ????? if (!AfxOleInit())
            ????? {
            ????? ????? AfxMessageBox("OLE 程序初始化失敗。請確認(rèn) OLE 庫程序是正確的版本");
            ?????????? return FALSE;
            ????? }
            ????? AfxEnableControlContainer();
            ????? // Standard initialization
            ????? // If you are not using these features and wish to reduce the size
            ????? // of your final executable, you should remove from the following
            ????? // the specific initialization routines you do not need.
            #ifdef _AFXDLL
            ????? Enable3dControls();???????????????? // Call this when using MFC in a shared DLL
            #else
            ????? Enable3dControlsStatic();?? // Call this when linking to MFC statically
            #endif
            ????? ???? if (RunEmbedded() || RunAutomated())
            ????? {
            ?????????? // Register all OLE server (factories) as running. This enables the
            ?????????? // OLE libraries to create objects from other applications.
            ?????????? COleTemplateServer::RegisterAll();
            ????? }
            ????? else
            ????? {
            ?????????? // When a server application is launched stand-alone, it is a good idea
            ?????????? // to update the system registry in case it has been damaged.
            ?????????? COleObjectFactory::UpdateRegistryAll();
            ????? }
            ????? CTestDlg dlg;
            ????? m_pMainWnd = &dlg;
            ????? int nResponse = dlg.DoModal();
            ????? if (nResponse == IDOK)
            ????? {
            ?????????? // TODO: Place code here to handle when the dialog is
            ?????????? // dismissed with OK
            ????? }
            7、??????? 接著在testDlg.h文件添加以下代碼:
            ???? #include "sapi.h"
            class CtestDlgAutoProxy;
            /////////////////////////////////////////////////////////////////////////////
            // CTestDlg dialog
            class CTestDlg : public CDialog
            {
            ????? DECLARE_DYNAMIC(CTestDlg);
            ????? friend class CtestDlgAutoProxy;
            // Construction
            public:
            ????? virtual ~CTestDlg();
            ????? CTestDlg(CWnd* pParent = NULL); // standard constructor
            ?????ISpeechObjectToken recoObject;
            ????? LPDISPATCH pDisp;
            ????? CLSID CLSID_SpVoice;
            ????? ISpeechVoice voice;
            ????? ISpeechObjectTokens voiceList;
            // Dialog Data
            ????? //{{AFX_DATA(CTestDlg)
            ????? enum { IDD = IDD_TEST_DIALOG };
            ?????CComboBox?? m_voice; //拖控件并添加control類型數(shù)據(jù)成員
            ????? long??? m_Rate;
            ????? long??? m_Vol;
            ????? //}}AFX_DATA
            ????? // ClassWizard generated virtual function overrides
            ????? //{{AFX_VIRTUAL(CTestDlg)
            ????? protected:
            ????? virtual void DoDataExchange(CDataExchange* pDX);?? // DDX/DDV support
            ????? //}}AFX_VIRTUAL
            // Implementation
            protected:
            ????? HICON m_hIcon;
            ?????CtestDlgAutoProxy* m_pAutoProxy;
            ????? // Generated message map functions
            ????? //{{AFX_MSG(CTestDlg)
            ?????
            8、??????? 接著在testDlg.cpp添加下面代碼:
            #include "DlgProxy.h"
            ////////////////////////////////////
            IMPLEMENT_DYNAMIC(CTestDlg, CDialog);
            CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
            : CDialog(CTestDlg::IDD, pParent)
            {
            //{{AFX_DATA_INIT(CTestDlg)
            ?????? // NOTE: the ClassWizard will add member initialization here
            //}}AFX_DATA_INIT
            // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
            m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
            m_pAutoProxy = NULL;
            }
            CTestDlg::~CTestDlg()
            {
             if (m_pAutoProxy != NULL)
            ?????? m_pAutoProxy->m_pDialog = NULL;
            }
            //////////////////////////
            BOOL CTestDlg::OnInitDialog()
            {
            ?????? 。。。。。。。。。。。。。
            ?????? // TODO: Add extra initialization here
            CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);
            voice.CreateDispatch(CLSID_SpVoice);
            pDisp = voice.m_lpDispatch;
            HRESULT hr = pDisp->QueryInterface(CLSID_SpVoice, (void**)&voice.m_lpDispatch);
            if (hr == S_OK) {
            ?????? pDisp->Release();
            }
            else {
            ?????? voice.AttachDispatch(pDisp, TRUE);
            }
            m_Rate=0;//語速
            voice.SetRate(m_Rate);
            m_Vol=100; //音量
            voice.SetVolume(m_Vol);
            //用來獲取支持多少種聲音
            voiceList=voice.GetVoices(NULL,NULL);
            ?????? m_voice.SetCurSel(0);
            voice.SetRefVoice(voiceList.Item(0)); //item(0)是英文發(fā)音,果裝了中文包可設(shè)item(3)
            //為中文發(fā)音
            return TRUE; // return TRUE unless you set the focus to a control
            }
            9、??????? 添加個button
            void CTestDlg::OnButton1()
            {
            ????? ?????????? voice.Speak("you", 1);//發(fā)音
            }
            10、???? DlgProxy.cpp找到下面一句代碼:
            IMPLEMENT_OLECREATE2(CtestDlgAutoProxy, "test.Application", 0xc1b93196, 0x3df8, 0x4a61, 0xb1, 0x22, 0xa4, 0xc2, 0x8e, 0xe2, 0x75, 0xdb) 并將它注釋掉。(我不知道原因,但不注釋的話運(yùn)行會出錯,如果有朋友知道原因的話請告訴我)

            經(jīng)過上面的步驟后,就可以實現(xiàn)到發(fā)音了,可以用IspeechVoice類的函數(shù)調(diào)發(fā)音的速度和音量等。我試過了,在默認(rèn)情況下發(fā)音和金山詞霸差不多。

            久久婷婷五月综合97色| 久久99这里只有精品国产| 国产99久久久久久免费看 | 久久精品国产第一区二区三区| 久久人妻少妇嫩草AV无码专区| 99久久精品毛片免费播放| www亚洲欲色成人久久精品| 久久性生大片免费观看性| 亚洲综合伊人久久综合| 日本一区精品久久久久影院| 四虎亚洲国产成人久久精品| 久久久久AV综合网成人| 久久久久亚洲AV无码去区首| 一本色道久久HEZYO无码| 久久免费线看线看| 久久精品成人欧美大片| 色综合久久久久网| 国内精品九九久久精品| 久久久青草久久久青草| 久久精品国产亚洲αv忘忧草| 青青青国产精品国产精品久久久久| 亚洲人成无码久久电影网站| 国内精品伊人久久久久av一坑| 精品久久久久中文字幕一区| 久久精品水蜜桃av综合天堂| 亚洲国产精品一区二区三区久久| 国产成人综合久久综合| 久久人人爽人人爽人人片AV麻烦 | 婷婷综合久久狠狠色99h| 亚洲国产成人久久综合碰| 青青草国产精品久久久久| 日韩精品无码久久久久久| 香蕉aa三级久久毛片| 国产一区二区三精品久久久无广告| 亚洲AV日韩精品久久久久| 亚洲午夜无码久久久久小说| 国内精品久久久久久久久| 久久精品成人国产午夜| 99久久精品毛片免费播放| 久久久久久久人妻无码中文字幕爆| 亚洲欧美久久久久9999|