Ich versuche, einen Algorithmus zu schreiben, der automatisch ein Stück Audio mit Vogelrufaufzeichnungen segmentiert. Meine Eingabedaten sind Wave-Dateien mit einer Länge von 1 Minute. Für die Ausgabe möchte ich separate Aufrufe zur weiteren Analyse erhalten. Das Problem ist, dass das Signal-Rausch-Verhältnis aufgrund der Umgebungsbedingungen und der schlechten Qualität eines Mikrofons (Mono, 8-kHz-Abtastung) ziemlich schrecklich ist.
Ich wäre sehr dankbar für Ratschläge, wie Sie mit der Geräuschreduzierung fortfahren können.
Hier ist ein Beispiel für meine Eingabe, eine Minute Audioaufnahme im Wave-Format: http://goo.gl/16fG8P
So sieht das Signal aus:
Die Bandpassfilterung, bei der ich nur etwas zwischen 1500 und 2500 Hz behalte, verbessert die Situation zwar, ist aber weit von den Erwartungen entfernt. In diesem Spektrum ist noch viel Rauschen vorhanden.
Ich habe auch die langfristige durchschnittliche Energie (über 32 Stichprobenintervalle) aufgezeichnet und einige Klicks daraus entfernt. Hier ist das Ergebnis:
Bei all dem verbleibenden Rauschen muss ich einen sehr niedrigen Schwellenwert für den Erkennungsalgorithmus festlegen, um die letzten 10 Sekunden der Vogelrufe zu erfassen. Das Problem ist, wenn ich es so optimiere, kann ich bei der nächsten Aufnahme eine Menge falsch positiver Ergebnisse erhalten.
Filter mit gleitendem Durchschnitt hilft ein bisschen bei Windgeräuschen. Irgendwelche anderen Ideen? Ich dachte an "Spektrale Subtraktion", aber hier scheint es mir, dass ich eine Art Henne-Ei-Problem habe - um einen Nur-Rausch-Bereich zu finden, muss ich das Audio segmentieren und das Audio segmentieren, das ich brauche, um das Rauschen zu entfernen. Kennen Sie Bibliotheken mit diesem Algorithmus oder einige Implementierungen in Pseudocode? Methinks Audacity verwendet eine solche Methode, um Rauschen zu entfernen. Es ist sehr effektiv, aber es bleibt dem Benutzer überlassen, nur den Bereich mit Rauschen zu markieren.
Ich schreibe in Python und es ist ein kostenloses Open-Source-Projekt.
Danke fürs Lesen!