1、利用微软 Speech SDK 5.1 开发语音识别系统主要步骤 微软语音识别分两种模式:文本识别模式和命令识别模式 .此两种模式的主要区别,主要在于识别过程中使用的匹配字典不同.前者使用的是通用字典,特点是内容多,覆盖的词汇量大,字典由 sdk 提供.适用于没有预定目标的随机听写之类的应用 .同时因为词汇量大直接导致识别的精度降低,识别速度较慢 .后者的字典需要 开发者自己编写,就是你们所说的 xml 文件.xml 文件作为一种数据存储的方式,有一定的格式, 定义了 sdk 需要确定的一些标签, 和用以匹配的词汇.这种方式由开发者定义词汇的数量 ,大大降低匹配过程中需要检索的词汇量 ,提高了
2、识别速度.同时因为侯选项极少 ,所以一般不会识别错误 .其缺点也是明显的:词汇量小,只有预先输入字典的词汇可以被识别出来,所以一般用来作为常用命令的识别, 方便用户操作,代替菜单命令等. 利用微软 Speech SDK 5.1 在 MFC 中进行语音识别开发时的主要步骤,以 Speech API 5.1+VC6 为例: 注意:要在工程设置(project settings)添加 sapi.lib 文件和一些头文件。1、初始化 COM 端口 一般在 CWinApp 的子类中,调用 CoInitializeEx 函数进行 COM 初始化,代码如下: :CoInitializeEx(NULL,COI
3、NIT_APARTMENTTHREADED); / 初始化 COM 2、创建识别引擎 微软 Speech SDK 5.1 支持两种模式的:共享(Share)和独享(InProc )。一般情况下可以使用共享型,大的服务型程序使用 InProc。如下: hr = m_cpRecognizer.CoCreateInstance(CLSID_SpSharedRecognizer);/Share hr = m_cpRecognizer.CoCreateInstance(CLSID_SpInprocRecognizer);/InProc 如果是 Share 型,可直接进到步骤 3;如果是 InProc 型
4、,必须使用 ISpRecognizer:SetInput 设置语音输入。如下: CComPtr cpAudioToken; /定义一个 token hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, /建立默认的音频输入对象 if (SUCCEEDED(hr) hr = m_cpRecognizer-SetInput(cpAudioToken, TRUE); 或者: CComPtr cpAudio; /定义一个音频对象 hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, /建立默认的
5、音频输入对象 hr = m_cpRecoEngine-SetInput(cpAudio, TRUE);/设置识别引擎输入源 3、创建识别上下文接口 调用 ISpRecognizer:CreateRecoContext 创建识别上下文接口( ISpRecoContext),如下: hr = m_cpRecoEngine-CreateRecoContext( 4、设置识别消息 调用 SetNotifyWindowMessage 告诉 Windows 哪个是我们的识别消息,需要进行处理。如下: hr = m_cpRecoCtxt-SetNotifyWindowMessage(m_hWnd, WM_R
6、ECOEVENT, 0, 0); SetNotifyWindowMessage 定义在 ISpNotifySource 中。 5、设置我们感兴趣的事件 其中最重要的事件是”SPEI_RECOGNITION“。参照 SPEVENTENUM。代码如下: const ULONGLONG ullInterest = SPFEI(SPEI_SOUND_START) | SPFEI(SPEI_SOUND_END) | SPFEI(SPEI_RECOGNITION) ; hr = m_cpRecoCtxt-SetInterest(ullInterest, ullInterest); 6、创建语法规则 语法规
7、则是识别的灵魂,必须要设置。分为两种,一种是听说式(dictation),一种是命令式(command and control-C if (SUCCEEDED(hr) hr = m_cpDictationGrammar-LoadDictation(NULL, SPLO_STATIC);/加载词典 /C 然后利用 ISpRecoGrammar:LoadCmdxxx 加载语法,例如从 CmdCtrl.xml 中加载: WCHAR wszXMLFile20=L“; MultiByteToWideChar(CP_ACP, 0, (LPCSTR)“CmdCtrl.xml“ , -1, wszXMLFil
8、e, 256);/ANSI 转 UNINCODE hr = m_cpCmdGrammar-LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC); 注意:C/dictation hr = m_cpCmdGrammar-SetRuleState( NULL,NULL,SPRS_ACTIVE );/C CSpEvent event; switch (event.eEventId) case SPEI_RECOGNITION: /识别出了语音输入 m_bGotReco = TRUE; static const WCHAR wszUnrecognized = L“; CSpDynamicString dstrText; /取得识别结果 if (FAILED(event.RecoResult()-GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE , BSTR SRout; dstrText.CopyToBSTR( CString Recstring; Recstring.Empty(); Recstring = SRout; /进一步处理 break; 9、释放创建的引擎、识别上下文对象、语法等。调用相应的 Release 函数即可。 至此最简单的识别就完成了。