Riduci il rumore di fondo e ottimizza il parlato da una clip audio utilizzando ffmpeg


30

Estraggo clip audio da un file video per il riconoscimento vocale. Questi video provengono da dispositivi mobili / altri fatti a mano e quindi contengono molto rumore. Voglio ridurre il rumore di sottofondo dell'audio in modo che il parlato che inoltro al mio motore di riconoscimento vocale sia chiaro. Sto usando ffmpeg per fare tutto questo, ma sono bloccato nella fase di riduzione del rumore.

Fino ad ora ho provato i seguenti filtri:

ffmpeg-20140324-git-63dbba6-win64-static\bin>ffmpeg -i i nput.wav -filter_complex "highpass=f=400,lowpass=f=1800" out2.wav

ffmpeg -i i nput.wav -af "equalizer=f=1000:width_type=h:width=900:g=-10" output.wav

ffmpeg -i i nput.wav -af "bandreject=f=1200:width_type=h:width=900:g=-10" output.wav

Ma i risultati sono molto deludenti. Il mio ragionamento era che, poiché il parlato rientra nell'intervallo 300-3000 hz, posso filtrare tutte le altre frequenze per sopprimere qualsiasi rumore di fondo. Cosa mi sto perdendo?

Inoltre, ho letto dei filtri Weiner che potrebbero essere utilizzati per i miglioramenti del parlato e ho trovato questo, ma non sono sicuro di come usarlo.

Risposte:


36

Se stai cercando di isolare la voce udibile, prova a combinare un filtro passa-basso con un filtro passa-alto. Per l'audio utilizzabile ho notato che filtrare 200Hz e inferiori filtrare 3000Hz e superiori fa un ottimo lavoro nel mantenere l'audio vocale utilizzabile.

ffmpeg -i <input_file> -af "highpass=f=200, lowpass=f=3000" <output_file>

In questo esempio aggiungere prima il filtro passa-alto per tagliare le frequenze più basse, quindi utilizzare il filtro passa-basso per tagliare le frequenze più alte. Se necessario, è possibile eseguire il file più di una volta per ripulire le frequenze db più elevate all'interno delle gamme di frequenza di taglio.


Ci dispiace, ma questo sembra non fare una notevole riduzione del rumore per me.
Angad,

Funziona molto bene per ridurre il livello di rumore di fondo (ventole, ronzio, ecc.) Ma può compromettere leggermente la qualità audio, sebbene ciò possa essere mitigato in qualche modo applicando successivamente altri filtri.
Iain Collins,

3
Nel mio caso l'audio originale era così cattivo che era quasi impossibile sentire la voce a causa di un rumore di caduta dell'acqua in sottofondo. Ho usato il seguente. Non è di grande qualità, ma 1000 volte migliore dell'originale. -af "highpass=f=200, lowpass=f=1000"
Eric

Ottengo un errore con quanto sopra o piuttosto, avviso da ffmpeg: [Parsed_highpass_0 @ 0x1524780] che taglia 52 volte. Riduci il guadagno.
Shevy

6
Puoi visualizzare l'anteprima del filtro conffplay <input file> -af lowpass=3000,highpass=200
Björn

11

FFmpeg ora ha 2 filtri nativi per gestire il rumore di fondo:

Inoltre, da un po 'di tempo, si possono usare i filtri ladspa(cercare noise-supressor) e / o lv2(cercare il denoiser vocale) con FFmpeg.


9

ffmpeg non ha filtri audio decenti per la riduzione del rumore integrato. Audacity ha un filtro NR abbastanza efficace, ma è progettato per essere utilizzato con il funzionamento a 2 passaggi con un campione del solo rumore e quindi l'ingresso.

I commenti nella parte superiore di https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp spiegano come funziona. (fondamentalmente: sopprimere ogni bin FFT che è al di sotto della soglia. Quindi lascia passare i segnali solo quando sono più forti del rumore di fondo in quella banda di frequenza. Può fare cose sorprendenti senza causare problemi. È come un filtro passa-banda che si adatta al segnale. Poiché l'energia del rumore si diffonde su tutto lo spettro, lasciar passare solo poche bande strette ridurrà MOLTO l'energia totale del rumore.

Vedi anche Riduzione del rumore audio: come si confronta l'audacia con altre opzioni? per maggiori dettagli su come funziona e che i cassonetti FFT con soglia in un modo o nell'altro sono anche la base dei tipici filtri commerciali per la riduzione del rumore.

Portare quel filtro su ffmpeg sarebbe un po 'imbarazzante. Forse implementarlo come filtro con 2 ingressi, invece di un filtro a 2 passaggi, funzionerebbe meglio. Dato che sono necessari solo pochi secondi per ottenere un profilo di rumore, non è come se fosse necessario leggere l'intero file. E NON DOVREBBE fornirgli l'intero flusso audio come campione di rumore, comunque. Deve vedere un campione di rumore JUST per impostare le soglie per ciascun cestino FFT.

Quindi sì, un secondo input, piuttosto che 2pass, avrebbe senso. Ma questo lo rende molto meno facile da usare rispetto alla maggior parte dei filtri ffmpeg. Avresti bisogno di un sacco di voodoo con stream split / time-range extract. E ovviamente hai bisogno di un intervento manuale, a meno che tu non abbia un campione di rumore in un file separato che sarà appropriato per più file di input. (un campione di rumore dallo stesso microfono / impostazione dovrebbe andare bene per tutte le clip di quella configurazione.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.