/// <summary>
        /// Increase the priority and weight of the grammar that start from the given index
        /// and remove the priority and weight for the rest of the active grammars.
        /// </summary>
        /// <param name="index"></param>
        public void ReloadAndChangeGrammarPriority(int index)
        {
            foreach (Grammar g in currentStoryGrammars)
            {
                if (g.RuleName.CompareTo("index_" + index) == 0)
                {
                    loadGrammarCompleted = false;
                    loadGrammarCount++;
                    Debug.WriteLine("reloading grammar(index)..." + "\t" + EBookUtil.GetUnixTimeMillis() + "\t" +
                                    g.RuleName);
                    sr.UnloadGrammar(g);

                    g.Weight   = EBookConstant.NEXT_WORD_WEIGHT;
                    g.Priority = EBookConstant.NEXT_WORD_PRIORITY;
                    sr.LoadGrammarAsync(g);
                }
                else if (g.Weight != EBookConstant.DEFAULT_WEIGHT || g.Priority != EBookConstant.DEFAULT_PRIORITY)
                {
                    loadGrammarCompleted = false;
                    loadGrammarCount++;
                    Debug.WriteLine("reloading grammar(weight=+" + g.Weight + ",p=" + g.Priority + ")..." +
                                    "\t" + EBookUtil.GetUnixTimeMillis() + "\t" + g.RuleName);
                    sr.UnloadGrammar(g);
                    g.Weight   = EBookConstant.DEFAULT_WEIGHT;
                    g.Priority = EBookConstant.DEFAULT_PRIORITY;
                    sr.LoadGrammarAsync(g);
                }
            }
        }
 /// <summary>
 /// Enable/disable SR
 /// Disable SR when you absolutely don't need to recognize a speech.
 /// You can keep the SR running when load a grammar. But
 /// it may need to disable the SR before unload a grammar.
 /// </summary>
 /// <param name="b"></param>
 public void enableSR(bool b)
 {
     if (b)
     {
         if (!recOn)
         {
             while (!loadGrammarCompleted && loadGrammarCount != 0)
             {
                 Thread.Sleep(3);
             }
             Debug.WriteLine("is load grammar complete before enable SR? " +
                             loadGrammarCompleted + "\t" + EBookUtil.GetUnixTimeMillis());
             sr.start();
             recOn = true;
             Debug.WriteLine("Rec on");
         }
     }
     else
     {
         if (recOn)
         {
             sr.stop();
             recOn = false;
             Debug.WriteLine("Rec off");
         }
     }
 }
 /// <summary>
 /// Load the given story grammar.
 /// </summary>
 /// <param name="g"></param>
 public void LoadStoryGrammar(Grammar g)
 {
     Debug.WriteLine("loading story grammar(" + g.Weight + "," + g.Priority + ")..." +
                     g.RuleName + "\t" + EBookUtil.GetUnixTimeMillis());
     loadGrammarCompleted = false;
     sr.LoadGrammarAsync(g);
     currentStoryGrammars.Add(g);
 }
 /// <summary>
 /// Load the on going grammar.
 /// On going grammar are generated when the reader stop at the word that is not
 /// the last word of a sentence. for instance, in a sentence "I ate pizza for dinner.",
 /// if the reader say "I ate pizza" and stop, the system will expect the reader to "for dinner"
 /// next, so the system will generate the grammar for "for dinner" and loaded to SR.
 /// </summary>
 /// <param name="g">The grammar to be loaded</param>
 public void LoadOnGoingGrammar(Grammar g)
 {
     loadGrammarCompleted = false;
     loadGrammarCount++;
     Debug.WriteLine("loading onGoing grammar..." + "\t" + EBookUtil.GetUnixTimeMillis());
     sr.LoadGrammarAsync(g);
     onGoingGrammars.Add(g);
 }
        public void handleRejectRecognition(float confidence, string textResult, KeyValuePair <string, SemanticValue>[] kvp)
        {
            ActivityExecutor.add(new InternalRejectRecognitionActivity());
            String timeStamp = EBookUtil.GetTimestamp();

            string text = "\n" + confidence + "\t" + textResult + "(rejected)\t\t" +
                          kvp.ToArray() + "\t" + timeStamp;

            Trace.WriteLine(text);
        }
        public void handleSpeechHypothesizedResult(float confidence, string textResult,
                                                   string grammarName, string ruleName, KeyValuePair <string, SemanticValue>[] kvp,
                                                   double audioDuration)
        {
            ActivityExecutor.add(new InternalSpeechRecognitionResultActivity(confidence, textResult, true,
                                                                             kvp, grammarName, ruleName, audioDuration, null));
            String timeStamp = EBookUtil.GetTimestamp();

            string text = "\n" + confidence + "\t" + textResult + "(Hypothesis)\t" +
                          kvp.ToArray() + "\tgrammarName=" + grammarName + "\truleName=" +
                          ruleName + "\t" + timeStamp;

            Trace.WriteLine(text);
        }
 /// <summary>
 /// Unload the active story grammar from SR
 /// </summary>
 public void UnloadStoryGrammar()
 {
     //stopSR();
     if (currentStoryGrammars.Count > 0)
     {
         foreach (Grammar g in currentStoryGrammars)
         {
             sr.UnloadGrammar(g);
             Debug.WriteLine("unloading story grammar(" + g.Weight + "," + g.Priority +
                             ")..." + g.RuleName + "\t" + EBookUtil.GetUnixTimeMillis());
         }
         currentStoryGrammars.Clear();
     }
     // startSR();
 }
        /// <summary>
        /// This method will create the grammar from the given list of text and annotation, and activiate it on the fly.
        /// This is happening in runtime, while the SR is running; it might downgrade the performance if the list increased.
        /// </summary>
        /// <param name="listText"></param>
        /// <param name="annotations"></param>
        public void GenerateAndLoadGrammars(string[] listText, string[] annotations)
        {
            String timeStamp = EBookUtil.GetTimestamp();

            Debug.WriteLine("Before load grammar time:" + timeStamp);


            for (int i = 0; i < listText.Length; i++)
            {
                if (i == 0 || (i > 0 && (listText[i - 1].Contains("?") ||
                                         listText[i - 1].Contains(".") || listText[i - 1].Contains("!"))))
                {
                    for (int j = i; j < listText.Length && j < i + MAX_WORDS_IN_SPEECH; j++)
                    {
                        string        ea   = "";
                        List <string> anno = new List <string>();
                        for (int k = i; k <= j; k++)
                        {
                            ea += listText[k] + " ";
                            if (!anno.Contains(annotations[k]))
                            {
                                anno.Add(annotations[k]);
                            }
                        }
                        string annotate = "";
                        foreach (string ann in anno)
                        {
                            annotate += ann + ";";
                        }
                        ea = ea.TrimEnd();
                        SemanticResultValue temp = new SemanticResultValue(ea, i);
                        GrammarBuilder      gb   = new GrammarBuilder(new SemanticResultKey("startIndex", temp));
                        SemanticResultValue ano  = new SemanticResultValue(annotate);
                        gb.Append(new SemanticResultKey("annotation", ano));
                        Grammar storyGrammar = new Grammar(gb);

                        sr.LoadGrammarAsync(storyGrammar);
                        currentStoryGrammars.Add(storyGrammar);
                        allDefaultStartIndexes.Add(i);
                    }
                }
            }

            String after = EBookUtil.GetTimestamp();

            Debug.WriteLine("after load grammar time:" + after);
        }
        public void handleAudioStateChanged(AudioState audioState)
        {
            string text      = "\nAudio State: " + audioState;
            String timeStamp = EBookUtil.GetTimestamp();

            Trace.WriteLine(text + "\t" + timeStamp);
            SpeechState state = SpeechState.UNKNOWN;

            if (audioState == AudioState.Silence)
            {
                state = SpeechState.SPEECH_END;
            }
            else if (audioState == AudioState.Speech)
            {
                state = SpeechState.SPEECH_START;
            }
            ActivityExecutor.add(new InternalSpeechStateChangeActivity(state));
        }
        public void handleSpeechRecognizedResult(float confidence, string textResult,
                                                 string grammarName, string ruleName, KeyValuePair <string, SemanticValue>[] kvp,
                                                 double audioDuration, RecognizedAudio audio)
        {
            string fileP   = null;
            string relPath = null;

            //only write audio file when given path is not null
            if (saveAudioPath != null)
            {
                string indexerStr = waveFileNameIndexer + "";
                while (indexerStr.Length < 4)
                {
                    indexerStr = "0" + indexerStr;
                }

                fileP = saveAudioPath + "\\" + indexerStr + ".wav";

                relPath = EBookUtil.convertAudioToRelativePath(@fileP);
            }

            ActivityExecutor.add(new InternalSpeechRecognitionResultActivity(confidence, textResult, false,
                                                                             kvp, grammarName, ruleName, audioDuration, relPath));

            //only write audio file when given path is not null
            if (fileP != null)
            {
                //write audio to file
                FileStream stream = new FileStream(fileP, FileMode.Create);

                audio.WriteToWaveStream(stream);
                stream.Flush();
                stream.Close();
                unconfirmSaveAudioList.Add(fileP);
                Trace.WriteLine("write to file " + fileP);
                waveFileNameIndexer++;
            }
            String timeStamp = EBookUtil.GetTimestamp();

            string text = "\n" + confidence + "\t" + textResult + "(complete)\t\t" +
                          kvp.ToArray() + "\t" + grammarName + "\t" + timeStamp;

            Trace.WriteLine(text);
        }
        public void handleAudioLevelUpdate(int audioLevel)
        {
            String timeStamp = EBookUtil.GetTimestamp();

            Trace.WriteLine("audio level:" + audioLevel + "\t" + timeStamp);
            if (audioLevel > EBookInteractiveSystem.initialNoiseSensitivity)
            {
                int    start    = 0;
                double unixTime = EBookUtil.GetUnixTimeMillis();
                if (preAudioLevel == 0)
                {
                    //audio energy level jump
                    start = 1;
                }
                ActivityExecutor.add(new InternalAudioLevelChangeActivity(audioLevel, start, unixTime));
            }
            else if (audioLevel == 0 && preAudioLevel > 0 && audioLevel == 0)
            {
                //audio energy level drop
                ActivityExecutor.add(new InternalAudioLevelChangeActivity(audioLevel, -1, 0));
            }
            preAudioLevel = audioLevel;
        }
 public InternalRejectRecognitionActivity()
 {
     creationTime = EBookUtil.GetUnixTimeMillis();
 }
 public void handleFinishLoadingGrammar(string grammarName)
 {
     Debug.WriteLine("Load grammar completed" + "\t" + EBookUtil.GetUnixTimeMillis());
     loadGrammarCount--;
     loadGrammarCompleted = true;
 }