Сапи, как получить элементы внутри элементов тега 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);
}