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ć.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
FFmpeg ma teraz 2 natywne filtry do obsługi tła szumu:
afftdn
anlmdn
Od pewnego czasu można także używać filtrów FFmpeg (poszukiwanie tłumika
ladspa
szumów) i / lublv2
(poszukiwanie tłumika mowy).źródło
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).
źródło