Mittwoch, 23. März 2011

Spracherkennung Part 2: Command Mode

Wie angekündigt, ist dieser Post eine Fortsetzung des vorigen, es geht um Spracherkennung, insbesondere um den Command Mode.
Wie der Name schon andeutet, wird aufgenommene Sprache damit auf vordefinierte Befehle untersucht.
Man könnte natürlich auch über den im vorigen Post beschriebenen Dictation Mode einen Text aufnehmen und diesen auf bestimmte Begriffe hin untersuchen - der Command Mode bietet dafür allerdings ein paar Vorteile.
Denn einerseits ermöglicht er leicht eine dauerhafte Prüfung, ob Befehle gesagt wurden, und andererseits ist die Erkennung besser, da das Programm nur die Befehlswörter kennt und sich bei der Erkennung nur zwischen diesen entscheiden muss.
Nun direkt zum Code: Die Vorraussetzungen (das Einbinden der Ressource etc.) sind die gleichen wie im vorigen Post.
Zum Erkennen der Befehle benutzen wir jetzt allerdings eine Instanz der Klasse SpeechRecognizer.
Diese erwartet auch eine Grammatik, welche wir aber jetzt manuell mit Wörtern befüllen, die erkannt werden sollen.
Über die Eigenschaft Enabled kann die Spracherkennung aktiviert werden.
Beim Erkennen von Befehlen tritt das Ereignis SpeechRecognized auf, diesem weisen wir eine Funktion zu, welche das Ereignis behandeln soll.
Wird ein SpeechRecognizer initialisiert, öffnet sich unter Windows ein Fenster zur Spracherkennung - hier muss der Benutzer auf den großen Mikrofonknopf drücken, um die Erkennung zu starten.
Das Drücken des Knopfes hat nichts mit der Eigenschaft Enabled zu tun - beide Dinge müssen aktiviert sein.
Einen Weg, die Spracherkennung nur per Code zu starten und das Fenster zu verstecken habe ich nicht gefunden. Mich würde aber interessieren ob das möglich ist, falls jemand eine Idee hat, bitte kommentieren!
Der Code:

        private void StartListening()
        {
            SpeechRecognizer SR = new SpeechRecognizer();
            // die Befehle registrieren
            Choices Commands = new Choices();
            Commands.Add("Stop");
            Commands.Add("Los");
            GrammarBuilder GB = new GrammarBuilder(Commands); // die Befehle mit einem GrammerBuilder laden
            Grammar CommandGrammar = new Grammar(GB); // eine Grammatik über den GrammarBuilder erstellen
            SR.LoadGrammar(CommandGrammar); // die Grammatik laden
            SR.SpeechRecognized += CommandRecognized; // Funktion zur Behandlung des Ereignisses
            SR.Enabled = true;
        }

        private void CommandRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string Command = e.Result.Text;
            // hier weiterer Verarbeitungscode ...
        }

Kommentare:

  1. Super, einfach nur 1a erklärt. Läuft bestens und macht Spaß ! Danke !

    AntwortenLöschen
    Antworten
    1. Habe doch noch einen minimalen Verbesserungsvorschlag, wenn man SR.Enable =true ; am ende der CommandRecognized mit einfügt wird der Fokus immer wieder passend ins Programm gesetzt ( ist bei mir zwischendurch verloren gegagen ).

      Löschen
  2. mit SpeechRecognitionEngine ist die spracherkennung ohne das Fenster möglich.

    AntwortenLöschen
    Antworten
    1. Kannst du ein Code Beispiel posten?

      Löschen