Сапи, как получить элементы внутри элементов тега C++

Я работаю над SAPI 5.4 Вот мое правило грамматики

<RULE ID="FIRST_TRANSMISSION" TOPLEVEL="ACTIVE">
    <P><RULEREF REFID="BATTERY"/></P>
    <P><RULEREF REFID="FO"/></P>
    <P><RULEREF REFID="MISSION"/></P>  
</RULE>

Я использовал код на С ++, чтобы получить распознанные слова, и это мир моего кода. ID моего правила =256

case 256:
                {
                    if (SUCCEEDED (hr))
                    {
                        hr = pISpRecoResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pwszText, NULL);
                    }           

                    char ch[260];
                    char DefChar = ' ';
                    WideCharToMultiByte(CP_ACP,0,pwszText,-1, ch,260,&DefChar, NULL);                       
                    string ss(ch);          
                    str.append(ss);

                    break;
                }

Теперь я хочу получить узнаваемые слова в соответствии с подчиненными правилами. Пример:- Я хочу получить узнаваемое слово в соответствии с <P><RULEREF REFID="FO"/></P> этот этап в грамматическом файле. Как мне это сделать

1 ответ

Вам нужно использовать ISpRecoResult::GetPhrase, чтобы получить SPPHRASE, связанную с распознаванием. Тогда вы можете использовать Rule поле SPPHRASE для обхода правил, связанных с распознаванием, пока не найдете поле с идентификатором "FO". Как только вы нашли соответствующий SPPHRASERULE, с правилом будут связаны индексы слов, и вы можете вызвать ISpRecoResult::GetText как прежде.

Код будет выглядеть примерно так: (Примечание. На самом деле я этого не компилировал, поэтому, скорее всего, будут ошибки.)

SPPHRASE* pPhrase;
hr = pRecoResult->GetPhrase(&pPhrase);
if (SUCCEEDED(hr))
{
    ULONG ulFirstElement = 0;
    ULONG ulCountOfElements = 0;
    hr = FindRuleMatching(&pPhrase->Rule, L"FO", &ulFirstElement, &ulCountOfElements);
    if (SUCCEEDED(hr))
    {
        LPWSTR pwszText;
        hr = pRecoResult->GetText(ulFirstElement, ulCountOfElements, TRUE, &pwszText, NULL);
        if (SUCCEEDED(hr))
        {
             // do stuff
             ::CoTaskMemFree(pwszText);
        }
    }
    ::CoTaskMemFree(pPhrase);
}


HRESULT
FindRuleMatching(const SPPHRASERULE* pRule, LPCWSTR szRuleName, ULONG* pulFirst, ULONG* pulCount)
{
    if (pRule == NULL)
    {
        return E_FAIL;
    }
    // depth-first search.  
    if (wcscmp(pRule->pszName, szRuleName) == 0)
    {
        *pulFirst = pRule->ulFirstElement;
        *pulCount = pRule->ulCountOfElements;
        return S_OK;
    }
    else if (SUCCEEDED(FindRuleMatching(pRule->pFirstChild, szRuleName, pulFirst, pulCount)))
    {
        return S_OK;
    }
    else return FindRuleMatching(pRule->pNextSibling, szRuleName, pulFirst, pulCount);
}
Другие вопросы по тегам