2015-05-31 3 views
-2

Я пытаюсь сделать многоуровневую командную речь, но у меня проблемы с ней ...Многоуровневые команды речи?

Я хочу иметь мастер-команды, такие как: «TV», «Light», «water», и т.д.

Когда я говорю «TV», например, я хочу иметь вложенные команды для желаемого действия, такие как:

Когда я говорю «TV»: суб команд -> «Громкость вверх», «Volume down "," power off "," power on "

Я узнаю только команды для телевизора, пока не скажу« TV done ». Затем я вернусь к списку мастер-команд.

Как я могу это сделать?

Мой реальный код заключается в следующем:

class Program 
    { 
     static Dictionary<string, string> listaCanais = new Dictionary<string, string>() 
      { 
       { "Fox News", "0 6 0" }, 
       { "The Weather Channel", "0 3 1"}, 
       { "Spike", "0 3 8"} 
      }; 
     static void Main(string[] args) 
     { 
      using (var sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("pt-BR"))) 
      { 
       sre.SetInputToDefaultAudioDevice(); 

       sre.LoadGrammarAsync(Comandos()); 

       sre.RequestRecognizerUpdate(); 
       sre.SpeechRecognitionRejected += sre_SpeechRecognitionRejected; 
       sre.SpeechRecognized += sre_SpeechRecognized; 

       sre.RecognizeAsync(RecognizeMode.Multiple); 

       Console.ReadLine(); 
      } 
     } 

     public static Grammar Comandos() 
     { 
      Choices numerosTV = new Choices("zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "10", "11", "12"); 

      GrammarBuilder fraseNumeroTV = new GrammarBuilder(numerosTV); 

      GrammarBuilder fraseMudarCanal = new GrammarBuilder("TV, canal"); 
      fraseMudarCanal.Append(numerosTV); 
      //fraseMudarCanal.Append(numerosTV); 
      //fraseMudarCanal.Append(numerosTV); 

      Choices nomeCanal = new Choices(); 

         foreach (string key in listaCanais.Keys) 
      { 
       nomeCanal.Add(key); 
      } 

      GrammarBuilder fraseNomeCanal = new GrammarBuilder("TV, canal"); 
      fraseNomeCanal.Append(nomeCanal); 

      GrammarBuilder fraseMudo = new GrammarBuilder("TV, silencioso"); 
      GrammarBuilder fraseLigar = new GrammarBuilder("TV, ligar"); 
      GrammarBuilder fraseFecharApp = new GrammarBuilder("Controle, fechar aplicativo"); 
      GrammarBuilder frasePauseComandoVoz = new GrammarBuilder("Controle, pausar comando de voz"); 
      GrammarBuilder fraseIniciarComandoVoz = new GrammarBuilder("Controle, ativar comando de voz"); 

      Choices opcoesPrincipais = new Choices(new GrammarBuilder[] {fraseMudarCanal, 
                     fraseNomeCanal, 
                     fraseMudo, 
                     fraseLigar, 
                     fraseFecharApp, 
                     frasePauseComandoVoz, 
                     fraseIniciarComandoVoz}); 

      Grammar resultado = new Grammar((GrammarBuilder)opcoesPrincipais); 
      return resultado; 

     } 

     static void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e) 
     { 
      Console.WriteLine("Ignorado"); 

     } 

     // Create a simple handler for the SpeechRecognized event. 
     static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 
      Console.WriteLine("Ouvi"); 

      if (e.Result == null) 
       return; 

      Console.WriteLine("[ " + e.Result.Confidence + " ]" + "Reconhecido: " + e.Result.Text); 
     } 
    } 

Спасибо заранее.

ответ

0

Такие вещи просты в использовании в пределах state machine framework. Необходимо определить состояние распознаватель и действовать на ее основе, основная работа выполняется в onRecognitionResult метода:

states = {INPUT, TV, WATER}; 

inputGrammar = createInputGrammar(); 
tvGrammar = createTvGrammar(); 
waterGrammar = createWaterGrammar(); 

state = INPUT; 

vodi onRecognitionResult() { 

    if (state == INPUT) { 
     if (result == "TV") { 
      state = TV; 
      recognizer.loadGrammar(tvGrammar); 
     } 
    } 
    if (state == TV) { 
     if (result == "Volume UP") { 
      raiseVolume(); 
     } 
     if (result == "TV done") { 
      state = INPUT; 
      recognizer.loadGrammar(inputGrammar); 
     } 
    } 
    // Restart recognition 
    recognizer.recognizeAsync(); 
} 

Вы можете прочитать Simple state machine example in C#? для получения дополнительной информации.

Смежные вопросы