Я извлекаю аудиоклипы из видеофайла для распознавания речи. Эти видео приходят с мобильных / других устройств ручной работы и, следовательно, содержат много шума. Я хочу уменьшить фоновый шум аудио, чтобы речь, которую я передаю в мой механизм распознавания речи, была четкой. Я использую 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, которые можно использовать для улучшения речи, и нашел этот но я не уверен, как его использовать.
-af "highpass=f=200, lowpass=f=1000"
ffplay <input file> -af lowpass=3000,highpass=200
ffmpeg не имеет встроенных звуковых фильтров для подавления шума. Audacity имеет довольно эффективный фильтр NR, но он предназначен для использования с двухпроходной операцией с выборкой только шума, а затем входа.
Комментарии вверху https://github.com/audacity/audacity/blob/master/src/effects/NoiseReduction.cpp объясните, как это работает. (в основном: подавление каждого бина FFT, который находится ниже порогового значения. Таким образом, он пропускает сигналы только тогда, когда они превышают минимальный уровень шума в этом диапазоне частот. Он может делать удивительные вещи, не вызывая проблем. к сигналу. Так как энергия шума распространяется по всему спектру, только пропуск его через несколько узких полос уменьшит общую энергию шума на много.
Смотрите также Снижение уровня шума: как смелость сравнивается с другими вариантами? для получения более подробной информации о том, как это работает, и о том, что пороговые ячейки FFT так или иначе являются основой типичных коммерческих фильтров шумоподавления, также
Перенос этого фильтра на ffmpeg будет немного неловким. Возможно, лучше всего реализовать его в виде фильтра с 2 входами вместо 2-проходного фильтра. Поскольку для получения профиля шума требуется всего несколько секунд, это не значит, что ему нужно читать весь файл. И в любом случае вы НЕ ДОЛЖНЫ передавать весь аудиопоток в качестве образца шума. Он должен видеть образец шума JUST, чтобы установить пороги для каждого элемента FFT.
Так что да, 2-й вход, а не 2-проходный, имеет смысл. Но это делает его намного менее простым в использовании, чем большинство фильтров ffmpeg. Вам понадобится куча вуду с разделением потока / выдержкой времени. И, конечно, вам нужно вмешательство вручную, если только у вас нет образца шума в отдельном файле, который подходит для нескольких входных файлов. (один образец шума из того же микрофона / установки должен подойти для всех клипов из этой настройки.)
источник
FFmpeg теперь имеет 2 встроенных фильтра для борьбы с шумовым фоном: afftdn и anlmdn. Также с некоторых пор можно использовать фильтры ladspa (ищите шумоподавитель) и / или lv2 (ищите шумоподавитель) с FFmpeg.
источник