SAPI如何识别多个属性

SAPI how to identify multiple properties

本文关键字:属性 识别 何识别 SAPI      更新时间:2023-10-16

我正在尝试编写代码来识别短语中的多个属性。短语在说话时已经可以识别;然而,我需要它知道去哪里;在这种情况下,特定情况=case PONY:。我对它一旦到达案例中就会崩溃几乎没有什么问题。它说这是一个糟糕的指针,我不知道如何解决。这就是我迄今为止所做和尝试的。任何帮助都会很棒!

C++代码片段

const SPPHRASEPROEPRTY* FindPropertyCore(Const SPPHRASEPROEPRTY* pProp, LPCWSTR propName) {
 while (pProp != NULL) {
    if (wcscmp(propName, pProp->pszName)==0) {
        return pProp ;
    }
    if (pProp->pFirstChild != NULL) {
        const SPPHRASEPROEPRTY* pChild = FindProperty(pProp->pFirstChild, propName) ;
        if (pChild) {
            return pChild ;
        }
    }
    pProp = pProp->pNextSibling ;
 }
 return pProp ;
}
const SPPHRASEPROEPRTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) {
return FindPropertyCore(pPhrase->pProperties, propName)
}
SPPHRASE* pPhrase = NULL ;
HRESULT OnRecognition(ISpRecoResult* pRecoResult) {
SPPHRASE* pPhrase (NULL) ;
HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
if (SUCCEEDED(hr)) {
    const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"/*blank for now, but a word(s) would go in here*/");
    if (pProperty != NULL) {
        //stuff
    }
    ::CoTaskMemFree(pPhrase) ;
}
return hr ;
}
std::wstring processPhrase(ISpPhrase *pPhrase, HWND hWnd) {
SPPHRASE *pElements ;
std::wstring str ;
}    
     if (SUCCEEDED(pPhrase->GetPhrase(&pElements)))
{        
    SPPHRASE phrase = *pElements ; 
    WCHAR *pText ; 
    if (SUCCEEDED(pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pText, NULL))) {
        str = pText ; 
    }    
   switch ( pElements->Rule.ulId) {
   case CAT_PONIES:
      HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
      if (SUCCEEDED(hr)) {
         const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"");
         if (pProperty != NULL) {
                 //stuff
      }
   break ;
    ::CoTaskMemFree(pPhrase) ;
}
return hr ;
   }
}

XML代码片段

<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
    <L>
        <P>
            <O>
                <L>
                    <P PROPID="FEMALE" VALSTR="female">female</P>
                    <P PROPID="MALE" VALSTR="male">male</P>
                </L>
            </O>
            <RULEREF NAME="BROWN_BLACK"/>
            <P>pony</P>
            <O>
                <L>
                    <RULEREF NAME="STABLED"/>
                </L>
            </O>
        </P>
    </L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
    <L>
        <P PROPID="BROWN" VALSTR="brown">brown</P>
        <P PROPID="BLACK" VALSTR="black">black</P>
    </L>

<RULE NAME="STABLED" ID="R_STABLED">
    <L>
        <P PROPID="STABLED" VALSTR="stabled">stabled</P>
        <P PROPID="NOT_STABLED" VALSTR="not stabled">not stabled</P>
    </L>
</RULE>`

以下是短语:"雌性棕色小马被稳定下来"雌性黑色小马被稳定下来"雌性棕色小马没有马厩"雌性黑色小马没有马厩"雄性棕色小马被稳定下来"雄性黑色小马被稳定下来"雄性棕色小马没有马厩"雄性黑色小马不稳定"

我有一对(C++)函数,我在几乎所有使用过的SAPI识别项目中都使用过这些函数。

const SPPHRASEPROPERTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) const
{
    return FindPropertyCore(pPhrase->pProperties, propName);
}
const SPPHRASEPROPERTY* FindPropertyCore(const SPPHRASEPROPERTY* pProp, LPCWSTR propName) const
{
    while (pProp != NULL)
    {
        if (wcscmp(propName, pProp->pszName) == 0)
        {
            return pProp;
        }
        if (pProp->pFirstChild != NULL)
        {
            const SPPHRASEPROPERTY* pChild = FindPropertyCore(pProp->pFirstChild, propName);
            if (pChild)
            {
                return pChild;
            }
        }
        pProp = pProp->pNextSibling;
    }
    return pProp;
}

你可以这样称呼它:

HRESULT OnRecognition(ISpRecoResult* pRecoResult)
{
    SPPHRASE* pPhrase(NULL);
    HRESULT hr = pRecoResult->GetPhrase(&pPhrase);
    if (SUCCEEDED(hr))
    {
        const SPPHRASEPROPERTY* pProperty = FindProperty(pPhrase, "FEMALE");
        if (pProperty != NULL)
        {
            // stuff
        }
        ::CoTaskMemFree(pPhrase);
    }
    return hr;
}

最后,你的语法结构不好。您希望具有相同的属性和不同的值。类似这样的东西:

<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
    <L>
        <P>
            <O>
                <L>
                    <P PROPNAME="GENDER" VALSTR="female">female</P>
                    <P PROPNAME="GENDER" VALSTR="male">male</P>
                </L>
            </O>
            <RULEREF NAME="BROWN_BLACK"/>
            <P>pony</P>
            <O>
                <L>
                    <RULEREF NAME="STABLED"/>
                </L>
            </O>
        </P>
    </L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
    <L>
        <P PROPNAME="COLOR" VALSTR="brown">brown</P>
        <P PROPNAME="COLOR" VALSTR="black">black</P>
    </L>
<RULE NAME="STABLED" ID="R_STABLED">
    <L>
        <P PROPNAME="STABLED" VALSTR="stabled">stabled</P>
        <P PROPNAME="STABLED" VALSTR="not stabled">not stabled</P>
    </L>
</RULE>`

现在,您可以调用FindProperty(pPhrase, L"STABLED")查看小马是否已被稳定;FindProperty(pPhrase, L"COLOR")获取小马的颜色,或者FindProperty(pPhrase, L"GENDER")获取小马的性别。