none
Problem with SAPI Dynamic Grammars in C++ RRS feed

  • Question

  • Good morning. Hope this is the correct place to ask this question - it seems like most other MS Speech-related forums are pretty dead.

    I have been making a Speech to Text program in C++ 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";
    }


    • Edited by defodie Friday, March 2, 2012 5:03 PM
    Friday, March 2, 2012 5:02 PM

Answers

All replies

  • You might be able to get some help here, but the official support for the Speech API are provided by a different team. Have a look at the Speech website:

    http://msdn.microsoft.com/en-us/speech/dd393287

    or

    listen@microsoft.com


    Tuesday, March 6, 2012 12:59 AM
  • Thanks for the reply. I will send a message to listen.

    Int the mean time 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"

    Tuesday, March 6, 2012 5:09 PM