bool UseDictation; // Declare boolean variable for storing pronunciation dictation grammar setting public void main() { // Reset relevant VoiceAttack text variables VA.SetText("~~RecognitionError", null); VA.SetText("~~RecognizedText", null); VA.SetText("~~SAPIPhonemes", null); VA.SetText("~~SAPIPhonemesRaw", null); //VA.SetText("~~FalseRecognitionFlag", null); // Retrieve the desired word data contained within VoiceAttack text variable string ProcessText = null; // Initialize string variable for storing the text of interest if (VA.GetText("~~ProcessText") != null) // Check if user provided valid text in input variable { ProcessText = VA.GetText("~~ProcessText"); // Store text of interest held by VA text variable } else { VA.SetText("~~RecognitionError", "Error in input text string (SAPI)"); // Send error detail back to VoiceAttack as text variable return; // End code processing } // Retrieve path to speech grammar XML file from VoiceAttack GrammarPath = VA.GetText("~~GrammarFilePath"); // Retrieve path to voice recognition input wav file from VoiceAttack AudioPath = VA.GetText("~~AudioFilePath"); // Check if TTS engine is voicing the input for the speech recognition engine if (VA.GetBoolean("~~UserVoiceInput") == false) { //VA.WriteToLog("creating wav file"); if (TextToWav(AudioPath, ProcessText) == false) // Create wav file with specified path that voices specified text (with text-to-speech) and check if the creation was NOT successful { return; // Stop executing the code } } // Create speech recognizer and associated context SpInprocRecognizer MyRecognizer = new SpInprocRecognizer(); // Create new instance of SpInprocRecognizer SpInProcRecoContext RecoContext = (SpInProcRecoContext)MyRecognizer.CreateRecoContext(); // Initialize the SpInProcRecoContext (in-process recognition context) try // Attempt the following code { // Open the created wav in a new FileStream FileStream = new SpFileStream(); // Create new instance of SpFileStream FileStream.Open(AudioPath, SpeechStreamFileMode.SSFMOpenForRead, true); // Open the specified file in the FileStream for reading with events enabled // Set the voice recognition input as the FileStream MyRecognizer.AudioInputStream = FileStream; // This will internally "speak" the wav file for input into the voice recognition engine // Set up recognition event handling RecoContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(RecoContext_Recognition); // Register for successful voice recognition events RecoContext.FalseRecognition += new _ISpeechRecoContextEvents_FalseRecognitionEventHandler(RecoContext_FalseRecognition); // Register for failed (low confidence) voice recognition events if (VA.GetBoolean("~~ShowRecognitionHypothesis") == true) // Check if user wants to show voice recognition hypothesis results { RecoContext.Hypothesis += new _ISpeechRecoContextEvents_HypothesisEventHandler(RecoContext_Hypothesis); // Register for voice recognition hypothesis events } RecoContext.EndStream += new _ISpeechRecoContextEvents_EndStreamEventHandler(RecoContext_EndStream); // Register for end of file stream events // Set up the grammar grammar = RecoContext.CreateGrammar(); // Initialize the grammar object UseDictation = (bool?)VA.GetBoolean("~~UseDictation") ?? false; // Set UserDictation based on value from VoiceAttack boolean variable if (UseDictation == true) // Check if pronunciation dictation grammar should be used with speech recognition { //grammar.DictationLoad("", SpeechLoadOption.SLOStatic); // Load blank dictation topic into the grammar grammar.DictationLoad("Pronunciation", SpeechLoadOption.SLOStatic); // Load pronunciation dictation topic into the grammar so that the raw (unfiltered) phonemes may be retrieved grammar.DictationSetState(SpeechRuleState.SGDSActive); // Activate dictation grammar } else { grammar.CmdLoadFromFile(GrammarPath, SpeechLoadOption.SLODynamic); // Load custom XML grammar file grammar.CmdSetRuleIdState(0, SpeechRuleState.SGDSActive); // Activate the loaded grammar } Application.Run(); // Starts a standard application message loop on the current thread } catch // Handle exceptions in above code { VA.SetText("~~RecognitionError", "Error during voice recognition setup (SAPI)"); // Send error detail back to VoiceAttack as text variable return; // Stop executing the code } finally // Runs whether an exception is encountered or not { MyRecognizer = null; // Set to null in preparation for garbage collection FileStream.Close(); // Close the input FileStream FileStream = null; // Set to null in preparation for garbage collection // Close up recognition event handling RecoContext.Recognition -= new _ISpeechRecoContextEvents_RecognitionEventHandler(RecoContext_Recognition); // Unregister for successful voice recognition events RecoContext.FalseRecognition -= new _ISpeechRecoContextEvents_FalseRecognitionEventHandler(RecoContext_FalseRecognition); // Unregister for failed (low confidence) voice recognition events if (VA.GetBoolean("~~ShowRecognitionHypothesis") == true) // Check if user wanted to show voice recognition hypothesis results { RecoContext.Hypothesis -= new _ISpeechRecoContextEvents_HypothesisEventHandler(RecoContext_Hypothesis); // Unregister for voice recognition hypothesis events } RecoContext.EndStream -= new _ISpeechRecoContextEvents_EndStreamEventHandler(RecoContext_EndStream); // Unregister for end of file stream events RecoContext = null; // Set to null in preparation for garbage collection } //VA.WriteToLog("voice recognition complete"); // Output info to event log }
/// <summary> /// Generate() will be called only once if there is no typed-text; it /// should use dictation. Generate() will be called a second time if /// there is typed-text; the second pass should use both dictation and /// context-free-grammar (ie, Command and Control: a Rule that's based /// on the typed-text). /// </summary> void Generate() { #if DEBUG logfile.Log(); logfile.Log("Generate() _generato= " + _generato); #endif _offset = 0; Confidence_def_count = 0; // was "2" but MS doc says not needed on its end. // and I don't see grammar id #2 defined on this end either. _recoGrammar = _recoContext.CreateGrammar(); // _recoGrammar.DictationLoad(); // ("Pronunciation") <- causes orthemes to print as phonemes instead of words switch (_generato) { case Generator.Dictati: if (_recoGrammar.Rules.FindRule(RULE) != null) { #if DEBUG logfile.Log(". set Rule INACTIVE"); #endif _recoGrammar.CmdSetRuleState(RULE, SpeechRuleState.SGDSInactive); } #if DEBUG logfile.Log(". set Dictation ACTIVE"); #endif _recoGrammar.DictationSetState(SpeechRuleState.SGDSActive); break; case Generator.Dialogi: #if DEBUG logfile.Log(". set Dictation INACTIVE"); #endif _recoGrammar.DictationSetState(SpeechRuleState.SGDSInactive); if (_recoGrammar.Rules.FindRule(RULE) == null) { #if DEBUG logfile.Log(". . add \"" + RULE + "\" Rule"); #endif ISpeechGrammarRule rule = _recoGrammar.Rules.Add(RULE, SpeechRuleAttributes.SRATopLevel, 1); rule.InitialState.AddWordTransition(null, _text, " ", SpeechGrammarWordType.SGLexical, RULE, 1); _recoGrammar.Rules.Commit(); } #if DEBUG logfile.Log(". set Rule ACTIVE"); #endif _recoGrammar.CmdSetRuleState(RULE, SpeechRuleState.SGDSActive); // logfile.Log(". max alternates(pre)= " + _recoContext.CmdMaxAlternates); // _recoContext.CmdMaxAlternates = 3; // logfile.Log(". max alternates(pos)= " + _recoContext.CmdMaxAlternates); break; } #if DEBUG logfile.Log(". create (SpFileStream)_fs"); #endif _fs = new SpFileStream(); #if DEBUG logfile.Log(". (SpFileStream)_fs CREATED"); #endif // _fs.Format.Type = SpeechAudioFormatType.SAFT44kHz16BitMono; #if DEBUG logfile.Log(". Open Wavefile _fs"); #endif _fs.Open(Wavefile); #if DEBUG logfile.Log(". _fs.Format.Type= " + _fs.Format.Type); // SpeechAudioFormatType.SAFT44kHz16BitMono SpWaveFormatEx data = _fs.Format.GetWaveFormatEx(); logfile.Log(". . SamplesPerSec= " + data.SamplesPerSec); logfile.Log(". . BitsPerSample= " + data.BitsPerSample); logfile.Log(". . AvgBytesPerSec= " + data.AvgBytesPerSec); logfile.Log(". . Channels= " + data.Channels); logfile.Log(". . BlockAlign= " + data.BlockAlign); logfile.Log(". . FormatTag= " + data.FormatTag); logfile.Log(". . ExtraData= " + data.ExtraData); // filestream byte-data -> // int bytes, pos = 0; // object o = new byte[2]; // while ((bytes = _fs.Read(out o, 2)) > 0) // { // var buffer = (byte[])o; // logfile.Log(pos + " : " + buffer[1] + " " + buffer[0]); // treat as little-endian shorts // pos += bytes; // } // _fs.Seek(0); logfile.Log(". assign _fs to _recognizer.AudioInputStream"); #endif _recognizer.AudioInputStream = _fs; // <- start Recognition <-- #if DEBUG logfile.Log("Generate() DONE"); logfile.Log(); #endif }