• <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),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            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.¢% 閱讀(1969) 評論(0)  編輯 收藏 引用 所屬分類: VC
            轉(zhuǎn) VC使用TTS發(fā)聲
            2010-01-08 17:13
            MFC使用TTS發(fā)音,后來在VC知識(shí)庫發(fā)現(xiàn)一篇不錯(cuò)的文章,大家可以上去看一下(http://www.vckbase.com/document/viewdoc/?id=1051)但是文章寫得太簡單,而且他實(shí)現(xiàn)的方法一定要在創(chuàng)建MFC項(xiàng)目的時(shí)候在選上Automation,而我現(xiàn)在講一下在我們以有的項(xiàng)目上添加TTS發(fā)音功能(創(chuàng)建項(xiàng)目的時(shí)候沒有選上Automation)。
            ????? 下面我把實(shí)現(xiàn)步驟寫下來:
            1、??????? 下載Microsoft Speech SDK, version 5.1,要實(shí)現(xiàn)中文發(fā)音的話要再下載個(gè)SimpChinese Speech Package
            2、??????? 安裝了Microsoft Speech SDK, version 5.1后在C:\Program Files\Common Files\Microsoft Shared\Speech目錄下找到sapi.dll
            3、??????? sapi.dll復(fù)制到你的項(xiàng)目文件下。
            4、??????? 打開 MFC ClassWizard,選擇 Automation 頁,單擊按鈕"Add Class…",選擇"From a type library…",選中"sapi.dll"文件,這時(shí)系統(tǒng)會(huì)出現(xiàn) confirm Classes 對話框,詢問將要導(dǎo)入的類(有20多個(gè)類)。如果只要實(shí)現(xiàn)發(fā)音功能,只要導(dǎo)入IspeechObjectTokenIspeechObjectTokensIspeechVoice3個(gè),其它類的功能我還在研究中。(如果在建項(xiàng)目的時(shí)候勾選了Automation,系統(tǒng)會(huì)自動(dòng)幫你生成3個(gè)文件,分別是DlgProxy.cppDlgProxy.h還有一個(gè)根據(jù)你項(xiàng)目名.odl文件,如果沒有勾選上Automation就不會(huì)創(chuàng)建這三個(gè)文件,所以我們要實(shí)現(xiàn)發(fā)音功能,就要自己添加修改這三個(gè)文件)
            5、??????? 沒有自動(dòng)生成的文件怎么辦呢?最好的辦法就是新建一個(gè)項(xiàng)目,它的名稱和你現(xiàn)有的項(xiàng)目名稱一樣,然后在創(chuàng)建MFC Dialog Based項(xiàng)目的時(shí)候,選上Automation,然后做步驟4,將它生成的3個(gè)文件復(fù)制并加入到你現(xiàn)有項(xiàng)目中。
            6、??????? 復(fù)制好后,就要在一些文件上添加修改代碼了。下面我以一個(gè)名為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、??????? 添加個(gè)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)行會(huì)出錯(cuò),如果有朋友知道原因的話請告訴我)

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

            精品久久综合1区2区3区激情| 久久久久无码精品国产| 久久久久无码中| 亚洲人成无码www久久久| 国产A级毛片久久久精品毛片| 日韩人妻无码精品久久久不卡| 久久66热人妻偷产精品9| 久久国产高清一区二区三区| 久久99久久成人免费播放| 亚洲AV成人无码久久精品老人| 成人资源影音先锋久久资源网| 久久久久亚洲爆乳少妇无| 久久久一本精品99久久精品66| 国产精自产拍久久久久久蜜| 久久精品aⅴ无码中文字字幕重口| 精品无码人妻久久久久久| 亚洲AV乱码久久精品蜜桃| 青青热久久国产久精品 | 精品国产91久久久久久久| 久久久中文字幕日本| 99精品国产在热久久 | 欧美熟妇另类久久久久久不卡| 99久久综合国产精品二区| 久久w5ww成w人免费| 中文字幕久久亚洲一区| 久久久精品国产亚洲成人满18免费网站| 久久婷婷国产综合精品| 亚洲乱码中文字幕久久孕妇黑人| 国产真实乱对白精彩久久| 日本福利片国产午夜久久| 97久久久精品综合88久久| 久久精品国产日本波多野结衣| 深夜久久AAAAA级毛片免费看| 精品国产91久久久久久久a| 国产一久久香蕉国产线看观看| 精品久久久久久久久中文字幕| 秋霞久久国产精品电影院| 久久综合伊人77777麻豆| 亚洲中文久久精品无码ww16| 精品多毛少妇人妻AV免费久久 | 欧洲人妻丰满av无码久久不卡|