SAPI如何识别多个属性
SAPI how to identify multiple properties
我正在尝试编写代码来识别短语中的多个属性。短语在说话时已经可以识别;然而,我需要它知道去哪里;在这种情况下,特定情况=case PONY:。我对它一旦到达案例中就会崩溃几乎没有什么问题。它说这是一个糟糕的指针,我不知道如何解决。这就是我迄今为止所做和尝试的。任何帮助都会很棒!
C++代码片段
const SPPHRASEPROEPRTY* FindPropertyCore(Const SPPHRASEPROEPRTY* pProp, LPCWSTR propName) {
while (pProp != NULL) {
if (wcscmp(propName, pProp->pszName)==0) {
return pProp ;
}
if (pProp->pFirstChild != NULL) {
const SPPHRASEPROEPRTY* pChild = FindProperty(pProp->pFirstChild, propName) ;
if (pChild) {
return pChild ;
}
}
pProp = pProp->pNextSibling ;
}
return pProp ;
}
const SPPHRASEPROEPRTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) {
return FindPropertyCore(pPhrase->pProperties, propName)
}
SPPHRASE* pPhrase = NULL ;
HRESULT OnRecognition(ISpRecoResult* pRecoResult) {
SPPHRASE* pPhrase (NULL) ;
HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
if (SUCCEEDED(hr)) {
const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"/*blank for now, but a word(s) would go in here*/");
if (pProperty != NULL) {
//stuff
}
::CoTaskMemFree(pPhrase) ;
}
return hr ;
}
std::wstring processPhrase(ISpPhrase *pPhrase, HWND hWnd) {
SPPHRASE *pElements ;
std::wstring str ;
}
if (SUCCEEDED(pPhrase->GetPhrase(&pElements)))
{
SPPHRASE phrase = *pElements ;
WCHAR *pText ;
if (SUCCEEDED(pPhrase->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &pText, NULL))) {
str = pText ;
}
switch ( pElements->Rule.ulId) {
case CAT_PONIES:
HRESULT hr = pRecoResult->GetPhrase(&pPhrase) ;
if (SUCCEEDED(hr)) {
const SPPHRASEPROEPRTY* pProperty = FindProperty(pPhrase, L"");
if (pProperty != NULL) {
//stuff
}
break ;
::CoTaskMemFree(pPhrase) ;
}
return hr ;
}
}
XML代码片段
<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
<L>
<P>
<O>
<L>
<P PROPID="FEMALE" VALSTR="female">female</P>
<P PROPID="MALE" VALSTR="male">male</P>
</L>
</O>
<RULEREF NAME="BROWN_BLACK"/>
<P>pony</P>
<O>
<L>
<RULEREF NAME="STABLED"/>
</L>
</O>
</P>
</L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
<L>
<P PROPID="BROWN" VALSTR="brown">brown</P>
<P PROPID="BLACK" VALSTR="black">black</P>
</L>
<RULE NAME="STABLED" ID="R_STABLED">
<L>
<P PROPID="STABLED" VALSTR="stabled">stabled</P>
<P PROPID="NOT_STABLED" VALSTR="not stabled">not stabled</P>
</L>
</RULE>`
以下是短语:"雌性棕色小马被稳定下来"雌性黑色小马被稳定下来"雌性棕色小马没有马厩"雌性黑色小马没有马厩"雄性棕色小马被稳定下来"雄性黑色小马被稳定下来"雄性棕色小马没有马厩"雄性黑色小马不稳定"
我有一对(C++)函数,我在几乎所有使用过的SAPI识别项目中都使用过这些函数。
const SPPHRASEPROPERTY* FindProperty(const SPPHRASE* pPhrase, LPCWSTR propName) const
{
return FindPropertyCore(pPhrase->pProperties, propName);
}
const SPPHRASEPROPERTY* FindPropertyCore(const SPPHRASEPROPERTY* pProp, LPCWSTR propName) const
{
while (pProp != NULL)
{
if (wcscmp(propName, pProp->pszName) == 0)
{
return pProp;
}
if (pProp->pFirstChild != NULL)
{
const SPPHRASEPROPERTY* pChild = FindPropertyCore(pProp->pFirstChild, propName);
if (pChild)
{
return pChild;
}
}
pProp = pProp->pNextSibling;
}
return pProp;
}
你可以这样称呼它:
HRESULT OnRecognition(ISpRecoResult* pRecoResult)
{
SPPHRASE* pPhrase(NULL);
HRESULT hr = pRecoResult->GetPhrase(&pPhrase);
if (SUCCEEDED(hr))
{
const SPPHRASEPROPERTY* pProperty = FindProperty(pPhrase, "FEMALE");
if (pProperty != NULL)
{
// stuff
}
::CoTaskMemFree(pPhrase);
}
return hr;
}
最后,你的语法结构不好。您希望具有相同的属性和不同的值。类似这样的东西:
<RULE NAME="PONIES" ID="CAT_PONIES" TOPLEVEL="ACTIVE">
<L>
<P>
<O>
<L>
<P PROPNAME="GENDER" VALSTR="female">female</P>
<P PROPNAME="GENDER" VALSTR="male">male</P>
</L>
</O>
<RULEREF NAME="BROWN_BLACK"/>
<P>pony</P>
<O>
<L>
<RULEREF NAME="STABLED"/>
</L>
</O>
</P>
</L>
</RULE>
<RULE NAME="BROWN_BLACK" ID="R_BROWN_BLACK">
<L>
<P PROPNAME="COLOR" VALSTR="brown">brown</P>
<P PROPNAME="COLOR" VALSTR="black">black</P>
</L>
<RULE NAME="STABLED" ID="R_STABLED">
<L>
<P PROPNAME="STABLED" VALSTR="stabled">stabled</P>
<P PROPNAME="STABLED" VALSTR="not stabled">not stabled</P>
</L>
</RULE>`
现在,您可以调用FindProperty(pPhrase, L"STABLED")
查看小马是否已被稳定;FindProperty(pPhrase, L"COLOR")
获取小马的颜色,或者FindProperty(pPhrase, L"GENDER")
获取小马的性别。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 提升 ASIO 无法识别计时器对象
- 从udp接收帧对于人脸识别来说太慢
- 模板类无法识别友元运算符
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- std::visit无法识别类型
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 无法识别模板功能
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- cc_prebuilt_library_shared模块无法识别的属性"cflags"
- C++ 其他类无法识别的类属性(标头包括公共)
- 识别2个以上属性的SAPI
- SAPI如何识别多个属性