Zmniejsz szum tła i zoptymalizuj mowę z klipu audio za pomocą ffmpeg

30

Wyciągam klipy audio z pliku wideo w celu rozpoznania mowy. Te filmy pochodzą z urządzeń mobilnych / innych ręcznie robionych i dlatego zawierają dużo hałasu. Chcę zredukować szum tła w dźwięku, aby mowa przekazywana do mojego silnika rozpoznawania mowy była wyraźna. Używam ffmpeg do robienia tych wszystkich rzeczy, ale utknąłem w fazie redukcji szumów.

Do tej pory wypróbowałem następujące filtry:

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

Ale wyniki są bardzo rozczarowujące. Moje rozumowanie było takie, że ponieważ mowa mieści się w zakresie 300-3000 Hz, mogę odfiltrować wszystkie inne częstotliwości, aby stłumić wszelkie szumy tła. czego mi brakuje?

Przeczytałem również o filtrach Weiner, które można wykorzystać do ulepszeń mowy, i znalazłem to, ale nie jestem pewien, jak z niego korzystać.

Sudh
źródło

Odpowiedzi:

36

Jeśli chcesz odizolować mowę słyszalną, spróbuj połączyć filtr dolnoprzepustowy z filtrem górnoprzepustowym. Jeśli chodzi o użyteczny dźwięk, zauważyłem, że odfiltrowanie 200 Hz i poniżej, a następnie odfiltrowanie 3000 Hz i więcej robi całkiem dobrą robotę, utrzymując użyteczny dźwięk głosu.

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

W tym przykładzie najpierw dodaj filtr górnoprzepustowy, aby odciąć niższe częstotliwości, a następnie zastosuj filtr dolnoprzepustowy, aby odciąć wyższe częstotliwości. W razie potrzeby możesz uruchomić ten plik więcej niż jeden raz, aby wyczyścić wyższe częstotliwości db w obrębie zakresów częstotliwości cięcia.

av8r
źródło
Przykro mi, ale wydaje mi się, że nie powoduje to zauważalnej redukcji hałasu.
Angad
Działa to bardzo dobrze w celu zmniejszenia niskiego poziomu szumu tła (wentylatory, brzęczenie itp.), Ale może nieco pogorszyć jakość dźwięku, choć można to nieco złagodzić, stosując później inne filtry.
Iain Collins
3
W moim przypadku oryginalny dźwięk był tak zły, że prawie nie było słychać głosu z powodu szumu wody w tle. Użyłem następujących. To nie jest świetna jakość, ale 1000 razy lepsza niż oryginał. -af "highpass=f=200, lowpass=f=1000"
Eric
Dostaję błąd z powyższym, a raczej ostrzeżenie z ffmpeg: [Parsed_highpass_0 @ 0x1524780] obcinam 52 razy. Zmniejsz zysk.
shevy
6
Możesz wyświetlić podgląd swojego filtra za pomocąffplay <input file> -af lowpass=3000,highpass=200
Björn
11

FFmpeg ma teraz 2 natywne filtry do obsługi tła szumu:

Od pewnego czasu można także używać filtrów FFmpeg (poszukiwanie tłumika ladspaszumów) i / lub lv2(poszukiwanie tłumika mowy).

Paul B. Mahol
źródło
9

ffmpeg nie ma wbudowanych żadnych przyzwoitych filtrów audio do redukcji szumów. Audacity ma dość skuteczny filtr NR, ale został zaprojektowany do pracy z 2 przebiegami z próbką samego szumu, a następnie wejścia.

Komentarze na górze https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp wyjaśniają, jak to działa. (w zasadzie: pomijaj każdy przedział FFT, który jest poniżej progu. Dzięki temu przepuszcza sygnały tylko wtedy, gdy są głośniejsze niż poziom szumu w tym paśmie częstotliwości. Może robić niesamowite rzeczy bez powodowania problemów. To jest jak filtr pasmowo-przepustowy, który dostosowuje się do sygnału. Ponieważ energia hałasu jest rozproszona w całym spektrum, przepuszczenie tylko kilku wąskich pasm zmniejszy DUŻO całkowitą energię hałasu.

Zobacz także Redukcja szumów audio: jak audacity ma się do innych opcji? aby uzyskać więcej informacji na temat tego, jak to działa, i że próg pojemników FFT w taki czy inny sposób jest również podstawą typowych komercyjnych filtrów redukujących hałas.

Przeniesienie tego filtra do ffmpeg byłoby nieco niewygodne. Być może najlepiej byłoby zaimplementować go jako filtr z 2 wejściami zamiast filtra 2-przepustowego. Ponieważ potrzebuje tylko kilku sekund, aby uzyskać profil hałasu, nie jest tak, że musi czytać cały plik. W każdym razie NIE POWINIENEŚ podawać całego strumienia audio jako próbki szumu. Musi zobaczyć próbkę szumu JUST, aby ustawić progi dla każdego pojemnika FFT.

Więc tak, drugie wejście zamiast 2-pasmowe miałoby sens. Ale to sprawia, że ​​jest o wiele łatwiejszy w użyciu niż większość filtrów ffmpeg. Będziesz potrzebować kilku voodoo z ekstraktem z podziału strumienia / zakresu czasu. I oczywiście potrzebujesz ręcznej interwencji, chyba że masz próbkę szumu w osobnym pliku, który będzie odpowiedni dla wielu plików wejściowych. (jedna próbka szumu z tego samego mikrofonu / konfiguracji powinna być odpowiednia dla wszystkich klipów z tej konfiguracji).

Peter Cordes
źródło