Hallo Community,
dies ist mein erstes Tutorial, es geht um Sprachsteuerung in VB.NET.
1. Allgemeines
Was wollen wir machen?
Wir möchten eine Sprachsteuerung programmieren, welche von uns gesprochene Wörter oder Sätze erkennt und darauf reagiert.
Ihr braucht für die Sprachsteuerung .NET 3.0 oder höher. Ich weiß nicht ob die Sprachsteuerung auf XP läuft. Getestet habe ich sie gerade auf Windows 7 Prof. 64 Bit und XP Home Edition 32 Bit auf Windows 7 funktionierte sie sehr zuverlässig und flüssig. Auf Windows XP wurde ich jedoch mit Fehlermeldungen zugeschüttet welche ich nicht richtig nachvollziehen konnte. Genug geredet jetzt zur richtigen Theorie :D.
2. Theroie
Wie funktioniert eine Sprachsteuerung eigentlich? Soweit ich weiß, zeichnet eine Sprachsteuerung den gesprochenen Befehl auf und vergleicht ihn mit einer anderen Stimme. Genauer: Vorher spricht jemand einen Satz, welcher in Buchstaben aufgegliedert wird. Z.B. Ich habe einen tollen Affen. > I | c | h | h | a | b | e usw. Und in diesem Satz müssen alle Buchstaben des Alphabetes vorhanden sein. Danach wird aus den Puzzelteilen das Wort wieder zusammen gelegt und verglichen mit der Aufnahme.
Ich weiß ist nicht so gut erklärt, wenn es jemand besser formulieren kann bitte mir sagen ich werde es editieren.
3. Praxis
Endlich bei der Praxis angekommen und das gelaber ist weg.
1. Ein Projekt erstellen
Als erstes brauchen wir ein neues Projekt, eine Konsolenanwendung. (Wahlweise auch eine Windows Forms Anwedung siehe weiter unten.)
Wenn ihr die Konsolenanwendung erstellt habt fügt einen Verweis hinzu, dafür klickt ihr in Visual Studio auf Projekt > 'Name eures Projektes' - Eigenschaften > Verweise > Hinzufügen > .NET und sucht System.Speech > OK > Fertig wieder zurrück zum Code.
2. Der Code
Als erstes Importiert ihr jetzt diese 6 Zeilen:
Über Sub Main kommt das:
Hier wurden erstmal ein paar Variablen deklariert.
Nun, schreibt ihr in Sub Main() folgenden Code:
Wenn bis hierhin alles funktioniert hat ist es super. Dann sind wir fast durch. Sollte hier alles klar sein weil ich es auskommentiert habe.
Jetzt brauchen wir noch den Sub an dem die Vergleichung also grob die Erkennung wirklich stattfindet. Der sieht folgendermaßen aus:
Dürfte auch klar sein, da auskommentiert.
3. Die XML grammar Datei
So, das wars eigentlich auch schon. Jetzt kommt aber noch der Aufbau von grammar.xml diese muss in diesem Fall im Verzeichnis liegen in dem auch das Programm ansässig ist. Sie sieht folgendermaßen aus:
Alsooo, hier stehen die Befehle drin, auf welche das Programm reagieren soll. Ganz oben werden erst einmal die Schemen für die XML Datei angegeben. Das ist für uns aber gerade unwichtig. Darunter wird eine ID angegeben mit der wir im Programm die Befehle ansprechen können. Nun können wir beliebig viele Befehle angeben, indem wir einfach den Befehl durch ein weiteres Item hinzufügen. Einfach unter den jeweils letzen Befehl (In unserem Beispiel 'was') MEIN NEUER BEFEHL</item> schreiben. Diese können dann nacher im Programm verarbeitet werden. Unten werden einfach die oben gemachten Details wieder geschlossen.
P.S.: Ich habe noch vergessen das ihr auch Englische Befehle verwenden könnt, aber dann müsst ihr in der grammar Datei bei xml:lang das de-DE durch en-EN oder falls das nicht klappt en-US ersetzen.
VIEL SPAß damit.
4. Ein paar Sachen von mir an die Welt
Ich möchte mich an dieser Stelle bei ErfinderDesRades sehr bedanken, da er für diese Tutorial den Code nochmal umgeschrieben hat, sodass es eigentlich bei niemanden mehr Probleme geben dürfte, außerdem hat er den Code noch deutlich vereinfacht und übersichtlicher gemacht und ein Form Beispiel dazu geschrieben. Also Bedankt euch alle noch geistlich bei ErfinderDesRades.
Morgen werde ich ein Visual Studio Exampel und ein Forms Beispiel anhängen. Einen schönen Abend wünsche ich noch.
Quelle: amenthes.de/index.php/2007/12/…t-35-zur-spracherkennung/
dies ist mein erstes Tutorial, es geht um Sprachsteuerung in VB.NET.
1. Allgemeines
Was wollen wir machen?
Wir möchten eine Sprachsteuerung programmieren, welche von uns gesprochene Wörter oder Sätze erkennt und darauf reagiert.
Ihr braucht für die Sprachsteuerung .NET 3.0 oder höher. Ich weiß nicht ob die Sprachsteuerung auf XP läuft. Getestet habe ich sie gerade auf Windows 7 Prof. 64 Bit und XP Home Edition 32 Bit auf Windows 7 funktionierte sie sehr zuverlässig und flüssig. Auf Windows XP wurde ich jedoch mit Fehlermeldungen zugeschüttet welche ich nicht richtig nachvollziehen konnte. Genug geredet jetzt zur richtigen Theorie :D.
2. Theroie
Wie funktioniert eine Sprachsteuerung eigentlich? Soweit ich weiß, zeichnet eine Sprachsteuerung den gesprochenen Befehl auf und vergleicht ihn mit einer anderen Stimme. Genauer: Vorher spricht jemand einen Satz, welcher in Buchstaben aufgegliedert wird. Z.B. Ich habe einen tollen Affen. > I | c | h | h | a | b | e usw. Und in diesem Satz müssen alle Buchstaben des Alphabetes vorhanden sein. Danach wird aus den Puzzelteilen das Wort wieder zusammen gelegt und verglichen mit der Aufnahme.
Ich weiß ist nicht so gut erklärt, wenn es jemand besser formulieren kann bitte mir sagen ich werde es editieren.
3. Praxis
Endlich bei der Praxis angekommen und das gelaber ist weg.
1. Ein Projekt erstellen
Als erstes brauchen wir ein neues Projekt, eine Konsolenanwendung. (Wahlweise auch eine Windows Forms Anwedung siehe weiter unten.)
Wenn ihr die Konsolenanwendung erstellt habt fügt einen Verweis hinzu, dafür klickt ihr in Visual Studio auf Projekt > 'Name eures Projektes' - Eigenschaften > Verweise > Hinzufügen > .NET und sucht System.Speech > OK > Fertig wieder zurrück zum Code.
2. Der Code
Als erstes Importiert ihr jetzt diese 6 Zeilen:
Über Sub Main kommt das:
Hier wurden erstmal ein paar Variablen deklariert.
Nun, schreibt ihr in Sub Main() folgenden Code:
VB.NET-Quellcode
- Sub Main()
- recognizer.SetInputToDefaultAudioDevice() 'Hier wird das Audio Gerät gesetzt, in diesem Fall das Standard Mikrofon welches in Windows konfiguriert ist.
- Console.WriteLine("Ich kenne die folgenden Wörter:") ' Dürfte klar sein was hier passiert.
- Console.WriteLine("Das Wort ""Beenden"" wird das Programm beenden." & Environment.NewLine) ' Siehe oben.
- For Each xel In xDoc.Elements()(0).Elements()(0).Elements()(0).Elements() ' In dieser Schleife werden alle Items, also Worte, die in der Grammar Datei (Das kommt weiter unten.) deklariert wurden auf der comand line ausgegeben.
- Console.WriteLine(xel.Value) ' Gehört zur Schleife.
- Next ' Ende der Schleife.
- Dim grammar As New Grammar(_GrammarFile, "thema") ' Hier wird die Grammardatei Sprache 'mit einer Varbiable "verbunden"'...
- recognizer.UnloadAllGrammars() ' An dieser Stelle wird der Cache von allen 'alten' 'Grammatiken' gelöscht.
- recognizer.LoadGrammar(grammar) ' Hier wird die neue 'Grammatik' geladen. Also die Befehle.
- recognizer.RecognizeAsync(RecognizeMode.Multiple) ' Jetzt wird die eigentliche Erkennung gestartet.
- Console.WriteLine() ' Leerzeile auf die comand line schreiben, dass es schöner aussieht.
- _Waiter.WaitOne() ' Hier wird verhindert, dass das Programm geschlossen wird bevor Beenden gesagt wird.
- recognizer.Dispose() ' Hier wird der Speicher gelöscht
- Console.WriteLine("Programm wird geschlossen...") ' Dürfte klar sein was hier passiert.
- Threading.Thread.Sleep(1000) ' Nach 1 Sek wird das Programm komplett beendet.
- End Sub
Wenn bis hierhin alles funktioniert hat ist es super. Dann sind wir fast durch. Sollte hier alles klar sein weil ich es auskommentiert habe.
Jetzt brauchen wir noch den Sub an dem die Vergleichung also grob die Erkennung wirklich stattfindet. Der sieht folgendermaßen aus:
VB.NET-Quellcode
- Private Sub recognizer_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs) Handles recognizer.SpeechRecognized
- Dim spoken_text = e.Result.Text ' Hier wird das Ergebniss der gesprochenen Befehle in eine Variable übernommen zur einfacheren Verwendung im Verlauf des Codes.
- If spoken_text = "Beenden" Then _Waiter.Set() ' Hier wird eben bei dem Befehl Beenden das Signal zum beenden des Programmes an den Main Sub geschickt.
- Console.WriteLine(spoken_text & " (" & e.Result.Confidence.ToString() & ")") ' Hier wird der Befehl der erkannt wurde in die Konsole geschrieben und dahinter als kleines Plus noch wie gut der Computer den Befehl erkannt hat. In Prozent.
- End Sub
Dürfte auch klar sein, da auskommentiert.
3. Die XML grammar Datei
So, das wars eigentlich auch schon. Jetzt kommt aber noch der Aufbau von grammar.xml diese muss in diesem Fall im Verzeichnis liegen in dem auch das Programm ansässig ist. Sie sieht folgendermaßen aus:
XML-Quellcode
- <grammar xmlns="http://www.w3.org/2001/06/grammar"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3.org/2001/06/grammar
- http://www.w3.org/TR/speech-grammar/grammar.xsd"xml:lang="de-DE" version="1.0">
- <rule id="thema" scope="public"><one-of>
- <item>Test</item><item>Dies ist ein Test</item>
- <item>Beenden</item>
- <item>was</item></one-of>
- </rule>
- </grammar>
Alsooo, hier stehen die Befehle drin, auf welche das Programm reagieren soll. Ganz oben werden erst einmal die Schemen für die XML Datei angegeben. Das ist für uns aber gerade unwichtig. Darunter wird eine ID angegeben mit der wir im Programm die Befehle ansprechen können. Nun können wir beliebig viele Befehle angeben, indem wir einfach den Befehl durch ein weiteres Item hinzufügen. Einfach unter den jeweils letzen Befehl (In unserem Beispiel 'was') MEIN NEUER BEFEHL</item> schreiben. Diese können dann nacher im Programm verarbeitet werden. Unten werden einfach die oben gemachten Details wieder geschlossen.
P.S.: Ich habe noch vergessen das ihr auch Englische Befehle verwenden könnt, aber dann müsst ihr in der grammar Datei bei xml:lang das de-DE durch en-EN oder falls das nicht klappt en-US ersetzen.
VIEL SPAß damit.
4. Ein paar Sachen von mir an die Welt
Ich möchte mich an dieser Stelle bei ErfinderDesRades sehr bedanken, da er für diese Tutorial den Code nochmal umgeschrieben hat, sodass es eigentlich bei niemanden mehr Probleme geben dürfte, außerdem hat er den Code noch deutlich vereinfacht und übersichtlicher gemacht und ein Form Beispiel dazu geschrieben. Also Bedankt euch alle noch geistlich bei ErfinderDesRades.
Morgen werde ich ein Visual Studio Exampel und ein Forms Beispiel anhängen. Einen schönen Abend wünsche ich noch.
Quelle: amenthes.de/index.php/2007/12/…t-35-zur-spracherkennung/
Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ () aus folgendem Grund: SampleProjekt angehängt