Уменьшите фоновый шум и оптимизируйте речь из аудиоклипа с помощью ffmpeg

20

Я извлекаю аудиоклипы из видеофайла для распознавания речи. Эти видео приходят с мобильных / других устройств ручной работы и, следовательно, содержат много шума. Я хочу уменьшить фоновый шум аудио, чтобы речь, которую я передаю в мой механизм распознавания речи, была четкой. Я использую 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, которые можно использовать для улучшения речи, и нашел этот но я не уверен, как его использовать.

Sudh
источник

Ответы:

25

Если вы хотите изолировать слышимую речь, попробуйте объединить фильтр нижних частот с фильтром верхних частот. Что касается полезного звука, я заметил, что фильтрация 200 Гц и ниже, а затем фильтрация 3000 Гц и выше делает довольно хорошую работу по сохранению пригодного к использованию голосового звука.

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

В этом примере сначала добавьте фильтр верхних частот, чтобы обрезать нижние частоты, затем используйте фильтр нижних частот, чтобы обрезать верхние частоты. При необходимости вы можете запустить этот файл более одного раза, чтобы очистить более высокие частоты дБ в пределах частотных диапазонов.

av8r
источник
Извините, но это, кажется, не делает заметного снижения шума для меня.
Angad
Это очень хорошо работает для снижения низкого уровня фонового шума (вентиляторы, жужжание и т. Д.), Но может слегка ухудшить качество звука, хотя это может быть несколько снижено путем применения других фильтров впоследствии.
Iain Collins
2
Для моего случая исходное аудио было настолько плохим, что почти невозможно было услышать голос из-за некоторого падения воды на заднем плане. Я использовал следующее. Это не очень хорошее качество, но в 1000 раз лучше оригинала. -af "highpass=f=200, lowpass=f=1000"
Eric
Я получаю некоторую ошибку с вышеупомянутым или, скорее, предупреждением от ffmpeg: [Parsed_highpass_0 @ 0x1524780] отсечение 52 раза. Пожалуйста, уменьшите усиление.
shevy
2
Вы можете просмотреть свой фильтр с помощью ffplay <input file> -af lowpass=3000,highpass=200
Björn
6

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

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

Смотрите также Снижение уровня шума: как смелость сравнивается с другими вариантами? для получения более подробной информации о том, как это работает, и о том, что пороговые ячейки FFT так или иначе являются основой типичных коммерческих фильтров шумоподавления, также

Перенос этого фильтра на ffmpeg будет немного неловким. Возможно, лучше всего реализовать его в виде фильтра с 2 входами вместо 2-проходного фильтра. Поскольку для получения профиля шума требуется всего несколько секунд, это не значит, что ему нужно читать весь файл. И в любом случае вы НЕ ДОЛЖНЫ передавать весь аудиопоток в качестве образца шума. Он должен видеть образец шума JUST, чтобы установить пороги для каждого элемента FFT.

Так что да, 2-й вход, а не 2-проходный, имеет смысл. Но это делает его намного менее простым в использовании, чем большинство фильтров ffmpeg. Вам понадобится куча вуду с разделением потока / выдержкой времени. И, конечно, вам нужно вмешательство вручную, если только у вас нет образца шума в отдельном файле, который подходит для нескольких входных файлов. (один образец шума из того же микрофона / установки должен подойти для всех клипов из этой настройки.)

Peter Cordes
источник
0

FFmpeg теперь имеет 2 встроенных фильтра для борьбы с шумовым фоном: afftdn и anlmdn. Также с некоторых пор можно использовать фильтры ladspa (ищите шумоподавитель) и / или lv2 (ищите шумоподавитель) с FFmpeg.

Paul B. Mahol
источник