views:

86

answers:

2

I have this code in my C# project:

public void startRecognition(string pName)
{
    presentationName = pName;

    if (WaveNative.waveInGetNumDevs() > 0)
    {
        string grammar = System.Environment.GetEnvironmentVariable("PUBLIC") + "\\SoundLog\\Presentations\\" + presentationName + "\\SpeechRecognition\\soundlog.cfg";

        if (File.Exists(grammar))
        {
            File.Delete(grammar);
        }
        executeCommand();

        /// Create an instance of SpSharedRecoContextClass which will be used
        /// to interface with the incoming audio stream
        recContext = new SpSharedRecoContextClass();

        // Create the grammar object          
        recContext.CreateGrammar(1, out recGrammar);
        //recContext.CreateGrammar(2, out recGrammar2);
        // Set up dictation mode
        //recGrammar2.SetDictationState(SpeechLib.SPRULESTATE.SPRS_ACTIVE);
        //recGrammar2.SetGrammarState(SPGRAMMARSTATE.SPGS_ENABLED);

        // Set appropriate grammar mode
        if (File.Exists(grammar))
        {
            recGrammar.LoadCmdFromFile(grammar, SPLOADOPTIONS.SPLO_STATIC);
            //recGrammar.SetDictationState(SpeechLib.SPRULESTATE.SPRS_INACTIVE);
            recGrammar.SetGrammarState(SPGRAMMARSTATE.SPGS_ENABLED);
            recGrammar.SetRuleIdState(0, SPRULESTATE.SPRS_ACTIVE);
        }

        /// Bind a callback to the recognition event which will be invoked
        /// When a dictated phrase has been recognised.
        recContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(handleRecognition);
        //                System.Windows.Forms.MessageBox.Show(recContext.ToString());
        // gramática compilada
    }
}

private static void handleRecognition(int StreamNumber,
    object StreamPosition,
    SpeechLib.SpeechRecognitionType RecognitionType,
    SpeechLib.ISpeechRecoResult Result)
{
    string temp = Result.PhraseInfo.GetText(0, -1, true);
    _recognizedText = "";
    //            System.Windows.Forms.MessageBox.Show(temp);
    //            System.Windows.Forms.MessageBox.Show(recognizedWords.Count.ToString());
    foreach (string word in recognizedWords)
    {
        if (temp.Contains(word))
        {
            //                    System.Windows.Forms.MessageBox.Show("yes");
            _recognizedText = word;
        }
    }
}

This codes generates a dll that I use in another application.

Now, the wicked bug: - when I run the startRecognition method in the beginning of the execution of the other application, this codes works very well. But when I run it some time after the beginning, this codes works but the handleRecognition method is never called. I see that the words are recognized because they appear on the Microsoft Speech Recognition app, but the handler method is never called.

Do you know what's the problem with this code?

NOTE: this project has some code that is allways being executed. Might that be the problem? Because the other code is running it doesn't allow it to this to run?

A: 

It could be that in the second call to startRecognition() an exception is being thrown before the handler can be added to recContext.Recognition. Put a try/catch around the everything in startRecognition(), and echo any exceptions that get thrown.

I would also output the value of WaveNative.waveInGetNumDevs() to a log or trace file. If it is not > 0 the startRecognition() method won't do anything.

Simon Chadwick
I know that the corde runs and don't give any exception cause I allready tested it putting MsgBox after the "recContext.Recognition" line. And if an exception was thrown, the code would explode :PAnd one other note, I don't do two calls of this method, only one. But it works when the call is in the beginning of the execution of the other api and doesn't work on the end.
aF
NOTE: this project has some code that is allways being executed. Might that be the problem? Because the other code is running it doesn't allow it to this to run?
aF
A: 

I had another handler in another part of the code. The recognition handler had to be called before the other one.

I made that way and it worked :)

aF