Dienstag, 22. März 2011

Spracherkennung Part 1: Dictation Mode

Im vorigen Post ging es um die Sprachausgabe mit .Net, dieses Mal widmen wir uns der Umkehrung, nämlich der Spracherkennung.
Diese ist für Computer viel schwieriger als die Ausgabe, das .Net Framework bietet über die Klasse System.Speech.Recognition allerdings wieder fertige Funktionen an, die mit wenig Codeaufwand zur Spracherkennung eingesetzt werden können.
Generell gibt es 2 Modi, in welchen die Spracherkennung betrieben werden kann: In diesem Post geht es um den Dictation Mode, im nächsten um den Command Mode.
Der Dictation Mode eignet sich, wie der Name schon sagt, zum Diktieren von Texten.
Der aufgezeichnete Ton wird wie ein Diktat verstanden und das Programm versucht, die gesprochenen Wörter zu erkennen.
Wie bei der Sprachausgabe muss zuerst ein Verweis auf die Komponente System.Speech eingebunden werden.
Die benötigte Unterklasse heißt nun allerdings Recognition, und so benutzen wir am Anfang folgende using - Direktive:

using System.Speech.Recognition;

Zur Spracherkennung benutzen wir eine Instanz der Klasse SpeechRecognitionEngine.
Diese benötigt eine Grammatik, also eine Art Anweisungssammlung, wie die Sprache interpretiert werden soll.
Als Grammatik übergeben wir der SpeechRecognitionEngine eine Instanz der Klasse DictationGrammar, um anzuzeigen, dass wir den Diktiermodus benutzen wollen.
Das Erkennen von gesprochenen Wörtern geschieht nun mit Aufruf der Funktion Recognize(). Diese setzt die Spracherkennung in Bereitschaftsmodus und beginnt, wenn das Mikrofon Töne vernimmt.
Macht der Sprecher eine bestimmte Zeit Pause (einstellbar), wird die Spracherkennung beendet und das Programm versucht nun, den Ton als Wörter zu interpretieren (eine asynchrone Aufnahme ist auch möglich).
Zum Schluss wird das Diktierergebnis zurückgegeben.
Hier der Code:

            SpeechRecognitionEngine SRE = new SpeechRecognitionEngine();
            SRE.LoadGrammar(new DictationGrammar()); // Diktiergrammatik laden
            SRE.SetInputToDefaultAudioDevice(); // Aufnahmequelle auf Standard setzen

            RecognitionResult Result = SRE.Recognize(); // Ton aufzeichnen und erkennen
            string ResultString = "";
            // alle erkannten Wörter aus dem Ergebnis dem Ergebnisstring hinzufügen
            foreach (RecognizedWordUnit w in Result.Words)
            {
                ResultString += w.Text;
            }

Kommentare: