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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
//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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
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";
}
|