Зменшення фонового шуму та оптимізація мови з аудіокліпу за допомогою ffmpeg


31

Я витягую аудіокліпи з відеофайлу для розпізнавання мовлення. Ці відео походять з мобільних / інших пристроїв ручної роботи, а отже, містять багато шуму. Я хочу зменшити фоновий шум аудіо, щоб мова, яку я передаю моєму механізму розпізнавання мовлення, була зрозумілою. Я використовую ffmpeg, щоб зробити всі ці речі, але я застряг на фазі зменшення шуму.

Дотепер я спробував такі фільтри:

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

Але результати дуже невтішні. Мої міркування полягали в тому, що оскільки мова йде в діапазоні 300-3000 Гц, я можу відфільтрувати всі інші частоти, щоб придушити будь-який фоновий шум. Що я пропускаю?

Крім того, я читав про фільтри weiner, які можна використовувати для покращення мови, і знайшов це, але не знаю, як ним користуватися.

Відповіді:


38

Якщо ви хочете ізолювати звукову мову, спробуйте поєднати фільтр низької частоти з фільтром високої частоти. Що стосується корисного аудіо, я помітив, що відфільтровування 200 Гц і нижче, а потім фільтрують 3000 ГГц і вище, робить досить непогану роботу з збереження корисного звукового сигналу.

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

У цьому прикладі додайте фільтр високих частот спочатку для вирізання нижчих частот, а потім використовуйте фільтр низьких частот, щоб вирізати більш високі частоти. Якщо потрібно, ви можете запускати свій файл через це не один раз, щоб очистити більш високі частоти db в межах скорочення діапазону частот.


Вибачте, але, здається, це не робить для мене помітного зниження шуму.
Angad

Це дуже добре, щоб зменшити низький рівень фонового шуму (вентилятори, гудіння тощо), але може трохи пошкодити якість звуку, хоча це може бути дещо пом'якшене, застосувавши інші фільтри згодом.
Ієн Коллінз

3
У моєму випадку оригінальний звук був настільки поганим, що голос було майже неможливо почути через деякий звук падіння води на задньому плані. Я використав наступне. Це не чудова якість, але в 1000 разів краще за оригінал. -af "highpass=f=200, lowpass=f=1000"
Ерік

Я отримую деяку помилку із вищезазначеним, а точніше, попередженням від ffmpeg: [Parsed_highpass_0 @ 0x1524780] відсікання 52 рази. Будь ласка, зменшіть прибуток.
shevy

6
Ви можете переглянути попередній фільтр зffplay <input file> -af lowpass=3000,highpass=200
Björn

13

У FFmpeg зараз є два нативних фільтри для вирішення проблем із шумом:

Крім того, з деякого часу можна використовувати ladspa(шукати шумоподавляючий) та / або lv2(шукати посилання для мовлення) фільтри з FFmpeg.


9

ffmpeg не має вбудованих пристойних аудіо фільтрів для зменшення шуму. Audacity має досить ефективний NR фільтр, але він призначений для використання в 2-х прохідній роботі з зразком просто шуму, а потім на вході.

Коментарі вгорі https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp пояснюють, як це працює. (в основному: придушуйте кожен фургон FFT, який знаходиться нижче порогового значення. Таким чином, він пропускає сигнали лише тоді, коли вони гучніші за рівень шуму в цій смузі частот. Це може робити дивовижні речі, не викликаючи проблем. Це як фільтр пропускної здатності, який адаптується Оскільки енергія шуму поширюється на весь спектр, лише пропускання через кілька вузьких його смуг зменшить загальну енергію шуму ЛОТ.

Див. Також Зменшення шуму аудіо: як зухвалість порівнюється з іншими параметрами? для отримання більш детальної інформації про те, як це працює, а також, що порогові відростки FFT так чи інакше є основою типових комерційних фільтрів для зменшення шуму.

Перенести цей фільтр на ffmpeg було б трохи незручно. Можливо, реалізувати його як фільтр з двома входами замість 2-прохідного фільтра було б найкраще. Оскільки для отримання профілю шуму потрібно лише кілька секунд, це не так, як він повинен читати весь файл. І ви, в будь-якому випадку, НЕ БУДЕТЕ подавати йому весь аудіопотік як зразок шуму. Потрібно побачити зразок ДУСТОГО шуму, щоб встановити пороги для кожного FFT відро.

Так що, другий вхід, а не 2-прохідний, мав би сенс. Але це робить його набагато менш простим у використанні, ніж більшість фільтрів ffmpeg. Вам знадобиться купа вуду з екстрактом потоку / часовим діапазоном. І, звичайно, вам потрібно вручну втручання, якщо ви не маєте зразка шуму в окремому файлі, який підходить для декількох вхідних файлів. (один зразок шуму з одного мікрофона / налаштування повинен бути добре для всіх кліпів із цього налаштування.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.