Представьте себе ситуацию: вы работаете на удаленке и должны принять участие в важной видеоконференции, а в этот момент домашняя кошка решила устроить спортивный забег, снося все на своем пути. В соседней комнате заплакал ребенок, а сосед именно в этот момент решил просверлить несколько отверстий под новую полочку. Могло бы случиться непоправимое, но во избежание катастрофы мы придумали своё решение, которое не даст вашим собеседникам заметить что‑то подозрительное.
Меня зовут Артем Соколов. Я и мои коллеги занимаемся направлением улучшения звука в команде SaluteSpeech. Мы в SberDevices разрабатываем и развиваем целую линейку В2В‑решений — от речевых сервисов до видеоконференцсвязи. И во всех наших продуктах стремимся использовать собственные технологии.
Один из флагманских продуктов, который мы создаём, — сервис для видеоконференций SaluteJazz. В первую очередь он ориентирован на бизнес‑коммуникации, которые предполагают высокое качество звука без посторонних шумов.
С учетом гибридного режима работы во многих компаниях, да и в целом достаточного динамичного современного образа жизни, не всегда получается созваниваться с коллегами или партнерами из абсолютного тихого помещения, в связи с чем может произойти ситуация, аналогичная той, которую я описал в начале статьи. Для этого в SaluteJazz предусмотрен «шумодав», убирающий все посторонние звуки.
Первое решение для шумоподавления в SaluteJazz было от сторонней компании. И, как легко можно догадаться, оно не предполагало наличия модели на устройстве. Как было сказано выше, для нас важно использовать решения, созданные собственными руками, поэтому за достаточно короткий срок мы подготовили и встроили собственный «шумодав» (он же денойзер). Про него и пойдет речь в этой статье.
Введение
Сама задача подавления шумов проста и понятна. Нужно уметь максимально эффективно убирать весь аддитивный шум вроде машин на улице, посторонних разговоров в кофейне или ресторане, громких игр детей или животных, перфоратора соседа сверху и прочих. При этом важно не повредить или минимально (неуловимо для человеческого слуха) повредить речь говорящего.
Цифровой сигнал — это числа, характеризующие амплитуду колебаний мембраны в микрофоне. Если их нарисовать, то получаются осциллограммы, похожие на эту.
Еще такие изображения называют изображением сигнала во временном домене, так как они показывают колебания в зависимости от времени.
Для временных доменов задачу удаления шумов математически формулируют так:
— звук на выходе из динамика представляется как сумма — нашего целевого сигнала и — шума. Шум не просто так называется аддитивным. Его накладывание на полезный сигнал происходит простым суммированием. Задачу удаления ревербераций мы не учитываем.
Как показывает практика, можно добиться лучшего качества, если перейти от временного домена к частотному. Иначе говоря, выполнить преобразование Фурье, чтобы работать со спектром частот, присутствующих в аудио — спектрограммами.
Тогда первая формула трансформируется в следующую:
При этом переход в частотный домен — палка о двух концах. У нас появляется шанс построить более эффективное решение с точки зрения качества конечного аудио, но при этом появляется задача по быстрому вычислению прямого и обратного преобразования Фурье. Обратное преобразование необходимо, чтобы опять получить аудио.
Поиск базового решения с результатами сравнений
На момент выбора подходящей архитектуры для будущего онлайн‑денойзера, мы рассматривали некоторое количество решений из найденных в открытом доступе. Нас интересовали модели которые бы:
Удаляли шум, но не искажали и не портили речь говорящего;
Могли работать в режиме realtime либо сразу, либо с небольшой доработкой;
В перспективе могли бы быть встроенным на мобильные платформы и в Web.
Real‑time модели способны работать с потоком порциями 10 — 40 мс и выдавать результат с маленькой задержкой, а их качество не зависит от информации о будущем. В противном случае, нам бы пришлось копить значительные куски аудио (сотни миллисекунд), их очищать и выдавать в поток. Любой пользователь по другую сторону конференции это сразу бы почувствовал. Такие модели более сложны, так как они имеют ограничения на слои, которые вы можете использовать (например Bi‑LSTM сразу нет, свертки только causal, любые Attention слои должны сопровождаться масками для softmax) и заранее проигрывают по качеству обычным моделям.
Технически для real‑time модели критерии звучат как:
Lookahead (количество последующего аудио для текущего кусочка, который мы очищаем) не больше 32мс;
Real‑Time Factor (RTF — отношение количества затраченного времени на обработку на количество обрабатываемого времени) < 1.0 (а лучше сильно меньше) на CPU не самого современного ноутбука;
Footprint (размер модели) до 30Мб.
Rnnoise
В мире тех, кто занимается шумоподавлением, этот движок хорошо известен. Это простая и быстрая нейросеть. Практически ни один обзор без нее не обходится, поэтому достоинства и недостатки Rnnoise нам были хорошо известны. Но все же мы решили сами оценить, как она работает. В итоге можем сказать, что Rnnoise работает быстро и может обрабатывать звук 48kHz. Кроме этого, других существенных достоинств мы не заметили. И хотя в последнее время вышло несколько статей с улучшением этого движка, общий уровень очистки остается достаточно скромным:
— Шум подавляется только в паузах между словами.
— Сторонние звуки на фоне речи придавливаются немного, но слышны.
+ Голос говорящего практически не повреждается.
+ Не требуется предобработки аудио. Всё происходит внутри шумодава.
Это решение мы не стали рассматривать всерьёз.
DEMUCS от Facebook**
— Очень большой размер модели, что создает серьезные проблемы для создания мобильной и веб‑версий. Огромный чекпоинт этой модели нас озадачил, но не отпугнул — мы хотели посмотреть какое качество она дает. Даже нашли статью, как потом ужать эту модель, если ее эффективность нас устроит. Правда, работа по своему объему выглядела очень трудозатратной.
-
+ Работает шумодав во временном домене, прямое и обратное преобразование Фурье не требуется. Всё должны были решить эксперименты с зашумленными аудио. Проверяли модель в режиме realtime, благо она поддерживает этот режим из коробки. Наши эксперименты показали, что:
+ Уровень подавления шума очень хороший;
— Модель также нередко портила речь.
Проанализиорвали мы и последующие улучшенные версии данного решения шумоподавления. Мы взвесили все за и против и решили не строить свое решение на основе этой модели. Все‑таки проблемы довольно серьезные, а хотелось связаться с чем‑то более готовым в перспективе быть встроенным на мобильные платформы и Web.
Были и другие решения, преимущественно имеющие архитектуру автоэнкодера, которые публиковали коллеги из других русскоязычных компаний. Но их мы тоже отмели по разным причинам. Например, сложная переделка архитектуры для работы в режиме realtime, слабые результаты на PaperWithCode в соотношении с прочими решениям и т. д. Чтобы сэкономить время, не станем приводить здесь полный список вариантов, которые мы перебирали.
FullSubNet
Это решение не очень популярное, и мы на него не сильно рассчитывали, но при детальном рассмотрении оно нам понравилось за счет своих неплохих результатов при очистке и архитектурной готовности работать в realtime режиме. Как упоминалось выше, U‑net архитектуры в статьях встречаются чаще, а FullSubNet использовал совершенно иной подход. Уже на момент написания этой статьи было как минимум два исследования по улучшению производительности FullSubNet, так что популярность его все таки росла и, возможно, продолжит это делать.
— Решение работает в frequency domain, то есть необходимо выполнять прямое и обратное преобразование Фурье. Зато, на практике, получается достичь лучшего качества очистки звука.
— На момент нашей работы с моделью было слышно, что она не идеально задавливала шум. Безусловно, лучше Rnnoise, но Demucs* уступала.
+ Но FullSubNet не вносил деформации в голос, как то же решение от Facebook**.
+ Не большой размер (14Мб).
Доработка FullSubNet
Мы взяли изначальную архитектуру нейросети FullSubNet и решили ее доработать. При этом код требовал некоторой модификации, чтобы выполнять инференс в realtime‑режиме. FullSubNet состоит из двух больших блоков LSTM — Fullband и Subband, у каждого из которых есть свой физический смысл.
Fullband‑модель отвечает за поиск полезной информации внутри всего range частот и ищет зависимости с длинным контекстом.
Subband‑модель сконцентрирована на более локальных зависимостях, в основном между соседними частотами. Достигается это путем применения операции unfold. Выглядит, как будто размазываем 2D слой, беря каждое F измерение и N её соседей в прошлом и в будущем.
Соединение этих двух моделей в одну комбинирует эффект от преимуществ каждой из них в отдельности. В результате решение показывает очень хороший результат.
FullSubNet хоть и легче, чем DEMUCS**, но все равно сетка тяжелая, в первую очередь из‑за SubBand‑части и операции unfold. Для аудио 16кГц ее RTF составлял около 0.6 только инференс‑модели, не считая операций прямого и обратного преобразования Фурье. Но адаптированная для 24кГц, она уже в лучшем случае давала 0.9, а чекпоинт занимал около 50Мб.
Перед нами встал вопрос изменения архитектуры сети, при этом хотелось максимально оставить идею самого решения. Начался процесс переработки подсети поиска локальных зависимостей. Мы создали его полностью из блоков, в основе которых лежали 1d‑свертки и parametric relu функции активации. Temporal Convolution Network не стали применять из‑за сложности работы с ними во время выравнивания режимов тренировки и инференса. Пришлось бы либо таскать огромные хвосты контекста, либо выполнять трудозатратную работу по их уменьшению. В нашей задумке свертки за счет своих фильтров в некотором смысле повторяют идею применения операции unfold. При этом сеть станет легче, тренироваться она сможет с гораздо бОльшим размером матча и упростится инференс. Мы оставили блок LSTM для Fullband части, чтобы она отвечала за работу с длинными историческими контекстами. Для тренировки использовали комбинацию в виде MSE и SI‑SDR лосов. Нужно отметить, что в правильной пропорции SI‑SDR дает очень приличный прирост качества модели.
В такой архитектуре модель осталась способна работать online, то есть обрабатывать входящий поток по небольшим 32мс чанкам со сдвигом 16мс. Мы подготовили две модели: одна для нативных приложений под MacOS, Linux, Windows и вторая для Web. Первая модель используется в fp16, это дает нам лучшее качество при размере 20Мб. Для Web мы изменили немного архитектуру, чтобы улучшить качество квантования, и при изначальном размере в fp32 в 24Мб квантованая модель у нас получилась 6.7Мб. Она очень качественно задавливает не только слабые шумы нажатия клавиш клавиатуры, но и более сильные, например, когда вы сидите на кухне, и кто‑то в это время моет посуду.
Тестовый набор данных и процедура сравнения
Найденные нами модели, также как и созданные, необходимо подвести под общий знаменатель, начать сравнивать между собой. Мы считаем, что для задачи удаления шумов язык говорящего имеет второстепенное значение (если вообще влияет). В связи с чем было принято решение собрать на русском языке свой тестовый датасет для замера качества моделей, чтобы потом было проще проверять. При этом мы понимаем, что большинство (если не все) моделей в открытом доступе будут предобучены с использованием англоязычных наборов данных.
Частично были привлечены записи из наших датасетов Golos и Dusha, которые мы смешали с шумами из открытых датасетов с различным соотношением сигнала и шума (Signal‑to‑Noise Ratio или SNR). Также изучили практики использования метрик, по которым можно оценивать и сравнивать качество моделей шумоподавления, и отобрали несколько позволяющих делать это более разносторонне. В своих экспериментах мы ориентируемся на PESQ, STOI и SI‑SDR. Чтобы не перегружать текст, не будем здесь подробно рассказывать, как их интерпретировать. Оценивание решений по метрикам — это промежуточный этап. Важным моментом было предоставить результаты удаления шумов на суд общественному мнению, которое бы и стало для нас признаком качества нашего решения. Такой опрос мы могли бы проводить в виде side‑by‑side сравнения через Яндекс Толоку. Здесь как раз играет большую роль, что записи на русском языке, и люди могут лучше оценить наличие искажений в речи. Самым главным для нас было и остается понимание того, как люди воспринимают качество очистки звука, и всегда ли это качество для них стоит на первом месте.
Подготовили тестовый набор данных в нескольких вариантах частоты дискретизации и стали проверять найденные решения, чтобы как‑то их сравнить.
Сравнение
Мы думали, как представить результаты нашей модели в сравнении с другими решениями. Понятно, что любое открытое решение предобучено на других наборах данных. Смещение будет присутствовать всегда. Мы поставили амбициозную задачу — сравнить наше решение с инструментом высокого уровня по очистке звука — Krisp. Так как это коммерческое решение для бизнеса, его можно с чистой совестью применять для любого языка.
Для честной оценки его было бы интересно проверить и на английском, и на русском языках.
Работает оно так: при установке создается виртуальный микрофон Krisp. В настройках Zoom, Google Meet или SaluteJazz нужно выбрать этот микрофон как канал, откуда читать звуковой сигнал. Далее в самом Krisp указывается реальный микрофон. Денойзер получает оригинальный сигнал с микрофона, чистит его и передает в свой виртуальный микрофон, откуда читается ВКС.
Чтобы пропустить наш набор данных через Krisp, был установлен BlackHole, который создает на системе свои виртуальные каналы из которых можно читать, и в которые можно писать по аналогии с Krisp.
Далее мы настроили Krisp так, чтобы он отправлял данные в канал BlackHole, и написали скрипт, который бы записывал аудио в канал микрофона денойзера и считывал из того же BlackHole. Таким образом выстроился следующий пайплайн noisy audio->python->Krisp microphone->Krisp->BlackHole->python->enhanced audio
.
import sounddevice as sd
import soundfile as sf
import librosa
import numpy as np
import os
in_directory = 'path_to_noised_files'
out_directory = 'path_for_enhanced_audio'
for filename in os.listdir(in_directory):
if filename.endswith(".wav"):
data, fs = librosa.load(os.path.join(in_directory, filename), sr=48000, dtype='float32')
sd.default.samplerate = fs
sd.default.channels = 1
sd.default.dtype = 'float32'
myrecording = sd.playrec(data, device=(4,1), blocking=True) #4 - krisp mic, 1 - BlackHole
sf.write(os.path.join(out_directory, filename), myrecording, fs)
C помощью Python‑скрипта мы подали аудио датасета на входной виртуальный канал и получили очищенный звук на выходном виртуальном канале. Для очистки использовалась trial‑версия Krisp для MacOs, где согласно информации Performant Real Time Audio ML in the Browser модель может занимать 48Мб или 5.6Мб. Решение работает с частотой 32кГц, то есть предполагается автоматический ресемплинг в случае более высокой частоты аудио.
В приложении используются обе модели в зависимости от желаемого уровня очистки/загрузки процессора и платформы, в вебе легкая модель. Про мобильную версию Krisp нам ничего не известно, но логично предположить, что там тоже используется легкая модель. Наше решение состоит из трёх моделей в зависимости от платформы: 20Мб, 10Мб и 6.7Мб. Основная частота 24кГц, частоты выше поддерживаются с помощью ресемплинга. Качество между 24кГц и 32кГц едва различимо для обычного пользователя ВКС, но, справедливости ради, оно есть.
Таким образом, линейку решений для очистки звука можно сопоставить следующим образом:
Десктоп, Мб |
Мобильная, Мб |
Веб, Mb |
|
Krisp 32кГц модель |
48/5.6 |
5.6 |
5.6 |
Jazz 24кГц модель |
20/10 |
10 |
6.7 |
Наши тестовые данные покрывают случаи:
Записи с шумом малой и средней величины (signal‑to‑noise ratio (SNR) в диапазоне от 20 до 5дб);
Записи с шумом большой величины, SNR диапазон 4 до -15;
Записи с шумом на фоне ревербераций (повторений звука, отраженного от стен в комнатах, когда вы используете ноутбук в конференц‑комнате);
Записи на английском языке из тестового набора данных DNS с шумом малой и средней величины.
Мы прогнали описанным выше способом наши 4 тестовых набора через обе модели Krisp.
Собранные данные разместили на краудсорсинговой платформе Yandex Toloka в виде SBS‑опроса (Side‑by‑side). Люди голосовали по каждой записи, определяя, какая им больше нравится. Мы попарно сравнили результаты очистки нашей большой модели с их большой моделью, нашей маленькой модели с их маленькой моделью. Наше решение для мобильных телефонов сопоставили с обеими моделями Krisp.
Результаты сопоставления показаны на диаграмме: пример сравнения результатов очистки двух больших моделей на наборе данных с малым и средним уровнем шума. Сиреневым и оранжевым отмечены доля пар записей, для которых слушатели отдали своё предпочтение нашему решению и Krisp, соответсвенно. Зеленым отмечен процент аудио, где приоритет не был отдан ни одной из моделей. Здесь видно, что подавляющее большинство респондентов отдают предпочтение очищенным аудио.
Результаты мы свели в таблицу, сохранив цветовую схему SBS чтобы было проще понять результаты.
Результаты однозначно показывают, что в подавляющем большинстве случаев наше решение справляется лучше с обычным шумом малой и средней величины. Даже на английском наборе данных. Если уровень шума повышается, то и Krisp, и «шумодав» SaluteJazz показывают примерно одинаковый результат с небольшим преимуществом нашего решения. Но, к сожалению, наш «шумодав» хуже справляемся с реверберацией. Записи показывают, что денойзер Jazz будет убирать шум, но само звучание конференц‑комнаты останется нетронутым, в то время как Krisp улучшит этот звук. Самое интересное, что у Krisp в условиях реверберации маленькая модель показывает себя лучше.
В целом, мы очень мы очень довольны результатом сравнения.
Заключение
Наше решение с разными вариантами моделей работает On‑device на клиентах SaluteJazz на Android, Web и нативных приложениях под Windows, MacOS и Linux. Мы очень трепетно относимся к качеству и много исследовали, прежде чем предоставить для общего использования наш «шумодав» в продукте SaluteJazz. Сравнение с Krisp придает уверенности, так как на фоне продукта с большой известностью в мире и подтвержденным качеством решения, именно в направлении удаления шума мы смотримся очень достойно. Нам необходимо научиться лучше работать с реверберациями, и мы работаем в этом направлении.
На текущий момент ваша видеоконференция оснащена качественным шумодавом, а это значит, что собеседник по ту сторону экрана услышит только транслируемую вами информацию — детский плач и перфоратор останутся за кадром.
Свежие релизы SaluteJazz включают уже по паре наших моделей для лёгкого, энергоэкономичного, а также для активного, но чуть более требовательного к ресурсам шумоподавления. В меню настроек вы сами можете выбрать наиболее подходящий вам режим (но мы всячески рекомендуем активировать сильное шумоподавление, если ваше оборудование позволяет это сделать). В зависимости от платформы, там представлены различные варианты наших моделей, создание которых мы описали здесь.
SaluteJazz доступен для всех пользователей, поэтому протестировать наш денойзер и сервис в целом может любой желающий.
Жду вашу обратную связь в комментариях. Задавайте вопросы, делитесь своим мнением о нашем решении и опытом использования.
Meta Platforms*, а также принадлежащие ей Facebook** и Instagram**:
* признана экстремистской организацией, её деятельность в России запрещена
** запрещены в России
Комментарии (12)
iDoka
08.10.2024 15:20+1Какое решение рекомендуете для headless on-device, когда денойзер нужен, а СберДжаз - нет:
RNNnoise
DEMUCS
FullSubNet
-
доработанный FullSubNet
?
artsokol Автор
08.10.2024 15:20какой sample rate?
iDoka
08.10.2024 15:20Любой. Хоть 16кГц. Сконвертировать в нужный налету нет проблем.
artsokol Автор
08.10.2024 15:20Входных данных маловато. Предположим, вам нужен, realtime денойзер. Инференс на cpu/gpu? предположим, что cpu.
Сразу оговорюсь, лучше не работать с моделью 16кГц, иначе будет заметное падение качества, даже после обратного апсемплинга. Если с данными нет проблемы, то конечно, стоит начать с какой-то из версий семейства fullsubnet (но не ванильной). Это будет хороший компромисс по качеству/скорости. Можно еще попробовать рассмотреть другие решения, не из этого списка, например DeepFilterNet.
propell-ant
08.10.2024 15:20+2Подумайте о том, как пользователю показать, насколько шумодав справляется.
Тут в конце лета в одном корпоративном Универе слушал вебинар. Так лектор был полностью уверен, что у него самый передовой шумодав. Но шумодав работал только в паузах, а внутри фраз вся аудитория слышала звон посуды в мойке на заднем плане и детские голоса.
Минут через сорок ему сказали, что шумодав не вывозит.
Как пользователь вашего решения будет понимать, что слушателям шум не мешает и речь при этом не пострадала? Он один раз может спросить у пользователей, но шум ведь штука динамичная...artsokol Автор
08.10.2024 15:20+1Да, спасибо. это была бы интересная функциональность. Возможно, анализируя степень очистки (а мы это умеем), мы бы могли попробовать что-то на этом надстроить и в виде подсказки выводить пользователю. Задумаемся. Спасибо за идею)
LbICbIY
08.10.2024 15:20Будет ли какой-то доступ к самому денойзеру? Периодически делаю запись текстов и прогоняю их через инструмент от адоб, но интересно попробовать ваш вариант
peoplesattacked
обычно в таких случаях ставят/включают
видеозамену фона