2017-06-12 2 views
2

Ich mache derzeit mit der System.Speech herum, um ein Amazon Alexa-Programm zu erstellen, in dem Sie einen Befehl eingeben und eine Antwort zurücksenden.Erkennen einer bestimmten Phrase, um die Erkennung für den Befehl zu starten

Jetzt habe ich es eingerichtet, wo ich auf eine Schaltfläche klicken, so dass es beginnt, Audio-Eingabe vom Mikrofon zu erkennen, aber ich möchte den Alexa-Stil oder Google-Stil ("Alexa" oder "Hey Google") tun.

Hier ist, was ich bisher:

public partial class SpeechRecognition : Form 
{ 

    SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine(); 
    SpeechSynthesizer synth = new SpeechSynthesizer(); 




    public SpeechRecognition() 
    { 
     InitializeComponent(); 
    } 

    private void SpeechRecognition_Load(object sender, EventArgs e) 
    { 
     Choices command = new Choices(); 
     command.Add(new string[] { "Say Hello", "Print my name", "speak selected text", "time", "current weather", "humidity"}); 

     GrammarBuilder gBuilder = new GrammarBuilder(); 
     gBuilder.Append(command); 

     Grammar grammar = new Grammar(gBuilder); 

     recEngine.LoadGrammarAsync(grammar); 
     recEngine.SetInputToDefaultAudioDevice(); 

     recEngine.SpeechRecognized += recEngine_SpeechRecognized; 

    } 

    void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
    { 
     synth.SelectVoiceByHints(VoiceGender.Neutral); 
     var request = new ForecastIORequest("...", 38.47382f, -76.50636f, DateTime.Now, Unit.us); 
     var response = request.Get(); 
     switch (e.Result.Text) 
     { 
      case "Say Hello": 
       PromptBuilder builder = new PromptBuilder(); 

       builder.StartSentence(); 
       builder.AppendText("Hello Zack"); 
       builder.EndSentence(); 

       builder.AppendBreak(new TimeSpan(0, 0, 0, 0,50)); 

       builder.StartSentence(); 
       builder.AppendText("How are you?"); 
       builder.EndSentence(); 

       synth.SpeakAsync(builder); 
       break; 

      case "Print my name": 
       richTextBox1.Text += "\nZack"; 
       break; 

      case "speak selected text": 
       synth.SpeakAsync(richTextBox1.SelectedText); 
       break; 
      case "time": 
       DateTime time = DateTime.Now; 
       synth.SpeakAsync(time.ToShortTimeString()); 
       break; 
      case "current weather": 
       response = request.Get(); 

       synth.SpeakAsync("The weather in St. Leonard is " + response.currently.summary + "with a temperature of " + Math.Round((decimal)response.currently.temperature, 0) + " degrees farenheit"); 
       break; 
      case "humidity": 
       response = request.Get(); 
       synth.SpeakAsync("Current humidity is " + 100 * response.currently.humidity + "percent"); 
       break; 
      default: 
       synth.SpeakAsync("I did not recognize a command"); 
       break; 
     } 
    } 

    private void enableBtn_Click(object sender, EventArgs e) 
    { 
     recEngine.RecognizeAsync(RecognizeMode.Multiple); 
     disableBtn.Enabled = true; 

    } 

    private void disableBtn_Click(object sender, EventArgs e) 
    { 
     recEngine.RecognizeAsyncStop(); 
     disableBtn.Enabled = false; 
    } 

Wie würde ich dies ändern, so dass es ständig für diesen einen Satz hört, dann wird es danach für einen Befehl hören? Ich vermute, ich muss eine andere Instanz der Erkennungs-Engine erstellen? Jede Hilfe wäre großartig.

Antwort

0

Nicht sicher speziell, wie würden Sie den Hörer Code, aber „immer“ Sie können einfach erstellen eine Endlosschleife zu hören:

while(true) { 

    //add your code that listens and waits for the wake word and once you process the wake word exit 

} 
Verwandte Themen