使用微软Speech SDK 5.1(SAPI 5.1)语音开发包介绍

微软语音识别分两种模式:文本识别模式和命令识别模式.此两种模式的主要区别,主要在于识别过程中使用的匹配字典不同.前者使用的是通用字典,特点是内容多,覆盖的词汇量大,字典由sdk提供.适用于没有预定目标的随机听写之类的应用.同时因为词汇量大直接导致识别的精度降低,识别速度较慢.后者的字典需要 开发者自己编写,就是你们所说的xml文件.xml文件作为一种数据存储的方式,有一定的格式,定义了sdk需要确定的一些标签,和用以匹配的词汇.这种方式由开发者定义词汇的数量,大大降低匹配过程中需要检索的词汇量,提高了识别速度.同时因为侯选项极少,所以一般不会识别错误.其缺点也是明显的:词汇量小,只有预先输入字典的词汇可以被识别出来,所以一般用来作为常用命令的识别,方便用户操作,代替菜单命令等. 

利用微软Speech SDK 5.1在MFC中进行语音识别开发时的主要步骤,以Speech API 5.1+VC6为例: 

1、初始化COM端口 
一般在CWinApp的子类中,调用CoInitializeEx函数进行COM初始化,代码如下: 
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); // 初始化COM 
注意:调用这个函数时,要在工程设置(project settings)->C/C++标签,Category中选Preprocessor,在Preprocessor definitions:下的文本框中加上“,_WIN32_DCOM”。否则编译不能通过。 

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型,必须使用 ISpRecognizer::SetInput 设置语音输入。如下: 
CComPtr<ISpObjectToken> cpAudioToken;   //定义一个token 
hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, &cpAudioToken); //建立默认的音频输入对象 
if (SUCCEEDED(hr)) { hr = m_cpRecognizer->SetInput(cpAudioToken, TRUE);} 
或者: 
CComPtr<ISpAudio> cpAudio;   //定义一个音频对象 
hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);//建立默认的音频输入对象 
hr = m_cpRecoEngine->SetInput(cpAudio, TRUE);//设置识别引擎输入源 

3、创建识别上下文接口 
调用 ISpRecognizer::CreateRecoContext 创建识别上下文接口(ISpRecoContext),如下: 
hr = m_cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt ); 

4、设置识别消息 
调用 SetNotifyWindowMessage 告诉Windows哪个是我们的识别消息,需要进行处理。如下: 
hr = m_cpRecoCtxt->SetNotifyWindowMessage(m_hWnd, WM_RECOEVENT, 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、创建语法规则 
语法规则是识别的灵魂,必须要设置。分为两种,一种是听说式(dictation),一种是命令式(command and control---C&C)。首先 利用ISpRecoContext::CreateGrammar 创建语法对象,然后加载不同的语法规则,如下: 

//dictation 
hr = m_cpRecoCtxt->CreateGrammar( GIDDICTATION, &m_cpDictationGrammar ); 
if   (SUCCEEDED(hr)) 

hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);//加载词典 


//C&C 
hr = m_cpRecoCtxt->CreateGrammar( GIDCMDCTRL, &m_cpCmdGrammar); 
然后利用ISpRecoGrammar::LoadCmdxxx 加载语法,例如从CmdCtrl.xml中加载: 
WCHAR wszXMLFile[20]=L""; 
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml"   , -1, wszXMLFile, 256);//ANSI转UNINCODE 
hr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC); 
注意:C&C时,语法文件使用xml格式,参见Speech SDK 5.1 中的 Designing Grammar Rules。简单例子: 
<GRAMMAR LANGID="804"> 
    <DEFINE> 
       <ID NAME="CMD" VAL="10"/> 
    </DEFINE> 
    <RULE NAME="COMMAND" ID="CMD" TOPLEVEL="ACTIVE"> 
      <L> 
<p>你</P> 
<p>我</p> 
<p>他</p> 
      </L> 
    </RULE> 
</GRAMMAR> 
LANGI*="804"代表简体中文,在<*>...</*>中增加命令。 

7、在开始识别时,激活语法进行识别 
hr = m_cpDictationGrammar->SetDictationState( SPRS_ACTIVE );//dictation 
hr = m_cpCmdGrammar->SetRuleState( NULL,NULL,SPRS_ACTIVE );//C&C 

8、获取识别消息,进行处理 
截获识别消息(WM_RECOEVENT),然后处理。识别的结果放在CSpEvent的ISpRecoResult 中。如下: 

USES_CONVERSION; 
CSpEvent event; 

switch (event.eEventId) 

         case SPEI_RECOGNITION: 

//识别出了语音输入 
m_bGotReco = TRUE; 
static const WCHAR wszUnrecognized[] = L"<Unrecognized>"; 

CSpDynamicString dstrText; 

//取得识别结果 
if (FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE ,&dstrText, NULL))) 

dstrText = wszUnrecognized; 


BSTR SRout; 
dstrText.CopyToBSTR(&SRout); 

CString Recstring; 
Recstring.Empty(); 
Recstring = SRout; 

//进一步处理 
...... 

break; 


9、释放创建的引擎、识别上下文对象、语法等。调用相应的Release函数即可。 

至此最简单的识别就完成了。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中英文语音朗读程序(控件及源码)调试OK 先安装Microsoft Speech SDK 5.1,这是微软的声音支持控件 前面安装不多做介绍,一步一步安装即可 安装完成后,需要加载Delphi控件 在Delphi IDE中选择菜单Project,Import Type Library—点击按钮Add(C:\Program Files\Common Files\Microsoft Shared\Speech\ sapi.dll)—点击按钮Install-在Install对话框中点击按钮OK—在Confirm对话框中点击按钮Yes—在对话框中点击按钮OK。至此,共19个控件被添加到Delphi组件板ActiveX页上。其中spvoice控件是我们要使用的 Microsoft Speech SDK 5.1下载地址:http://intraweb.5d6d.com/thread-280-1-1.html SpVoice详解 属性 描述 AlertBoundary 取得或设置停顿分界线。 AllowAudioOutputFormatChangesOnNextSet 设置是否允许声音自动调整到合适状态以适应其音频输出。 AudioOutput .取得或设置当前声音使用的的音频输出对象 AudioOutputStream 取得或设置当前声音使用的的音频输出流对象。 EventInterests 取得或设置当前声音返回的事件类型。 Priority 取得或设置声音的优先级。 Rate 取得或设置阅读的速度。 Status 返回一个ISpeechVoiceStatus 对象用于显示当前阅读和事件的状态 SynchronousSpeakTimeout 取得或设置一个时间间隔,用于标识多久未获得一个输出设备后,一个同步的Speak 和SpeakStream将终止,以毫秒计算。 Voice 取得或设置发音对象。 Volume 取得或设置声音的大小 。 方法 描述 DisplayUI 是否在控制面板中展示详细设置。 GetAudioOutputs 返回一个可用的音频输出标记。 GetVoices 返回一个可用的发音对象。 IsUISupported 决定是否能通过控制棉板的音频设置来控制。 Pause 暂停朗读。. Resume 恢复暂停,继续播放。 Skip 在当前输入的文本流中向前或向后跳一定距离再播放。 Speak 阅读一个字符串。 SpeakCompleteEvent 得到一个朗读完毕的时间句柄 SpeakStream 朗读一个文本流或一个声音文件。 WaitUntilDone 阻塞进程,直到声音播放完毕或者超时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值