我在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语音识别应用程序中,但是从不调用处理程序方法。
你知道这段代码有什么问题吗?
注意:此项目有一些代码,总是被执行。可能是问题吗?因为其他代码正在运行,所以不允许它运行吗?
答案 0 :(得分:0)
可能是在第二次调用startRecognition()
时,在将处理程序添加到recContext.Recognition
之前抛出异常。对startRecognition()
中的所有内容进行try / catch,并回显任何抛出的异常。
我还会将WaveNative.waveInGetNumDevs()
的值输出到日志或跟踪文件中。如果不是> 0
,startRecognition()
方法将无法执行任何操作。
答案 1 :(得分:0)
我在代码的另一部分有另一个处理程序。 识别处理程序必须在另一个之前调用。
我这样做了,它起作用了。)