Seite 1 von 2
Simple Spracherkennung
Verfasst: 15.03.2007 13:45
von Hoto
Für ein Projekt bräuchte ich eine ähnliche Spracherkennung wie in Nintendogs (Spiel für Nintendo DS). Also man weißt einem Spielbefehl einen Sprachbefehl zu, der der Spieler selbst über Mikro eingibt und der je öfter man ihn trainiert, besser erkannt wird.
Das wäre in der Kürze das was ich bräuchte. Gibt es da schon so etwas ähnliches in PB, das man als Grundlage verwenden kann oder müsste man hier komplett bei null anfangen? Kennt vielleicht Jemand ein Tutorial für eine derartige Spracherkennung? Diese ist ja lange nicht so Komplex wie eine richtige Spracherkennung.
Verfasst: 15.03.2007 21:35
von ZeHa
Ich habe mal einen Vortrag über Spracherkennung gehalten, also es ist auf jeden Fall keine leichte Sache. Für eine Spracherkennung wie Du es meinst, also wo es nur um die Zuordnung einzelner Befehle geht, funktioniert es meist so, daß die aufgenommene Sprache in kleine Stücke zerlegt wird, deren Schwingungskurven vektorisiert werden, welche dann wiederum mit vorher gespeicherten Vektoren verglichen werden. Das, was dann am Ähnlichsten ist, wird als Ergebnis betrachtet.
Verfasst: 15.03.2007 23:53
von Froggerprogger
Du könntest auch versuchen, dein aufgenommenes Sprachsample zu normalisieren, mit erstem Überschreiten eines gewissen Schwellenwerts beginnen zu lassen und dann von den 44100 Samples/sec auf bspw. 100 Samples/Sekunde durch Mittelwerte runterzusamplen. Dann sollte der Effekt ähnlich sein, wie wenn man sich zwei mehrsekündige WAV-Files nach starkem Rauszoomen anzeigt und das Vergleichen nicht mehr so schwer sein (minimale Differenz zu allen gespeicherten Versionen)
Allgemein ist es schwieriger, zwei WAV-Dateien zu vergleichen, anstatt zwei Bilder. Bei ähnlichen Bildern sind die Farbwerte an denselben Stellen oft ähnlich. Bei Audiosignalen jedoch bringt ein sampleweiser Vergleich gar nichts. Daher könnte ein runtersamplen auf bspw. 100 Hz Samplingrate wie oben beschrieben Vorteile bringen, denn auf dieser groben Auflösung ist an den Samplewerten maßgeblich die mittlere Lautstärke zu diesem Zeitpunkt beteiligt, welche bei gleichgesprochenen Worten ähnlich ist. Wenn aber jemand unterschiedlich schnell redet, wird dieser Ansatz schon wieder deutlich schlechter.
Es gibt sicherlich weit bessere Verfahren, die aber wesentlich komplizierter sind.
Verfasst: 16.03.2007 10:07
von ZeHa
Eben deswegen ist es sinnlos, die Samples zu vergleichen, sondern man muß erst Vektorisieren um daraus Ähnlichkeiten zu finden. Der Verlauf ist wichtig, nicht die einzelnen Samples. Denn ein einzelnes Sample sagt überhaupt nix aus, es ist die Abfolge bzw. die Kurve, die charakteristisch ist.
Es ist aber wirklich nicht einfach... wie gesagt, ich hab mich mal ein bißchen damit befaßt (nur für den Vortrag, also nix selbst implementiert), ich schau mal in meinen Unterlagen nach ob es da irgendwelche freien Beispielimplementierungen gibt.
Verfasst: 16.03.2007 18:13
von Hoto
Irgendwie steh ich gerade auf dem Schlauch. Also das mit dem Vektorisieren hab ich jetzt schon ein paar mal gelesen, jedoch kann ich mir im Moment gerade nicht vorstellen, was das eigentlich genau bedeutet. Wie sehen denn die Daten aus, die nach einer Verktorisierung ausgegeben werden? Gibt es da vielleicht eine Grafik oder ein gutes Beispiel? Eine reine Textbeschreibung bringt mir da nicht viel.
Was ist daran eigentlich so schwer? Ich dachte immer das scheitert nur daran, weil es in der Theorie schon hapert, aber scheinbar scheint es ja eigentlich klar zu sein, wie man das machen muss.
Ist Vektorisieren eigentlich sehr rechenaufwendig für die CPU?
Verfasst: 16.03.2007 19:02
von ZeHa
Weißt Du was eine Vektorgrafik ist? Vergleiche das mit einer Pixelgrafik, und Du weißt, was Vektorisierung ist
Im Endeffekt ist es so - bei einer Pixelgrafik hast Du jeden Pixel eindeutig definiert, bei einer Vektorgrafik hast Du Punkte und Kurven. So ähnlich ist das dann auch bei einer Audio-Aufzeichnung. Normalerweise hast Du pro Sekunde z.B. 44100 Samples, alles eindeutige Werte. Wenn Du das vektorisieren würdest (und gleichzeitig auch die Genauigkeit drastisch runterschraubst), hättest Du nur noch ein paar Punkte und die dazwischenliegenden Kurven. Nehmen wir an, es wären statt 44100 Samples nun nur noch 100 Punkte inkl. deren Kurven, diese kannst Du mit vorgespeicherten Sprachfetzen um einiges leichter vergleichen als wenn Du die 44100 Samples vergleichen müßtest. Zudem fällt es leichert, die grobe "Form" zu vergleichen, da Du ja durch die Kurven auch sowas wie eine "Form" erhältst, und wenn da nun ein einzelner Punkt mal nicht ganz so genau ist, dann paßt die Form trotzdem noch.
Ich hoffe das ist einigermaßen anschaulich erklärt. Letztendlich geht es nur drum, die Daten ein wenig "allgemeiner" und "einfacher" zu machen, sodaß Du besser auf Ähnlichkeiten und Unterschiede hin vergleichen kannst.
Verfasst: 16.03.2007 20:10
von Zaphod
@Hoto:
Spracherkennung ist deswegen schwer zuverlässig zu machen, weil Menschen in unterschiedlichen Tonhöhen sprechen, in unterschiedlichen Geschwindigkeiten und noch dazu gerne mal mit mehr oder weniger starken Dialekt.
Das ganze zu Vektorisieren und dann mit gewisser toleranz zu vergleichen ist noch relativ einfach. Wirklich gute Ergebnisse zu bekommen ist aber beliebig komplizierter.
Verfasst: 17.03.2007 10:55
von Hoto
@ZeHa: danke, jetzt ist der Groschen gefallen.
@Zaphod: ja, das ist mir alles schon klar, aber nach den ganzen Jahren, in denen an Spracherkennung gearbeitet wird, müsste es inzwischen doch irgendwelche Infos im Netz geben, wie man diese Probleme einschränken kann.
Wie gesagt will ich ja nichts kompliziertes, wer Nintendogs vielleicht kennt, der weiß, dass die Spracherkennung hier extrem einfach gehalten ist. Worte brauchen nur sehr ähnlich klingen und sie werden alle als ein Wort erkannt, wobei diese einfache Spracherkennung sogar noch für Realismus sorgt, weil echte Hunde auch nicht ähnlich klingende Wörter so genau auseinander halten können.
Mir geht es eben darum für eine Spielidee genau diese Spracherkennung zu kopieren, weil ich es im Prinzip für das Gleiche brauche wie in Nintendogs. Die Spracherkennung muss also gar nicht so präzise arbeiten, sie muss lediglich die Sprachbefehle, die der Spieler selbst frei festlegt, wiedererkennen können und mit mehrfachem Training diese besser erkennen können.
Bei Nintendogs ist es so, dass man den Hund mit einer Stylus-Geste dazu bringt, sich z.B. hinzusetzen, anschließend leuchtet ein Symbol auf, wenn man dies anklickt, kann man nun einen max. 1 Sek langen Sprachbefehl in das DS Mikro sprechen. Dies muss man ein paar mal wiederholen (trainieren). Es kann sein das man ihn nur 3x wiederholen muss oder auch öfters, bis man dann ein Zeichen vom Spiel kriegt, das der Hund ein neues Kunststück gelernt hat und der Hund dann ab sofort auf den Sprachbefehl reagiert.
Ich vermute daher, dass die Spracherkennung so funktioniert, das man dem Spiel den Befehl mehrere male sagt, damit dieser verschiedene Vergleichswerte für einen Befehl hat und so die Erkennungswahrscheinlichkeit gesteigert wird. Da man dem Spiel doch einige Sprachbefehle beibringen kann und der DS ja nicht gerade über unendlich Speicherplatz verfügt (man kann ja sogar mehrere Hunde haben, denen man alle extra Sprachbefehle beibringt), schätze ich auch, dass das Ganze auf Vektoren basiert. Vermutlich wird dann ein Sprachbefehl mit den trainierten Befehlen verglichen und wenn die Abweichung bei allen nur sehr gering ist, dann wird der Befehl erkannt. Da das Spiel aber nicht so genau zwischen Wörtern wie z.b. Haus, Laus und Raus unterscheiden kann, muss das Ganze wirklich sehr simple funktionieren.
Das ganze zu Vektorisieren und dann mit gewisser toleranz zu vergleichen ist noch relativ einfach. Wirklich gute Ergebnisse zu bekommen ist aber beliebig komplizierter.
Eben das denke ich mir auch und wie gesagt brauche ich gar keine so gute Ergebnisse.
Im übrigen war die Spielidee ursprünglich auch als DS Spiel gedacht, ich will das Ganze aber erstmal als einfaches PC Spiel umsetzen, was auch daran liegt das ich mit PureBasic sehr viel leichter programmieren kann.
Verfasst: 17.03.2007 12:42
von Hoto
Wie muss ich denn nun eine Wav Datei genau vektorisieren? Einfach nur immer abwechselnd die Tiefst- und Höchstwerte auslesen?
Verfasst: 17.03.2007 13:01
von Zaphod
Am besten für jeden punkt den Mittelwert der Amplituden.