2010-02-04 4 views
0

Эта грамматика SAPI улавливает имя слова - это середина предложения.Как уловить слова в середине предложений с помощью Microsoft SAPI?

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

Итак, если я скажу: «Меня зовут Андре», то обозначается слово «имя». Есть ли лучший способ сделать это?

ответ

2

Когда вы получаете распознавание, данные 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).

+0

см. Мой измененный вопрос :) –

+0

См. Отредактированный ответ. :) –

+0

У вас есть код C#? –