Ich arbeite an einem Projekt in Python, um ein Vogellied zu erkennen und zu klassifizieren, und ich habe mich in einer Position befunden, in der ich eine Wave-Datei in Frequenz- / Zeitdaten konvertieren muss. Dies war kein allzu großes Problem, aber um die verschiedenen Silben in Gruppen einteilen zu können, muss ich etwas schreiben, das erkennt, wenn sich die Daten zu einer bestimmten Form zusammenballen. Um Ihnen eine Vorstellung davon zu geben, wie die Daten aussehen, sehen Sie hier ein Bild davon, wie die Daten beim Plotten aussehen:
Ich brauche eine Möglichkeit, um jede einzelne Silbe (jede Form mit einem Abstand auf beiden Seiten) zu erhalten und sie entweder in einer Variablen oder in ihren eigenen Dateien zu speichern, damit ich mit SciPy die Pearson-Korrelation zwischen ihnen ausführen kann.
Ich bevorzuge auch Python, bin aber offen für das Codieren in anderen Sprachen, wenn Sie eine andere Möglichkeit haben.
Vielen Dank!
quelle
Antworten:
Zwei Fragen:
1 / In der Nähe von 8s können wir eine stabile Tonhöhe von ungefähr 100 ms beobachten, dann fällt ein plötzlicher Anstieg bis 8,5 s ab. Bildet diese gesamte Sequenz (8s bis 8,5s) eine einzelne Entität, oder betrachten Sie die beiden Stufen (stabil, dann abnehmend) als zwei Entitäten?
2 / Möchten Sie mit oder ohne Aufsicht arbeiten? Kennen Sie im Voraus die "Muster", nach denen Sie suchen müssen?
Wenn Sie ohne Aufsicht arbeiten möchten (sagen wir, Sie haben Aufzeichnungen gesammelt und möchten eine "strukturierte Darstellung" daraus extrahieren), ist Ihr Problem in einem ersten Schritt mit der Erkennung von Sprachaktivitäten vergleichbar. Verwenden Sie einfach die Signalintensität, möglicherweise in Verbindung mit einer "Tonhöhen" -Metrik (z. B. das Verhältnis des Maximums der Autokorrelation im Brid-Bereich, hier 1 kHz - 5 kHz), um Segmente zu erkennen, in denen ein aktiver starker Ton vorliegt. Filtern Sie die resultierende Sequenz im Median, um sie zu glätten, und setzen Sie dann einen Schwellenwert, um die verschiedenen Segmente zu erhalten. Sobald Sie Ihr Signal in Segmente unterteilt haben, können Sie mit ihnen interessante Dinge tun. Sie können beispielsweise für jeden von ihnen eine Tonhöhenbahn extrahieren (eine Sequenz mit der stärksten Frequenzspitze für jeden FFT-Rahmen oder etwas Robusteres, das mit einem echten Tonhöhenschätzer extrahiert wurde). Verwenden Sie DTW, um eine Matrix paarweiser Abstände zwischen jedem Block zu berechnen, und verwenden Sie einen Clustering-Algorithmus (k-means, agglomeratives Clustering), um Gruppen mit ähnlichen Tonhöhenmustern (Segmente 8: 8,5 und 10: 10,5) zu identifizieren. Es ist wahrscheinlich, dass ein unbeaufsichtigter Ansatz übersegmentiert - zum Beispiel werden 7.6: 8.5 und 9.6: 10.5 als Wiederholung der beiden gleichen Blöcke erkannt, während sie für Sie grundsätzlich ein einziges Muster sein könnten, aber Sie könnten so etwas verwendenSequitur , um eine Strukturebene höher zu haben.
Wenn Sie ein vordefiniertes Wörterbuch mit "Mustern" haben, mit denen Sie Ihr Signal kennzeichnen möchten, sollten Sie besser den für die Spracherkennung verwendeten Ansätzen folgen, mit dem einzigen großen Unterschied, dass die Spracherkennung die Tonhöhe nicht berücksichtigt, während Sie sich in Ihrem befinden Fallhöhe ist die einzige zu berücksichtigende Information! Ein Spracherkennungssystem übernimmt sowohl die Segmentierungs- als auch die Erkennungsaufgabe in einer einzigen FST-Decodierungsoperation.
quelle