• <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.¢%

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

            轉 VC使用TTS發聲

            Posted on 2010-05-18 23:32 S.l.e!ep.¢% 閱讀(1958) 評論(0)  編輯 收藏 引用 所屬分類: VC
            轉 VC使用TTS發聲
            2010-01-08 17:13
            MFC使用TTS發音,后來在VC知識庫發現一篇不錯的文章,大家可以上去看一下(http://www.vckbase.com/document/viewdoc/?id=1051)但是文章寫得太簡單,而且他實現的方法一定要在創建MFC項目的時候在選上Automation,而我現在講一下在我們以有的項目上添加TTS發音功能(創建項目的時候沒有選上Automation)。
            ????? 下面我把實現步驟寫下來:
            1、??????? 下載Microsoft Speech SDK, version 5.1,要實現中文發音的話要再下載個SimpChinese Speech Package
            2、??????? 安裝了Microsoft Speech SDK, version 5.1后在C:\Program Files\Common Files\Microsoft Shared\Speech目錄下找到sapi.dll
            3、??????? sapi.dll復制到你的項目文件下。
            4、??????? 打開 MFC ClassWizard,選擇 Automation 頁,單擊按鈕"Add Class…",選擇"From a type library…",選中"sapi.dll"文件,這時系統會出現 confirm Classes 對話框,詢問將要導入的類(有20多個類)。如果只要實現發音功能,只要導入IspeechObjectTokenIspeechObjectTokensIspeechVoice3個,其它類的功能我還在研究中。(如果在建項目的時候勾選了Automation,系統會自動幫你生成3個文件,分別是DlgProxy.cppDlgProxy.h還有一個根據你項目名.odl文件,如果沒有勾選上Automation就不會創建這三個文件,所以我們要實現發音功能,就要自己添加修改這三個文件)
            5、??????? 沒有自動生成的文件怎么辦呢?最好的辦法就是新建一個項目,它的名稱和你現有的項目名稱一樣,然后在創建MFC Dialog Based項目的時候,選上Automation,然后做步驟4,將它生成的3個文件復制并加入到你現有項目中。
            6、??????? 復制好后,就要在一些文件上添加修改代碼了。下面我以一個名為test的工程為例子首先在test.cpp文件添加這些代碼(紅色):
            ???? BOOL CTestApp::InitInstance()
            {
            ????? if (!AfxOleInit())
            ????? {
            ????? ????? AfxMessageBox("OLE 程序初始化失敗。請確認 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類型數據成員
            ????? 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)是英文發音,果裝了中文包可設item(3)
            //為中文發音
            return TRUE; // return TRUE unless you set the focus to a control
            }
            9、??????? 添加個button
            void CTestDlg::OnButton1()
            {
            ????? ?????????? voice.Speak("you", 1);//發音
            }
            10、???? DlgProxy.cpp找到下面一句代碼:
            IMPLEMENT_OLECREATE2(CtestDlgAutoProxy, "test.Application", 0xc1b93196, 0x3df8, 0x4a61, 0xb1, 0x22, 0xa4, 0xc2, 0x8e, 0xe2, 0x75, 0xdb) 并將它注釋掉。(我不知道原因,但不注釋的話運行會出錯,如果有朋友知道原因的話請告訴我)

            經過上面的步驟后,就可以實現到發音了,可以用IspeechVoice類的函數調發音的速度和音量等。我試過了,在默認情況下發音和金山詞霸差不多。

            伊人久久大香线蕉av不卡| 久久精品无码专区免费 | 精品熟女少妇av免费久久| 久久久久亚洲爆乳少妇无| 99久久国产亚洲高清观看2024| 精品久久久久久成人AV| 99久久精品日本一区二区免费| 91精品国产综合久久婷婷| 国产精品99久久精品| 日本一区精品久久久久影院| 99久久www免费人成精品| 草草久久久无码国产专区| 久久久久亚洲AV无码专区桃色| 久久精品国产黑森林| 久久久高清免费视频| 精品国产青草久久久久福利| 久久亚洲精品国产精品| 青青青青久久精品国产| 久久久久这里只有精品| 久久精品中文字幕一区| 久久精品国产亚洲AV无码偷窥| 久久99国产亚洲高清观看首页 | 久久国产乱子精品免费女| 久久国产精品视频| 18岁日韩内射颜射午夜久久成人| 色偷偷久久一区二区三区| 久久99精品国产99久久6男男| 久久免费观看视频| 久久久精品人妻一区二区三区蜜桃 | 色婷婷噜噜久久国产精品12p| 国内精品综合久久久40p| 久久免费精品一区二区| 性做久久久久久久久| 国产精品久久久久天天影视| 久久国产免费直播| 97久久久久人妻精品专区| 少妇被又大又粗又爽毛片久久黑人| 亚洲va久久久噜噜噜久久| 久久久久久极精品久久久| 久久婷婷五月综合97色 | 99久久免费国产特黄|