2010-05-16 2 views
0

У меня есть этот код в моем проекте C#:Как исправить эту речевую признательность злой ошибкой?

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; 
     } 
    } 
} 

Этот код генерирует DLL, которые я использую в другом приложении.

Теперь, злая ошибка: - когда я запускаю метод startRecognition в начале выполнения другого приложения, эти коды работают очень хорошо. Но когда я запускаю его через некоторое время после начала, эти коды работают, но метод handleRecognition никогда не вызывается. Я вижу, что слова распознаются, потому что они появляются в приложении Microsoft Speech Recognition, но метод обработчика никогда не вызывается.

Знаете ли вы, в чем проблема с этим кодом?

ПРИМЕЧАНИЕ: этот проект имеет код, который всегда выполняется. Может быть, проблема? Поскольку другой код работает, он не позволяет ему запускаться?

+1

Это может быть все комментарии делает компилятор сердится и играть средние трюки на вас: P –

+0

Просто интересно, если вы пытались сделать обработчик виртуальным, а не статичным? – code4life

+0

Я попробую виртуальную вещь позже :) –

ответ

0

У меня был другой обработчик в другой части кода. Обработчик распознавания должен был быть вызван перед другим.

Я сделал именно так, и она работала :)

0

Может быть, что во втором вызове startRecognition() возникает исключение, прежде чем обработчик может быть добавлен к recContext.Recognition. Положите попытку/поймать все в startRecognition() и повторите все исключения, которые будут выбрасываться.

Я также выдал бы значение WaveNative.waveInGetNumDevs() в журнал или файл трассировки. Если это не > 0, то метод startRecognition() ничего не сделает.

+0

Я знаю, что шнур работает и не дает никаких исключений. Я все тестировал его, ставя MsgBox после строки «recContext.Recognition». И если было выбрано исключение, код взорвался: P И еще одно примечание: я не делаю два вызова этого метода, только один. Но он работает, когда вызов находится в начале выполнения другого api и не работает в конце. –

+0

ПРИМЕЧАНИЕ: этот проект имеет код, который всегда выполняется. Может быть, проблема? Поскольку другой код работает, он не позволяет ему запускаться? –

Смежные вопросы