Sto cercando di scrivere un algoritmo che segmenterebbe automaticamente un pezzo di audio con le registrazioni delle chiamate degli uccelli. I miei dati di input sono file wave di 1 minuto e sull'output vorrei ricevere chiamate separate per ulteriori analisi. Il problema è che il rapporto segnale-rumore è piuttosto terribile a causa delle condizioni ambientali e della scarsa qualità di un microfono (campionamento mono, 8 kHz).
Sarei molto grato per qualsiasi consiglio su come procedere ulteriormente con la riduzione del rumore.
Ecco un esempio del mio input, un minuto di registrazione audio in formato wave: http://goo.gl/16fG8P
Ecco come appare il segnale:
Il filtro passa-banda, in cui mantengo solo qualsiasi cosa tra 1500 e 2500 Hz, migliora la situazione, ma è ancora lontano dalle aspettative. In questo spettro è ancora presente molto rumore.
Ho anche tracciato un'energia media a lungo termine (oltre 32 campioni) e rimosso alcuni clic da essa. Ecco il risultato:
Con tutto il rumore rimanente devo impostare una soglia molto bassa per l'algoritmo di rilevazione dell'insorgenza per selezionare gli ultimi 10 secondi di chiamate degli uccelli. Il problema è che se lo modifico in modo tale che nella prossima registrazione riesco a caricare carichi di falsi positivi.
Il filtro della media mobile aiuta un po 'con il rumore del vento. Altre idee? Stavo pensando a "Sottrazione spettrale", ma qui mi sembra di avere una sorta di problema con le galline e le uova: per trovare un'area solo rumorosa devo segmentare l'audio e segmentare l'audio che devo rimuovere. Conosci delle librerie che hanno questo algoritmo o alcune implementazioni in pseudo-codice? Pensa che Audacity utilizza un tale metodo per rimuovere il rumore. È molto efficace, ma è lasciato all'utente per contrassegnare l'area solo rumore.
Sto scrivendo in Python ed è un progetto open source gratuito.
Grazie per aver letto!