У меня есть этот код в 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).
Что я могу сделать, чтобы обработчик распознавания всегда вызывался?