1)在构造语音类之前,必须先设置好工程环境:
a、从微软官方网站下载windows speech sdk并安装,然后在Visual Studio 6.0中进行相关设置,在Project Setings选项的C++选项卡的“分类:预处理器”添加“,__WIN32_DCOM”(为预先初始化COM组件成功);
b、将预处理头文件选项选中“自动使用预补偿页眉”;
c、在常规选项卡中选择“实用MFC静态连接库”;
2)封装语音类
由于采用面向对象的编程理念,借助UML(Unified Modeling Language统一建模语言)构造CSPEECH语音类如下
CSPEECH类
+ void InitSR(); //初始化语音
+void RecoEvent();//识别命令函数
+BOOL b_initSR;
+BOOL b_Cmd_Grammar;
//3个语音接口
+CComPtr<isprecocontext> m_cpRecocontxt; <br> +CComPtr<isprecogrammar> m_cpRecoGrammar; <br> +CComPtr<isprecognizer> m_cpRecoEngine; <br> <br> 然后开始添加语音类,需要注意的是在定义语音类的头文件中,包含〈sphelper.h〉并且自定义语音识别消息和类型 <br> #define GID_CMD_GR 333333 <br> #define WM_RECOEVENT WM_USER+102 <br> 剩下来就是对cpp文件的函数initSR()和RecoEvent()补充函数体 <br> <br> 3)具体见下面代码: <br> (1)void CSpeech::initSR() <br> { <br> HRESULT hr=S_OK; <br> hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);//创建识别引擎COM实例 <br> if(SUCCEEDED(hr)) <br> { <br> hr =m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt );//创建识别上下文 <br> } <br> else <br> MessageBox(hWnd,"error1","error",S_OK); <br> if(SUCCEEDED(hr)) <br> { <br> hr = m_cpRecoCtxt->SetNotifyWindowMessage(hWnd, WM_RECOEVENT, 0, 0 ); <br> }//消息机制设置,使计算机时刻监听语音消息 <br> else <br> MessageBox(hWnd,"error2","error",S_OK); <br> if (SUCCEEDED(hr)) <br> { <br> ULONGLONG ullMyEvents = SPFEI(SPEI_RECOGNITION) | SPFEI(SPEI_HYPOTHESIS); <br> hr = m_cpRecoCtxt->SetInterest(ullMyEvents, ullMyEvents); <br> } <br> else <br> MessageBox(hWnd,"error3","error",S_OK); <br> //设置默认的音频 <br> CComPtr<ispaudio> m_cpAudio; <br> hr=SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN,&m_cpAudio);//建立默认的音频输入对象 <br> hr=m_cpRecoEngine->SetInput(m_cpAudio,TRUE);//设置识别引擎输入源 <br> hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGrammar);//创建命令语法 <br> b_Cmd_Grammar=TRUE; <br> if(FAILED(hr)) <br> { <br> MessageBox(hWnd,"error 4","error",S_OK); <br> } <br> hr=m_cpCmdGrammar->LoadCmdFromResource(NULL,MAKEINTRESOURCEW(IDR_CMDCTRL),L"SRGRAMMAR",MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL), SPLO_DYNAMIC);//加载命令语法文件 <br> if(FAILED(hr)) <br> { <br> MessageBox(hWnd,"error5","error",S_OK); <br> } <br> b_initSR=TRUE; <br> } <br> <br> (2)BOOL CSpeech::RecoEvent() <br> { <br> USES_CONVERSION; <br> CSpEvent event; <br> while(event.GetFrom(m_cpRecoCtxt)==S_OK) <br> { <br> switch(event.eEventId) <br> { <br> case SPEI_RECOGNITION: <br> { <br> static const WCHAR wszUnrecognized[]=L"<unrecognized>"; <br> CSpDynamicString dstrText; <br> if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL))) <br> { <br> dstrText=wszUnrecognized; <br> } <br> dstrText.CopyToBSTR(&SRout); <br> Recstring.Empty(); <br> Recstring=SRout; <br> if(b_Cmd_Grammar) <br> { <br> if(Recstring=="左") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"左转",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> m_OpenGL->m_baiscobj->LEFT=1; <br> return TRUE ; <br> } <br> <br> if(Recstring=="向下走") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"开始后退",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> m_OpenGL->m_baiscobj->BACK=1; <br> return TRUE ; <br> } <br> if(Recstring=="最小化") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"最小化",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> SendMessage(hWnd,WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(0, 0)); <br> <br> return TRUE; <br> } <br> if(Recstring=="右") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"开始右转",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> m_OpenGL->m_baiscobj->RIGHT=1; <br> return TRUE ; <br> } <br> if(Recstring=="停下来") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"动作开始了",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> m_OpenGL->m_baiscobj->Move=0; <br> m_OpenGL->m_baiscobj->BACK=0; <br> m_OpenGL->m_baiscobj->LEFT=0; <br> m_OpenGL->m_baiscobj->RIGHT=0; <br> return TRUE ; <br> } <br> <br> if(Recstring=="跑步") <br> { <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return FALSE; <br> } <br> HRESULT hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"动作开始了",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> m_OpenGL->m_baiscobj->Move=1; <br> return TRUE ; <br> } <br> if(Recstring=="退出") <br> { <br> m_OpenGL->CleanUp(); // 结束处理 <br> PostQuitMessage(0); <br> return TRUE; <br> } <br> } <br> } <br> } <br> }return TRUE; <br> } <br> 要注意的是RecoEvent()必须能处理人物、摄像头的漫游,所以在人物、摄像机类的行为函数中添加了控制变量Move、BACK、LEFT、RIGHT;并附了初值1,当在行为函数中为1时行为函数体执行,所以也必须 <br> #include "OpenGL.h" <br> #include "baiscobj.h" <br> 其间我们借助于指针变量,巧妙的使语音能控制行为,却不影响动画的刷新,但不足的是由于opengl动画md2模型的不能导入成功,使踢球,跳木箱等功能函数没有完成,所以只要行为函数出来,可通过上述同样方法实现语音控制。 <br> <br> 4)如何在winmain()函数中执行语音程序? <br> 首先包含语音头文件〈sapi.h〉 <br> 接着(#define CSpeech speech)定义语音类对象 <br> <br> INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,INT )// WinMain程序入口 <br> { <br> ::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);//初始化COM <br> …… <br> char cc[]="tml"; <br> WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, <br> GetModuleHandle(NULL), NULL, NULL, NULL, (LPCTSTR)IDR_MENU1, <br> cc, NULL }; <br> RegisterClassEx( &wc ); <br> m_OpenGL=new OpenGL();// <br> hWnd = CreateWindowEx(NULL,cc,"智能精灵键盘(↑进↓退→右←左UP仰DOWM俯)", <br> dwStyle|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,nX,nY,Width, Height,NULL,NULL,hInst,NULL); // 创建窗口 <br> ShowWindow( hWnd, SW_SHOWDEFAULT ); // 显示窗口 <br> UpdateWindow( hWnd ); // 刷新窗口 <br> speech.b_Cmd_Grammar=FALSE; <br> speech.initSR(); <br> GameLoop(); // 进入消息循环 <br> return 0; <br> } <br> 通过speech.initSR(),执行语音的初始化,为了设置一个简单的语音识别开关,简单的添加一个任务栏,只有语音这一个菜单资源,然后利用消息机制,在消息处理函数里Switch(message)里添加: <br> case WM_COMMAND: <br> switch(LOWORD(wParam)) <br> { <br> case IDM_SPEECH:speech.startcmd(); <br> } <br> return 0;break; <br> 即当单击语音菜单时,则使语音功能完全激活,下面是这个函数的实体: <br> <br> void CSpeech::startcmd() <br> { <br> if(b_initSR) <br> { <br> HRESULT hr=m_cpCmdGrammar->SetRuleState(NULL,NULL,SPRS_ACTIVE); <br> ISpVoice *pVoice=NULL; <br> if(FAILED(CoInitialize(NULL))) <br> { <br> MessageBox(hWnd,"Error to initialize COM","error",S_OK); <br> return ; <br> } <br> hr=CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice); <br> if(SUCCEEDED(hr)) <br> { <br> hr=pVoice->Speak(L"语法已经激活",0,NULL); <br> pVoice->Release(); <br> pVoice=NULL; <br> } <br> CoUninitialize(); <br> } <br> } <br> 5)在所有的工作完成之前,还必须先在项目工程下添加XML语法文件,通过initSR()中的LoadCmdFromResource()函数加载;XML文件可通过以记事本形式打开编辑。具体如下: <br> -<grammar langid="804">-<rule toplevel="ACTIVE" name="COMMAND">-<l><p>下</p>
<p>左</p>
<p>右</p>
<p>向上走</p>
<p>向下走</p>
<p>跳</p>
<p>停下来</p>
<p>跑步</p>
<p>识别</p>
<p>语音</p>
<p>还原</p>
<p>文件</p>
<p>踢球 <br></p>
<p></p>
<br><p><u><font color="#0000ff">需要的留下Email,我给大家发</font></u></p>
</l></rule></grammar></unrecognized></ispaudio></isprecognizer></isprecogrammar></isprecocontext>
分享到:
相关推荐
xp下用Micosoft Speech Object Library Version5.1开发的语音软件在win7下不能正常使用,或visual studio 2013不能调用语音开发包。偶然所得本程序,可修复所述问题,请安装。 修复XP,Win7系统下不能使用TTS语音...
4、安装了sdk5.1后,在Delphi里面Project对话框里会有一个 Micosoft Speech Object Library[Version5.1]的ActiveX组件,将它导入。 你会看到一大堆控件,不过你要用的只是TSpVoice而已。 TSpVoice实现了对SAPI的...
delphi中开发需要先导入TTS的ActiveX控件, 方法如下:在Delphi开发界面的Project菜单下Import Type Library, 对话框里会有一个 Micosoft Speech Object Library Version5.1 的ActiveX组件,导入, 生成SpeechLib_TLB...
Microsoft System CLR Types For SQL Server 2012 /SQLSysClrTypes.msi
Micosoft Virtual PC 2004 学习OS的最好操作平台
不多说,CLR Types for Microsoft SQL Server 2014,64位,支持 ReportViewer 2015。 找了好久才找到,真的来之不易,象征性收1个积分。
micosoft vedio learning
官方正版工具类 SQLSysClrTypes 包含 x86和x64两个版本打包 WSUS部署时遇到问题,所以去官网下了这个
因为兼容性问题,在Windows8.1下不能运行Micosoft Visual c++6.0,这回可以试一试
Micosoft Project另存为pdf的解决办法及软件 用project另存为PDF的时候出现无法连接打印机的问题 装了我的软件就ok了
在原来基础上改写了能在基于CF的PPC(packet PC )上运行的游戏。 含源代码。供开发PPC 游戏的朋友参考。 在多普达996、micosoft mobile 2003 上测试通过。
微软经典封装工具CDIMAGE 2 47 CDIMAGE 2 47 CD ROM and DVD ROM Premastering Utility Copyright C Microsoft 1993 2000 All rights reserved For Microsoft internal use only Usage: CDIMAGE [options] source...
此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份...
此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份...
这个是全英文的教程,不过可以编辑翻译,大家需要了解SP2010的可以参考参考!
此外,在一个特定版本 Windows 的基础上,Windows Sockets 也定义 了一个二进制接口(ABI),以此来保证应用 Windows Sockets API 的应用程序能够在任何 网络软件供应商的符合 Windows Sockets 协议的实现上工作。...
本资源为Mac系统安装包,正式版10.2.9,可使用此版升级最新版。非bate版本! 微软远程桌面 远程控制工具。远程控制与访问 Windows 操作系统。
Microsoft Recognizers文本概述Microsoft.Recognizers.Text提供对数字,单位和日期/时间等实体的强大识别和解析。 用多种语言表达。 全面支持中文,英文,Fren Microsoft识别器文本概述Microsoft.Recognizers.Text...
Winsock 完成端口模型封装的类 Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Micosoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含...
航空订票系统是一款集成电话客户管理、订票管理、会员管理、积分管理、短信发送、员工管理等强大功能的订票系统,广泛应用于有各个航空售票点,帮助您迅速了解客户的需求, 极大提高业务成交量, 提升客户满意度,协助...