Сомневаетесь с обработчиками c #? - PullRequest
0 голосов
/ 21 мая 2010

У меня есть этот код в 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();*/
            recContext = new SpSharedRecoContextClass();
            recContext.CreateGrammar(0, out recGrammar);

            if (File.Exists(grammar))
            {
                recGrammar.LoadCmdFromFile(grammar, SPLOADOPTIONS.SPLO_STATIC);
                recGrammar.SetGrammarState(SPGRAMMARSTATE.SPGS_ENABLED);
                recGrammar.SetRuleIdState(0, SPRULESTATE.SPRS_ACTIVE);
            }

            recContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(handleRecognition);
            //recContext.RecognitionForOtherContext += new _ISpeechRecoContextEvents_RecognitionForOtherContextEventHandler(handleRecognition);

            //System.Windows.Forms.MessageBox.Show("olari");


        }
    }

    private void handleRecognition(int StreamNumber,
        object StreamPosition,
        SpeechLib.SpeechRecognitionType RecognitionType,
        SpeechLib.ISpeechRecoResult Result)
    {
        System.Windows.Forms.MessageBox.Show("entrei");

        string temp = Result.PhraseInfo.GetText(0, -1, true);
        _recognizedText = "";

        foreach (string word in recognizedWords)
        {
            if (temp.Contains(word))
            {
                _recognizedText = word;
            }
        }
    }





public void run()
    {
        if (File.Exists(System.Environment.GetEnvironmentVariable("PUBLIC") + 

"\\SoundLog\\Serialization\\Voices\\identifiedVoicesDLL.txt"))
    {
        deserializer = new XmlSerializer(_identifiedVoices.GetType());
        FileStream fs = new FileStream(System.Environment.GetEnvironmentVariable("PUBLIC") + "\\SoundLog\\Serialization\\Voices\\identifiedVoicesDLL.txt", FileMode.Open);
        Object o = deserializer.Deserialize(fs);
        fs.Close();
        _identifiedVoices = (double[])o;
    }


    if (File.Exists(System.Environment.GetEnvironmentVariable("PUBLIC") + "\\SoundLog\\Serialization\\Voices\\deletedVoicesDLL.txt"))
    {
        deserializer = new XmlSerializer(_deletedVoices.GetType());
        FileStream fs = new FileStream(System.Environment.GetEnvironmentVariable("PUBLIC") + "\\SoundLog\\Serialization\\Voices\\deletedVoicesDLL.txt", FileMode.Open);
        Object o = deserializer.Deserialize(fs);
        fs.Close();
        _deletedVoices = (ArrayList)o;
    }

    myTimer.Interval = 5000;
    myTimer.Tick += new EventHandler(clearData);
    myTimer.Start();
    if (WaveNative.waveInGetNumDevs() > 0) {
        _waveFormat = new WaveFormat(_samples, 16, 2);
        _recorder = new WaveInRecorder(-1, _waveFormat, 8192 * 2, 3, new BufferDoneEventHandler(DataArrived));
        _scaleHz = (double)_samples / _fftLength;
        _limit = (int)((double)_limitVoice / _scaleHz);
        SoundLogDLL.MelFrequencyCepstrumCoefficients.calculateFrequencies(_samples, _fftLength);
    }
}

startRecognition - это метод для распознавания речи, который загружает грамматику и делает здесь обработчик распознавания:

recContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(handleRecognition);

Теперь у меня проблема, когда я вызываю метод startRecognition перед запуском метода, оба обработчика (распознающий и обработчик для тика) работают хорошо. Если слово распознано, вызывается метод handlerRecognition.

Но когда я вызываю метод run перед методом startRecognition, оба метода, кажется, работают хорошо, но тогда обработчик распознавания никогда не выполняется! Даже когда я вижу, что слова распознаются (потому что они возникают в приложении распознавания речи Windows).

Что я могу сделать, чтобы обработчик распознавания всегда вызывался?

1 Ответ

0 голосов
/ 21 мая 2010

Если вы не вызываете StartRecognition перед Run, обработчик никогда не будет подключен. Поэтому очевидным решением будет убедиться, что ваша строка кода, которая подключает обработчик распознавания, будет вызвана.

Самое простое решение - лучшее:)

Я сделал обработчик распознавания в методе run ().

Я вызываю метод метода startReconition после запуска, и он работает!

спасибо Роберт Харви

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...