2

Итак, у меня есть этот код распознавания голоса, с которым я работал с использованием Microsoft Recognition Engine.Механизм распознавания речи Microsoft Переключение между грамматиками

К сожалению, это не так уж и фантастично, когда я понимаю голос, поэтому я думал об этом. Одним из них является переключение между конкретными грамматиками и грамматиками общего словаря. Я не могу понять, как я могу переключаться между грамматиками, хотя в случае, если вы не распознаете данную речь.

Если кто-нибудь может помочь мне разобраться, как это сделать, опять же, что это возможность переключиться с моей грамматики CommandList из моей грамматики в DictationGrammar(), всякий раз, когда моя грамматика commandList не может распознать выбранную речь.

Вот код:

//using Microsoft.Speech.Recognition; 

using System; 
using System.Speech.Recognition; 
using System.Windows.Forms; 
using System.Collections.Generic; 

namespace vRec 
{ 
    public class Form1 
    { 
     static int counter = 0; 
     static bool stop = false; 
     static string command = null; 
     static List<String> commandList = new List<string>() { "zooey", "open", "quit", "search", "close", "yes", "no" }; 
     static Choices keywords = new Choices(); 

    public static void Main() 
    { 
     command = null; 
     stop = false; 

     // Create an in-process speech recognizer for the en-US locale. 
     using (
     SpeechRecognitionEngine recognizer = 
     new SpeechRecognitionEngine(
      new System.Globalization.CultureInfo("en-US"))) 
     { 

     keywords.Add(commandList.ToArray()); 
     GrammarBuilder grammarBuilder = new GrammarBuilder(keywords); 
     Grammar testGrammar = new Grammar(grammarBuilder); 
     recognizer.LoadGrammar(testGrammar); 
     recognizer.LoadGrammar(new DictationGrammar()); 

     // Add a handler for the speech recognized event. 
     recognizer.SpeechRecognized += 
      new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized); 

     // Configure input to the speech recognizer. 
     recognizer.SetInputToDefaultAudioDevice(); 

     // Start asynchronous, continuous speech recognition. 
     recognizer.RecognizeAsync(RecognizeMode.Multiple); 

     Console.WriteLine("NOT TERMINATED"); 

     // Keep the console window open. 
     if(!stop) 
     Console.ReadLine(); 
    } 
} 

    // Handle the SpeechRecognized event. 
    public static void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     if (counter == 2 && (e.Result.Text.ToUpper() == "YES" || e.Result.Text.ToUpper() == "US" || e.Result.Text.ToUpper() == "AS")) 
     { 
      counter = 0; 
      Console.WriteLine("THANK YOU LORD JEBUS"); 
      stop = true; 
      SendKeys.SendWait("{ENTER}"); 
      //command string to be passed in for functions in c++ code 
     } 
     else if (counter == 2 && (e.Result.Text.ToUpper() == "NO" || e.Result.Text.ToUpper() == "NOW" || e.Result.Text.ToUpper() == "KNOW" || e.Result.Text.ToUpper() == "OH" || e.Result.Text.ToUpper() == "NOT" || e.Result.Text.ToUpper() == "NOPE" || e.Result.Text.ToUpper() == "NAH")) 
     { 
      Console.WriteLine("Can you spell that?"); 
      counter = 1; 
      command = e.Result.Text; 
     } 
     else if (counter == 2 && (e.Result.Text.ToUpper() != "YES" || e.Result.Text.ToUpper() != "US" || e.Result.Text.ToUpper() != "AS" || e.Result.Text.ToUpper() != "NO" || e.Result.Text.ToUpper() != "NOW" || e.Result.Text.ToUpper() != "KNOW" || e.Result.Text.ToUpper() != "OH" || e.Result.Text.ToUpper() != "NOT" || e.Result.Text.ToUpper() != "NOPE" || e.Result.Text.ToUpper() != "NAH")) 
     { 
      //Console.WriteLine(counter); 
      Console.WriteLine("Can you repeat that?"); 
      counter = 1; 
     } 

     if (counter == 1) 
     { 
      command = e.Result.Text; 

      if (e.Result.Text.ToUpper() == "ALL BEEN" || e.Result.Text.ToUpper() == "OPIUM" || e.Result.Text.ToUpper() == "OLD AND" || e.Result.Text.ToUpper() == "HOLE IN" || e.Result.Text.ToUpper() == "HOPING" || e.Result.Text.ToUpper() == "OLD BEEN" || e.Result.Text.ToUpper() == "OPEN") 
       command = "open"; 

      if (e.Result.Text.ToUpper() == "WAIT" || e.Result.Text.ToUpper() == "QUITE" || e.Result.Text.ToUpper() == "QUIP" || e.Result.Text.ToUpper() == "QUICK" || e.Result.Text.ToUpper() == "CLIP" || e.Result.Text.ToUpper() == "QUIT") 
       command = "quit"; 

      if (e.Result.Text.ToUpper() == "SUCH" || e.Result.Text.ToUpper() == "SORT" || e.Result.Text.ToUpper() == "SEARCH") 
       command = "search"; 

      if (e.Result.Text.ToUpper() == "RULES" || e.Result.Text.ToUpper() == "FELLOWS" || e.Result.Text.ToUpper() == "CLOSE") 
       command = "close"; 

      commandList.Add(command); 
      Console.WriteLine(counter); 
      Console.WriteLine("Recognized text: " + command); 
      Console.WriteLine("Is this correct?"); 

      for (int i = 0; i < commandList.Count; i++) 
      { 
       Console.WriteLine("/" + commandList[i]); 
      } 

      counter++; 

     } 

     if (e.Result.Text.ToUpper() == "ZOOEY" || e.Result.Text.ToUpper() == "ZOE" || e.Result.Text.ToUpper() == "EASILY" || e.Result.Text.ToUpper() == "SALLY" || e.Result.Text.ToUpper() == "ZONE" || e.Result.Text.ToUpper() == "ZONE WE" || e.Result.Text.ToUpper() == "SOLELY" || e.Result.Text.ToUpper() == "ZOELLICK" && counter == 0) 
     { 
      counter++; 
      Console.WriteLine("How can I help you?"); 
     } 

     Console.WriteLine("Recognized text: " + e.Result.Text); 
    } 

    public static string getCommand() 
    { 
     return command; 
    } 

    } 
} 

Любая помощь будет оценена.^^

ответ

0

Один из способов я мог думать:.

Установить доверительный порог, произвольно выбирая 0,6, а затем переключили грамматику, если подобранная речь ниже этого порога внутри вашего метода recognizer_SpeechRecognized. Для которого, вы должны использовать «SpeechRecognitionEngine.UnloadAllGrammars» в сочетании с SpeechRecognitionEngine.LoadGrammarAsync , чтобы получить уверенность распознанного слова,

e.Result.Confidence`, so your code could look like: 
    if (e.Result.Confidence <0.6) { 
     recognizer.RequestRecognizerUpdate(); 
     recognizer.UnloadAllGrammars(); 
     recognizer.LoadGrammarAsync(//switch your grammmars); 

    } 

вам придется взглянуть на наличие ваших грамматик и т.д.. в этой области. Надеюсь, это поможет!