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
    }
Beispiel #2
0
        /// <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
        }