Speech SDK 5.1--No.4:用xml描述语法规则初探

        最悲哀的莫过于,我不知道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文件:

<?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>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值