Pregunta

esta captura SAPI gramática el nombre palabra es la mitad de una frase.

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

Por lo tanto, si digo "Mi nombre es André", se identifica el "nombre" palabra. ¿Hay una mejor manera de hacer esto?

¿Fue útil?

Solución

Cuando se obtiene el reconocimiento, los datos SPPHRASE asociados al reconocimiento contiene las subreglas y datos de propiedad y donde se dan en el reconocimiento.

Por lo tanto, si usted tenía una etiqueta regla o propiedad de 'Nombre', se puede encontrar las palabras asociadas con el 'Nombre'.

Por ejemplo, dada su gramática

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

Si lo cambia a

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

se podía encontrar las palabras que corresponden a 'nombre' de esta manera:

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

Este código es específicamente para el texto cubierto por la propiedad. Sin embargo, a menudo es mejor utilizar los atributos val para identificar los elementos de unión sin su código de forma explícita a la gramática. Esto le permite ajustar la gramática (o añadir valores equivalentes) sin cambiar su código. Para utilizar los valores, basta con utilizar los campos SPPHRASEPROPERTY.pszValue o vValue después de ir a buscar la propiedad (en lugar de utilizar ISpPhrase :: GetText).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top