Problem with SAPI Dynamic Grammars in C++

Started by
0 comments, last by polpoint 12 years, 1 month ago
Good morning. I have been making a Speech to Text program using SAPI and am having some problems with loading, activating and deactivating dynamic grammars. Basically I am displaying a picture on the screen. If the user states the correct response, as defined by the dynamic grammar rule, then that rule is deactivated, and another picture is displayed and its corresponding grammar rule is activated.

I want the dynamic rules to be topLevel, so they just have to state the object without any prefix etc.

My problem is the rules activating/ deactivating do not seem to be consistent. Sometimes the grammar will accept any of the rules, sometimes it will accept only the correct rule.

Any help would be appreciated. If you need more info/ code please let me know. Thanks!

I am pretty sure it is something I am missing when it comes to the grammar rules/ word transition. The other thing I thought might be possible was that I am somehow creating a rule with the memory address of LPCWSTR pikk as opposed to the actual data - but that doesn't seem like it is the problem since the first parameter of GetRule is a LPCWSTR - unless I am converting incorrectly?


Loading dynamic grammar rules:


//curNumb = current number of exercise
//curNumbID = curNumb + numOffest (500) so I reserve #1-500 for whatever other hard-coded grammar rules I add
std::wstring stemp;
LPCWSTR pikk;
//add in the grammar:
//reserve curNumb
int reserveNum = curNumb;
//loop through all object_data and load dynamic rules into grammar:
for(int pip = 0; pip < data.numObjects.size(); pip++)
{
stemp = s2ws(data.object_data[curNumb].title);
pikk = stemp.c_str();
hr = g_cpCmdGrammar->GetRule(pikk, data.object_data[curNumb].programID, SPRAF_TopLevel, TRUE, &hStateTravel);
if(FAILED(hr))
{
ErrorDescription(hr);
}
//loop through all words in object_data
std::list<std::string>::iterator st_it = data.object_data[curNumb].words.begin();
for(; st_it != data.object_data[curNumb].words.end(); st_it++)
{
std::cout<<"adding word: "<<(*st_it)<<"\n";
stemp = s2ws((*st_it));
pikk = stemp.c_str();
hr = g_cpCmdGrammar->AddWordTransition(hStateTravel, NULL, pikk, L"", SPWT_LEXICAL, 1, NULL);
if(FAILED(hr))
{
ErrorDescription(hr);
}
}
curNumb++;
}
//reset curNumb back to reserveNum
curNumb = reserveNum;
//activate curNumb grammar rule
stemp = s2ws(data.object_data[curNumb].title);
pikk = stemp.c_str();
std::cout<<"activate new rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
hr = g_cpCmdGrammar->SetRuleIdState(curNumbID, SPRS_ACTIVE);
if(FAILED(hr))
{
ErrorDescription(hr);
std::cout<<"FAILURE at activate previous rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
}
else
{
std::cout<<"ruleActivated...\n";
}

hr = g_cpCmdGrammar->Commit(0);


//deactivate old rule/ activate new rule code:

std::cout<<"curScore++ ("<<curScore<<"->";
curScore++;
std::cout<<curScore<<")\n";
//clear old exercise:

std::wstring stemp = s2ws(data.object_data[curNumb].title);
LPCWSTR pikk = stemp.c_str();
std::cout<<"deactivate previous rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
hr = g_cpCmdGrammar->SetRuleIdState(curNumbID, SPRS_INACTIVE);
if(FAILED(hr))
{
ErrorDescription(hr);
std::cout<<"FAILURE at deactivate previous rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
}
else
{
std::cout<<"ruleDeactivated...\n";
}
curNumb++;
if(curNumb > data.numObjects.size())
{
curNumb = 1;
}
curNumbID = curNumb + exerciseOffset;
//activate next rule:
stemp = s2ws(data.object_data[curNumb].title);
pikk = stemp.c_str();
std::cout<<"activate new rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
hr = g_cpCmdGrammar->SetRuleIdState(curNumbID, SPRS_ACTIVE);
if(FAILED(hr))
{
ErrorDescription(hr);
std::cout<<"FAILURE at activate previous rules "<<curNumbID<<"/"<<curNumb<<" ("<<data.object_data[curNumb].title<<")\n";
}
else
{
std::cout<<"ruleActivated...\n";
}
Advertisement
I have broken everything down to its simplest form:
http://www.mediafire.com/?xwevgekf8ndrrpv
(should be able to download from above link without having to wait/ enter any captcha)

This project contains all the files for a simple WINAPI program utilizing SAPI speech recognition.
It was created in VS2010 using the default Win32 project settings.

*After compiling and executing the program a window will be displayed with a word (gloves).
*After saying the command "START" the program will load the first dynamic grammar word/ rule(which in this case would be the word "GLOVES")
*The program is then supposed to start listening for the word displayed. If you say "GLOVES" it will reset the dynamic grammar and load the next word. There are four words in total (gloves, fox, computer, dog).

**My issue is that the rules are not consistent. At times I can say "GLOVES" when it is supposed to only accept "COMPUTER"

This topic is closed to new replies.

Advertisement