Pull to refresh

Автоматическое подавление звуковых шумов в аудиозаписи

Reading time2 min
Views15K
Однажды, при разработке одного проекта, я наткнулся на интересную задачку.
Исходные условия:
— устройство, которое посредством ffmpeg через веб-камеру записывало видео со звуковой дорожкой
— длинна записи около минуты
— создать условия, при которых 1 раз настроить шумодав, чтоб далее он работал автономно

Ну и естественно с этого момента начался мозговой штурм.

Для начала решил понять что такое шум и каким он бывает.
«Шум — совокупность апериодических звуков различной интенсивности и частоты» Wiki
Шумы, как минимум, бывают постоянными (потрескивания, гудения), и непостоянными (автомобиль, падение, музыка, удары).
С первым типом все оказалось намного проще, многие программы и алгоритмы как раз специализируются на периодичные и постоянные шумы, потому что стоит всего лишь получить маску шума (к примеру в начале записи), и по этой маске очистить все остальное. Но у меня был именно хаотический шум, так что перейдем дальше.
В моем случае шум был хаотичным, и никакой общей периодичной маски не имел, и иметь не мог. После кучи времени убитого на гугления, и чтения форумов аудифилов, я нашел 3 решения:
— Спектральное вычитание шумов
— Активное шумоподавление
— Ограничения частот, используемых человеческим голосом

Спектральное вычитание
Шум на реальном сигнале (записи) имеет несколько особенностей:
— апериодический
— имеет конечный спектр
Если для периодичного шума достаточно одной маски чтобы затереть весь шум, то в данном случае дорожка разбивается на множество отрезков, и каждый из них рассматривается как самостоятельный сигнал, и маска шума для него рассматривается индивидуально. Таким образом мы получаем ряд масок, с которыми можно работать. Идея схожа со схемой дискретного преобразования Фурье. Идею можно было бы развить, но ни одного программного продукта, работающего по такой схеме я не нашел. Поэтому данный пункт был пропущен.

Активное шумоподавление
Суть активного шумоподавления состоит в том, чтобы получать синхронный сигнал, содержащий только шум (без вокала, голоса и прочего интересующего нас звука). Далее этот «чистошумный» сигнал инвертируется в так называемую противофазу, и накладывается на шумную запись. В итоге Шум и АнтиШум подавляют друг друга, и на выходе оказывается чистая запись. Казалось бы — что проще? Но в моих условиях, не представлялось возможным иметь второй микрофон, чтобы он записывал фоновый шум, без интересующего меня наполнения. И этот пункт ушел в небытие.


Ограничения частот, используемых человеческим голосом
Опять таки, перелопатив тонны информации, за диапазон человеческого голоса был принят отрезок от 300 Гц до 3000 Гц.
Данный пункт оказался более реальным в исполнении, хоть и не гарантировал отличного результата.
Проверку решения провел через Nero Wave Editor, ограничив частоты. Фоновый шум, конечно, не исчез, но он потерял в весе, и стал монотонным и приглушенным, в то время как человеческий голос остался неизменным, и слышался уже намного лучше.

Таким образом, для себя я выбрал последний пункт. Пусть результат не идеален, но это простейший способ автономного шумоподавления, не требующий практически никаких личных затрат. Единственный нюанс оказался в том, что запись в целом становилась чуть тише, что совершенно не страшно.

P.S. Все рассуждения отталкивались именно от требований автономности к шумодаву. Естественно, если обрабатывать файлы вручную — возможностей в разы больше.

Ссылки:
Исследование проблемы подавления звуковых шумов во время видео-трансляций.
Tags:
Hubs:
Total votes 14: ↑9 and ↓5+4
Comments7

Articles