Когда вы получаете распознавание, данные SPPHRASE, связанные с распознаванием, содержат подпункты и данные свойств и где они встречаются при распознавании.
Итак, если у вас есть тэг правила или свойства для «Имя», вы можете найти слова, связанные с «Имя».
Например, если ваша грамматика
<GRAMMAR LANGID="409">
<RULE NAME="SOUNDLOG" TOPLEVEL="ACTIVE">
<OPT>
<DICTATION MAX="INF"/>
</OPT>
<L>
<P>name</P>
</L>
<OPT>
<DICTATION MAX="INF"/>
</OPT>
</RULE>
</GRAMMAR>
если вы измените его на
<GRAMMAR LANGID="409">
<RULE NAME="SOUNDLOG" TOPLEVEL="ACTIVE">
<OPT>
<DICTATION MAX="INF"/>
</OPT>
<L PROPNAME='name'>
<P VAL='name'>name</P>
</L>
<OPT>
<DICTATION MAX="INF"/>
</OPT>
</RULE>
</GRAMMAR>
вы могли бы найти слова, которые соответствуют 'имя', как это:
HRESULT OnRecognition(ISpRecoResult* pResult)
{
SPPHRASE *pPhrase;
HRESULT hr = pResult->GetPhrase(&pPhrase);
if (SUCCEEDED(hr))
{
const SPPHRASEPROPERTY pProp = FindProperty(pPhrase->pProperty, L"name");
if (pRule)
{
LPWSTR text(NULL);
hr = pResult->GetText(pProp->ulFirstElement, pProp->ulCountOfElements, TRUE, &text, NULL);
if (SUCCEEDED(hr))
{
// do something with text
::CoTaskMemFree(text);
}
}
}
return hr;
}
const SPPHRASEPROPERTY* FindProperty(const SPPHRASEPROPERTY* pProp, LPCWSTR what) const
{
while (pProp!=NULL)
{
if (pProp->pFirstChild != NULL)
{
const SPPHRASEPROPERTY* pFoundProp = FindRule(pProp->pFirstChild, what);
if (pFoundProp)
{
return pFoundProp;
}
}
if (pProp->pszName != NULL && wcsstr(pProp->pszName, what) != NULL)
{
return pProp;
}
pProp = pProp->pNextSibling;
}
return NULL;
}
Этот код выглядит специально для текста, охватываемого этим свойством. Тем не менее, часто лучше использовать атрибуты val для идентификации элементов, не привязывая свой код к грамматике. Это позволяет вам настроить грамматику (или добавить эквивалентные значения) без изменения кода. Чтобы использовать значения, просто используйте поля SPPHRASEPROPERTY.pszValue или vValue после извлечения свойства (вместо использования ISpPhrase :: GetText).
см. Мой измененный вопрос :) –
См. Отредактированный ответ. :) –
У вас есть код C#? –