Verständnissproblem bei Spracherkennung + MFCC + neurales Netzwerk

OP #2550461
Lesenswert?

Hallo,
ich schreibe hier mal im offtopic weil ich nicht genau weiß in welche 
Kategorie das hier paßt.
Ich versuche eine Spracherkennung zu programmieren, die ganze kurze 
Worte z.B. Ziffern oder Kommandos, Sprecher unanhängig erkennen soll. 
Nach dem Studium einiger whitepapers die dieses Thema behandeln ist mein 
Ansatz dort folgender :
-Volumengesteuerte Wort(sample) aufnahme (22050Hz Mono 16Bit)
-6dB Verstärkungsfilter
-Aufsplitten des samples in frames (512 Datenpunkte ~20ms, 50% overlap, 
zeor padding)
also für ein kurzes Wort wie "test" erhalte ich ~63 frames.
für jedes frame:
-HammingWindowFunktion
-FFT
-Mel filter (Dreiecks bandpass Filter)
-Log energie
-MFCC (DCT) 12 Koeffizienten (in Zukunft sollen es 26 Koeffizienten 
sein)
so an diesem Punkt heißt es überall : Das NeuraleNetzwerk mit den MFCCs 
füttern und darüber das Wort erkennen.
Hier hänge ich fest... für jedes der 63 frames erhalte ich 12 MFCCs... 
das wären dann schon über 700 inputs für das neurale Netzwerk... und was 
ist wenn ich das selbe Wort etwas schneller oder langsamer spreche, dann 
paßt das ja garnicht mehr mit der Anzahl der Inputs des NN zusammen. Das 
kann also so nicht sein.
Wie kann ich die MFCCs der einzelnen sich überlappenden Frames so 
zusammenfassen das ich eine konstante Menge an Inputs für das NN 
bekomme?
Gibt es da evtl. sowas wie eine Hash-Funktion der ich die ganzen MFCCs 
der frames übergebe und die daraus dann einen x-Stelligen Hashwert 
berechnet welcher dann aber auch nicht 100% eindeutig sein darf wenn man 
halt das selbe Wort nur etwas anders ausspricht?
Oder bin ich da total auf dem Holzweg?

MfG
GrobiG
#2550479
Lesenswert?

Christian G. schrieb:
> so an diesem Punkt heißt es überall : Das NeuraleNetzwerk mit den MFCCs
> füttern und darüber das Wort erkennen.
> Hier hänge ich fest... für jedes der 63 frames erhalte ich 12 MFCCs...
> das wären dann schon über 700 inputs für das neurale Netzwerk... und was
> ist wenn ich das selbe Wort etwas schneller oder langsamer spreche, dann
> paßt das ja garnicht mehr mit der Anzahl der Inputs des NN zusammen.

Evtl: TDNN mit 12 Eingängen, die Frames nacheinander reinfüttern?
Admin Persönliche Seite #2550571
Lesenswert?

Das Problem bei Sprache ist, dass die MFCC-Features für ein Wort zwar 
eine charakteristische Reihenfolge haben, aber fast beliebig in der 
Länge gestreckt sein können. Die Daten irgendwie in eine Black Box 
(künstliches neuronales Netz) zu füttern und zu hoffen dass dieser 
Zusammenhang "automatisch" erkannt wird ist utopisch. Besser ist es das 
vorhandene Wissen über die Daten schon beim Design der Modellstruktur zu 
berücksichtigen. State of the art ist heute das Hidden Markov Model 
(HMM), früher hat man Dynamic Time Warping verwendet. Mit den 
Stichwörtern findest du beliebig viel Bücher, Papers und 
Open-Source-Software.
Gast #2551692
Lesenswert?

Schau Dir sonst mal die "Kohonen"-Implementationen neuronaler Netzwerke 
an, die sind sehr gut geeignet, um Phoneme sinnvoll zu unterscheiden. 
Für die Erkennung eines Wortes reichen allg. zwei, eins "lernt" das 
Spektrum eines Lautes, das zweite die zeitliche Änderung der 
detektierten Phoneme. Das allein ist aber schon genug Forschungsarbeit, 
es hat bei mir schon Wochen gedauert, die Netzwerke sinnvoll 
implementiert zu bekommen, ganz zu schweigen von der sinnvoll 
gefensterten FFT-Analyse.
#2553826
Lesenswert?

Christian G. schrieb:
> Hier hänge ich fest... für jedes der 63 frames erhalte ich 12 MFCCs...
> das wären dann schon über 700 inputs für das neurale Netzwerk... und was
> ist wenn ich das selbe Wort etwas schneller oder langsamer spreche, dann
> paßt das ja garnicht mehr mit der Anzahl der Inputs des NN zusammen. Das
> kann also so nicht sein.

Doch passt: du musst recurrente NNs benutzen, dh. du fütterst diese 
sequentiell mit den 63 Frames a 12 Inputs. Recurrente NNs haben "ein 
Gedächtnis" und können somit sequentielle Muster erkennen.

Was anderes macht auch garkeinen Sinn. Denke mal drüber nach: du 
zerlegst ein sequentiell gesprochenes Wort in 63 Frames und legst diese 
in  parallel am NN an. Wozu ? Soll dieses NN irgendwas verwürfeltes 
erlernen ? Wie soll das NN lernen das diese 63 Segment nur in dieser 
einen Reihenfolge korrekt sind ? Ergo: recurrrente NN und sequentiell 
diese Frames füttern.

Nächstes Problem: was ist wenn das Wort mehr oder weniger als 63 Frames 
hat ? Dann würde sich bei deinem Vorgehen ja die Anzahl der 
Inputneuronen veränderlich gestalten müssen. Bei RNNs ist das hinfällig 
da diese mit X beliebig langen Sequenzen von Mustern umgehen können und 
denoch die sequentielle Abhängigkeiten der Muster in korrekter 
Reihenfolge erlernen.

Suche mal nach "Recurrent Cascade Correlation Neuronal Network", auf 
dieser These aufbauend hatte ich mein Netzwerk programmiert und gute 
Erfolge damit erzielt (Handschrift Erkennung usw.)

Gruß Hagen

Gockel erster PDF Link:
http://www.google.com/url?sa=t&rct=j&q=Recurrent+Cascade+Correlation+Neuronal+Network&source=web&cd=1&ved=0CC0QFjAA&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.34.1831%26rep%3Drep1%26type%3Dpdf&ei=zkk-T_PKI8WVswah_-DvBA&usg=AFQjCNH9YojKWTem63JmV7KlLURRyfTKCA

PS: Kohonen NNs kannst'e vergessen und das HMM hat den Nachteil das man 
selber viel Intelligenz investieren muß und nicht das NN für sich daran 
arbeiten lässt. TDNNs können das was RCCs schon von Hause aus viel 
besser können da RCCs das auf Neuronenebene/Layerebene schon können, 
damit sind TDNNs anfällig auf Planungsfehler beim Design der 
zeitverzögerten Netzwerke und abhängig vom festgelegten Delay. das 
entfällt bei RCCs.
#2553883
Lesenswert?

Ein interessantes Projekt damals war ein Ratespiel bei dem der Mensch 
sich für die Antworten JA/NEIN frei entscheiden konnte. Mit diesen 
Antworten wurde ein RNN live trainiert und es gab eine Tip ab was die 
naächste Antwort des Menschens (JA/NEIN) sein könnte. Die Anzahl der 
positiven Treffer wurde dem RNN gebucht und bei falscher Vorhersage dem 
Menschen. nach ca. 100 Tipps des Menschen (ohne Wissen wie der 
gegenspieler funktioniert) gewann das RNN mit 70% Wahrscheinlichkeit.

Hintergrund der Sache war zu "beweisen" das der Mensch

1. nicht zufällig wählen kann
2. seine "zufällige" Wahl von seinen vorherigen Wahlmöglichkeiten, 
Entscheidungen und Antworten des NNs abhängig sind
3. ein minimales Bespiel für die Fähigkeiten der RNNs zu konstruieren

Gruß Hagen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren