Speech SDK 5.1--No.4:用xml描述语法规则初探
2013-04-24 14:36
281 查看
最悲哀的莫过于,我不知道microsoft speech sdk 5.1的原理,却要依葫芦画瓢做一个系统,没时间先去弄懂microsoft speech sdk 5.1了。本文需要读者有一定的microsoft speech sdk 5.1基础。我也不知道xml规则,但是看了下面的函数和xml文档,我大致知道怎么回事。希望能给其他人一些帮助。
两个重要的函数:
void speechControl::RecoEvent()
{
USES_CONVERSION;
CSpEvent event;
// Process all of the recognition events
while (event.GetFrom(m_cpRecoCtxt) == S_OK)
{
switch (event.eEventId)
{
case SPEI_RECOGNITION:
// There may be multiple recognition results, so get all of them
{
CSpDynamicString dstrText;
if (SUCCEEDED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,
TRUE, &dstrText, NULL)))
{
// MessageBox(m_hWnd,(char*)dstrText.Copy(),"recognized",0);
m_cpVoice->Speak( dstrText, SPF_ASYNC, NULL);
}
ExecuteCommand(event.RecoResult());
}
break;
}
}
}
void speechControl::ExecuteCommand(ISpPhrase *pPhrase)
{
HWND hWnd=m_hWnd;
SPPHRASE *pElements;
// Get the phrase elements, one of which is the rule id we specified in
// the grammar. Switch on it to figure out which command was recognized.
if (SUCCEEDED(pPhrase->GetPhrase(&pElements)))
{
switch ( pElements->Rule.ulId )
{
case VID_Hello:
case VID_Stops:
case VID_Out:
case VID_Navigation:
{
switch( pElements->pProperties->vValue.ulVal )
{
case VID_Feifei:
m_cpCmdGrammar->SetRuleIdState(VID_Navigation,SPRS_ACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Stops,SPRS_ACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Out,SPRS_ACTIVE);
MessageBox(hWnd,"OK,madam,you can control me!",NULL,0);
// m_cpVoice->Speak(L"OK,madam,you can control me!", SPF_ASYNC, NULL);
break;
case VID_Out:
m_cpCmdGrammar->SetRuleIdState(VID_Navigation,SPRS_INACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Stops,SPRS_INACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Out,SPRS_INACTIVE);
break;
case VID_Ahead:
// PostMessage( hWnd, WM_GOTOCOUNTER, NULL, NULL );
MessageBox(hWnd,"turn/go ahead","ahead",0);
break;
case VID_Left:
MessageBox(hWnd,"turn/go left","left",0);
break;
case VID_Back:
MessageBox(hWnd,"turn/go back","back",0);
break;
case VID_Right:
MessageBox(hWnd,"turn/go right","right",0);
break;
case VID_Stop:
MessageBox(hWnd,"turn/go stop","stop",0);
break;
}
break;
}
case VID_Place:
{
switch( pElements->pProperties->vValue.ulVal )
{
case VID_Ahead:
// PostMessage( hWnd, WM_GOTOCOUNTER, NULL, NULL );
MessageBox(hWnd,"ahead","ahead",0);
break;
case VID_Left:
MessageBox(hWnd,"left","left",0);
break;
case VID_Back:
MessageBox(hWnd,"back","back",0);
break;
case VID_Right:
MessageBox(hWnd,"right","right",0);
break;
case VID_Stop:
MessageBox(hWnd,"stop","stop",0);
break;
}
}
break;
}
// Free the pElements memory which was allocated for us
::CoTaskMemFree(pElements);
}
}
对应的xml文件:
两个重要的函数:
void speechControl::RecoEvent()
{
USES_CONVERSION;
CSpEvent event;
// Process all of the recognition events
while (event.GetFrom(m_cpRecoCtxt) == S_OK)
{
switch (event.eEventId)
{
case SPEI_RECOGNITION:
// There may be multiple recognition results, so get all of them
{
CSpDynamicString dstrText;
if (SUCCEEDED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,
TRUE, &dstrText, NULL)))
{
// MessageBox(m_hWnd,(char*)dstrText.Copy(),"recognized",0);
m_cpVoice->Speak( dstrText, SPF_ASYNC, NULL);
}
ExecuteCommand(event.RecoResult());
}
break;
}
}
}
void speechControl::ExecuteCommand(ISpPhrase *pPhrase)
{
HWND hWnd=m_hWnd;
SPPHRASE *pElements;
// Get the phrase elements, one of which is the rule id we specified in
// the grammar. Switch on it to figure out which command was recognized.
if (SUCCEEDED(pPhrase->GetPhrase(&pElements)))
{
switch ( pElements->Rule.ulId )
{
case VID_Hello:
case VID_Stops:
case VID_Out:
case VID_Navigation:
{
switch( pElements->pProperties->vValue.ulVal )
{
case VID_Feifei:
m_cpCmdGrammar->SetRuleIdState(VID_Navigation,SPRS_ACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Stops,SPRS_ACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Out,SPRS_ACTIVE);
MessageBox(hWnd,"OK,madam,you can control me!",NULL,0);
// m_cpVoice->Speak(L"OK,madam,you can control me!", SPF_ASYNC, NULL);
break;
case VID_Out:
m_cpCmdGrammar->SetRuleIdState(VID_Navigation,SPRS_INACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Stops,SPRS_INACTIVE);
m_cpCmdGrammar->SetRuleIdState(VID_Out,SPRS_INACTIVE);
break;
case VID_Ahead:
// PostMessage( hWnd, WM_GOTOCOUNTER, NULL, NULL );
MessageBox(hWnd,"turn/go ahead","ahead",0);
break;
case VID_Left:
MessageBox(hWnd,"turn/go left","left",0);
break;
case VID_Back:
MessageBox(hWnd,"turn/go back","back",0);
break;
case VID_Right:
MessageBox(hWnd,"turn/go right","right",0);
break;
case VID_Stop:
MessageBox(hWnd,"turn/go stop","stop",0);
break;
}
break;
}
case VID_Place:
{
switch( pElements->pProperties->vValue.ulVal )
{
case VID_Ahead:
// PostMessage( hWnd, WM_GOTOCOUNTER, NULL, NULL );
MessageBox(hWnd,"ahead","ahead",0);
break;
case VID_Left:
MessageBox(hWnd,"left","left",0);
break;
case VID_Back:
MessageBox(hWnd,"back","back",0);
break;
case VID_Right:
MessageBox(hWnd,"right","right",0);
break;
case VID_Stop:
MessageBox(hWnd,"stop","stop",0);
break;
}
}
break;
}
// Free the pElements memory which was allocated for us
::CoTaskMemFree(pElements);
}
}
对应的xml文件:
<?xml version="1.0" encoding="GB2312"?> <GRAMMAR LANGID="804"> <DEFINE> <ID NAME="VID_Hello" VAL="100"/> <ID NAME="VID_Ahead" VAL="1"/> <ID NAME="VID_Back" VAL="2"/> <ID NAME="VID_Left" VAL="3"/> <ID NAME="VID_Right" VAL="4"/> <ID NAME="VID_Stop" VAL="5"/> <ID NAME="VID_Stops" VAL="6"/> <ID NAME="VID_Tiantian" VAL="101"/> <ID NAME="VID_Haha" VAL="102"/> <ID NAME="VID_Feifei" VAL="103"/> <ID NAME="VID_Out" VAL="200"/> <ID NAME="VID_Place" VAL="253"/> <ID NAME="VID_Navigation" VAL="254"/> </DEFINE> <RULE ID="VID_Hello" TOPLEVEL="ACTIVE"> <O>你好</O> <P> <L PROPID="VID_Hello" > <P VAL="VID_Tiantian">天天</P> <P VAL="VID_Haha">哈哈</P> <P VAL="VID_Feifei">飞飞</P> </L> </P> </RULE> <RULE ID="VID_Out" TOPLEVEL="INACTIVE"> <P> <L PROPID="VID_Out" > <P VAL="VID_Out">好了</P> <P VAL="VID_Out">拜拜</P> <P VAL="VID_Out">再见</P> <P VAL="VID_Out">结束</P> </L> </P> </RULE> <RULE ID="VID_Navigation" TOPLEVEL="INACTIVE"> <O>请</O> <P> <L> <P>朝</P> <P>向</P> </L> </P> <L> <RULEREF REFID="VID_Place" /> <RULEREF REFID="VID_Stops" /> </L> </RULE> <RULE ID="VID_Place" > <L PROPID="VID_Place" > <P> <P PROPID="VID_Place" VAL="VID_Ahead">前</P> <O> <L> <P>走</P> <p>进</P> <p>跑</P> </L> </O> </P> <P VAL="VID_Back">后退</P> <P> <P PROPID="VID_Place" VAL="VID_Left">左</P> <O> <L> <P>转</P> <p>拐</P> <p>跑</P> </L> </O> </P> <P> <P PROPID="VID_Place" VAL="VID_Right">右</P> <O> <L> <P>转</P> <p>拐</P> <p>跑</P> </L> </O> </P> <P VAL="VID_Stop"> <L> <P>停下来</P> <p>停止</P> </L> </P> </L> </RULE> <RULE ID="VID_Stops" TOPLEVEL="INACTIVE"> <P PROPID="VID_Stops" VAL="VID_Stop">停</P> <L> <P>下来</P> <p>止前进</P> <p>吧</P> </L> </RULE> </GRAMMAR>
相关文章推荐
- c#基于speech sdk中文限制语音识别XML初探
- libxml/tree.h not found(XCode 4.5&5.1解决方案)
- 初探XML
- XML在数据库应用中的性能问题初探
- 部署描述文件web.xml解析(一)总述
- Portlet.xml概要描述
- MySQL 5.1 分区技术初探(一)
- xml的语法规则
- 学习网页制作认识XML的语法规则
- JavaWeb里面web.xml配置部署描述符文件详解
- XML 语法规则
- weblogic.xml 部署描述符元素
- XML解析技术初探(一):DOM解析
- maven pom.xml节点描述
- MySQL 5.1 分区技术初探(二)
- XML 语法规则
- XML 语法规则
- 利用微软Speech SDK 5.1开发语音识别系统主要步骤
- XML+RDF——实现Web数据基于语义的描述(转载)
- XML+RDF——实现Web数据基于语义的描述