21

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

3 ответа3

26

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

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

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

6

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

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

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

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

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

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .