Eines meiner Wochenendprojekte hat mich in die Tiefe der Signalverarbeitung geführt. Wie bei allen meinen Code-Projekten, für die etwas Hochleistungs-Mathematik erforderlich ist, bin ich mehr als erfreut, trotz fehlender theoretischer Grundlagen den Weg zu einer Lösung zu finden, aber in diesem Fall habe ich keine und würde gerne einen Rat zu meinem Problem geben Ich versuche nämlich herauszufinden, wann das Live-Publikum während einer TV-Show lacht.
Ich habe viel Zeit damit verbracht, mich über maschinelles Lernen zum Erkennen von Lachen zu informieren, aber mir wurde klar, dass dies mehr mit dem Erkennen von individuellem Lachen zu tun hat. Zweihundert Menschen, die auf einmal lachen, werden sehr unterschiedliche akustische Eigenschaften haben, und ich habe die Intuition, dass sie durch viel gröbere Techniken als ein neuronales Netz unterscheidbar sein sollten. Ich kann mich jedoch völlig irren! Würde mich über Gedanken zu diesem Thema freuen.
Folgendes habe ich bisher versucht: Ich habe einen fünfminütigen Ausschnitt aus einer kürzlich erschienenen Folge von Saturday Night Live in zwei Sekunden-Clips zerlegt. Ich habe diese dann als "Lachen" oder "Nicht-Lachen" bezeichnet. Mit dem MFCC-Funktionsextraktor von Librosa habe ich dann ein K-Means-Clustering für die Daten durchgeführt und gute Ergebnisse erzielt. Die beiden Cluster wurden sehr genau auf meine Etiketten abgebildet. Aber als ich versuchte, die längere Datei zu durchlaufen, hatten die Vorhersagen kein Wasser.
Was ich jetzt versuchen werde: Ich werde präziser vorgehen, um diese Lachclips zu erstellen. Anstatt blind aufzuteilen und zu sortieren, extrahiere ich sie manuell, damit kein Dialog das Signal verschmutzt. Dann teile ich sie in Viertelsekunden-Clips auf, berechne die MFCCs und trainiere mit ihnen eine SVM.
Meine Fragen an dieser Stelle:
Ist irgendetwas davon sinnvoll?
Können Statistiken hier helfen? Ich habe im Spektrogramm-Ansichtsmodus von Audacity herumgescrollt und kann ziemlich deutlich erkennen, wo Lachen auftritt. In einem logarithmischen Leistungsspektrogramm hat Sprache ein sehr charakteristisches, "gefurchtes" Aussehen. Im Gegensatz dazu deckt Lachen ein breites Frequenzspektrum ziemlich gleichmäßig ab, fast wie eine Normalverteilung. Es ist sogar möglich, Applaus visuell von Lachen zu unterscheiden, indem die Anzahl der im Applaus dargestellten Frequenzen begrenzt wird. Das lässt mich an Standardabweichungen denken. Ich sehe, es gibt so etwas wie den Kolmogorov-Smirnov-Test. Könnte das hier hilfreich sein? (Sie können das Lachen auf dem obigen Bild als eine orangefarbene Wand sehen, die 45% des Weges nach innen trifft.)
Das lineare Spektrogramm scheint zu zeigen, dass das Lachen bei niedrigeren Frequenzen energischer ist und bei höheren Frequenzen nachlässt - bedeutet dies, dass es als rosa Rauschen eingestuft wird? Wenn ja, könnte dies ein Grund für das Problem sein?
Ich entschuldige mich, wenn ich einen Jargon missbraucht habe. Ich war ziemlich oft auf Wikipedia und würde mich nicht wundern, wenn ich ein bisschen durcheinander geraten wäre.
quelle
Antworten:
Basierend auf Ihrer Beobachtung, dass das Spektrum des Signals ausreichend unterscheidbar ist, können Sie dies als eine Funktion verwenden, um Lachen von Sprache zu klassifizieren.
Es gibt viele Möglichkeiten, wie Sie das Problem betrachten können.
Ansatz Nr. 1
In einem Fall können Sie sich nur ansehen Vektor des MFCC betrachten. und wende dies auf einen beliebigen Klassifikator an. Da Sie im Frequenzbereich viele Koeffizienten haben , sollten Sie sich die Cascade Classifiers- Struktur mit darauf basierenden Boosting-Algorithmen wie Adaboost ansehen , um zwischen Sprach- und Lachklasse zu vergleichen.
Ansatz 2
Sie erkennen, dass Ihre Sprache im Wesentlichen ein zeitvariables Signal ist. Eine der effektivsten Möglichkeiten ist es, die zeitliche Variation des Signals selbst zu betrachten. Zu diesem Zweck können Sie Signale in Stapel von Samples aufteilen und das Spektrum für diese Zeit betrachten. Nun können Sie feststellen, dass das Lachen für eine festgelegte Dauer ein sich wiederholenderes Muster aufweisen kann, wenn die Sprache von Natur aus mehr Informationen enthält und daher die Variation des Spektrums eher größer ist. Sie können dies auf anwenden HMM- Modelltyp festzustellen , ob Sie für ein bestimmtes Frequenzspektrum ständig im selben Status bleiben oder sich ständig ändern. Hier ändert sich die Zeit, auch wenn das Sprachspektrum gelegentlich dem des Lachens ähnelt.
Ansatz 3
Erzwingen Sie das Aufbringen einer LPC / CELP-Codierung auf das Signal und beobachten Sie den Rückstand. Die CELP-Codierung bildet ein sehr genaues Modell der Sprachproduktion ab.
Aus der Referenz hier: THEORIE DER CELP-CODIERUNG
Einfach ausgedrückt, nachdem die gesamte vom Analysator vorhergesagte Sprache entfernt wurde, verbleibt der Rest, der übertragen wird, um die exakte Wellenform wiederherzustellen.
Wie hilft das bei deinem Problem? Wenn Sie die CELP-Codierung anwenden, wird die Sprache im Signal größtenteils entfernt, und es verbleiben Reste. Im Falle eines Lachens kann ein Großteil des Signals erhalten bleiben, da CELP ein solches Signal bei der Stimmtraktmodellierung nicht vorhersagen kann, da die individuelle Sprache nur sehr geringe Rückstände aufweist. Sie können diesen Rückstand auch im Frequenzbereich analysieren, um festzustellen, ob es sich um Lachen oder Sprache handelt.
quelle
Die meisten Spracherkenner verwenden nicht nur die MFCC-Koeffizienten, sondern auch die erste und die zweite Ableitung der MFCC-Pegel. Ich vermute, dass die Ansätze in diesem Fall sehr nützlich wären und Ihnen helfen, ein Lachen von anderen Klängen zu unterscheiden.
quelle