Автоматическая регулировка усиления (AGC): как держать громкость голоса ровной

Автор: Николай СапуновОбновлено: август 202626 мин чтения
Содержание статьи +

Кратко

Автоматическая регулировка усиления, или AGC по-английски, – это часть голосовой системы, которая делает речь каждого участника примерно одинаковой громкости, независимо от расстояния до микрофона и настроек оборудования. Принцип её работы прост: система измеряет текущую громкость голоса, сравнивает её с целевым уровнем и плавно применяет усиление – множитель, увеличивающий или уменьшающий сигнал. Управлять этим процессом можно в двух местах: аналоговое усиление на самом микрофоне, которое система запрашивает у операционной системы, и цифровое усиление, применяемое к уже записанным отсчётам в программе. Современный модуль WebRTC, AGC2, использует цифровой путь и покадровый детектор речи, чтобы не усиливать тишину и фоновый шум. В этой статье оба механизма объясняются простым языком: рассказывается про арифметику децибел и усиления, названы реальные компоненты WebRTC и подробно разобран режим отказа, с которым вы можете столкнуться на практике – «погоня за усилением», из-за которой на совещании начинает «дышать» и пульсировать звук.

Почему это важно

Если вы разрабатываете продукт для видеоконференций, платформу телемедицины, онлайн-обучение или контакт-центр, жалобы, которые вы чаще всего услышите, вряд ли будут звучать как «регулировка усиления настроена неправильно» – скорее, это будет «я не слышу тихого человека» или «этот собеседник буквально рвёт мне наушники». И то, и другое – типичные проявления проблем с AGC. Эта статья предназначена для менеджера продукта, основателя или операционного руководителя, которому нужно достаточно хорошо разобраться в регулировке уровня, чтобы правильно интерпретировать такие жалобы, задать инженеру точный вопрос и выстроить реалистичные ожидания у клиента. Опытный инженер найдёт в каждом утверждении ссылку на соответствующую Рекомендацию ITU-T, ограничение W3C или исходный код WebRTC. К концу статьи вы сможете объяснить, почему один из участников звучит слишком громко, почему AGC иногда усиливает фоновый шум между фразами и почему отключение AGC может быть правильным решением в случае музыки или студийной записи.

Проблема: каждый говорящий приходит с разной громкостью

Начнём с того, что переживает слушатель – ведь всё решение исходит из этого. В любом звонке, где участвует больше двух человек, уровень звука у говорящих всегда разный. Один прижимает микрофон гарнитуры к губам, другой сидит в метре от ноутбука. У одного – профессиональный подкастерский микрофон, у другого – встроенная камера с дешёвым микрофоном в бюджетном планшете. На одной системе ползунок громкости стоит на 30%, на другой – на 100%. В результате одна и та же фраза доходит до слушателя то едва слышно, то болезненно громко, и весь разговор он вынужден крутить громкость на своём устройстве.

Задача автоматической регулировки усиления – устранить эту разницу ещё до того, как она дойдёт до слушателя. Система измеряет громкость голоса каждого участника, определяет, нужно ли увеличить или уменьшить уровень, и применяет эти изменения так, чтобы все голоса оказались примерно на одном целевом уровне. Если всё сделано хорошо – это незаметно: каждый голос просто звучит чётко и ровно. Если же настройка выполнена плохо – это становится самым утомительным дефектом во время звонка.

Единица, которой мы здесь измеряем громкость, – децибел относительно полной шкалы, по-английски dBFS. Полная шкала – 0 dBFS – это максимально допустимый уровень цифрового сигнала перед клиппингом; любой реальный уровень – отрицательное число ниже него. Комфортный разговорный голос в захваченном сигнале находится в диапазоне −18…−12 dBFS; шёпот – около −40 dBFS; искажения клиппинга начинаются на 0 dBFS. Держите эту шкалу в голове: AGC – это механизм, который подтягивает тихого собеседника с −35 dBFS и громкого с −6 dBFS к одной цели, скажем, −18 dBFS, чтобы слушатель воспринимал их как равные.

Что на самом деле такое «усиление»

Слово в центре этой темы – усиление (gain). Усиление – это просто множитель, применяемый к сигналу: число больше единицы делает его громче, меньше единицы – тише. Инженеры обычно выражают усиление в децибелах, а не в виде чистого коэффициента, потому что децибелы соответствуют восприятию громкости человеческим ухом и потому что они складываются, а не перемножаются – с ними проще работать.

Перевод стоит прочитать вслух хотя бы раз – он демистифицирует каждое число в этой статье:

усиление в децибелах = 20 × log10(амплитуда на выходе ÷ амплитуда на входе)

+6 дБ  →  умножить амплитуду на 2 (волна вдвое выше)
+12 дБ →  умножить на 4
−6 дБ  →  умножить на 0,5 (срезать вдвое)

Поэтому, когда модуль AGC говорит, что может обеспечить «до 30 дБ усиления», это означает, что он способен увеличить амплитуду слабого голоса более чем в тридцать раз. Это серьёзная задача, и именно поэтому AGC должен действовать осторожно: усилив тихий голос на 30 дБ, он одновременно усилит на те же 30 дБ и фоновый шум – гул комнаты, вентилятор, клавиатуру. Вся суть AGC – поднять голос, не вытащив вместе с ним всё остальное.

Два рычага: аналоговое и цифровое усиление

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

Первый рычаг – аналоговое усиление. Прежде чем ваш голос превратится в числа, он проходит через предусилитель микрофона, и большинство операционных систем позволяют регулировать, насколько сильно этот предусилитель усиливает сигнал – это и есть ползунок «громкость микрофона» в настройках звука. AGC может попросить ОС сдвинуть этот ползунок. Преимущество здесь решающее: увеличив аналоговое усиление, вы получаете более детализированный сигнал от тихого говорящего, потому что усиление происходит до оцифровки, и вы не растягиваете уже грубое, квантованное значение. Цена – в том, что ползунок медленный, общий для всей системы и на части оборудования перемещается крупными шагами.

Второй рычаг – цифровое усиление. Когда звук уже зафиксирован в виде отсчётов, программа может умножить их напрямую. Этот процесс происходит мгновенно, точно и полностью под контролем приложения. Однако есть ограничение: невозможно добавить детали, которых изначально не было. Если голос поступил на уровне −45 dBFS, умножение на большое число повысит громкость голоса вместе с шумовым полом и усилит грубость квантования, возникшую при записи.

Разумная стратегия – использовать аналоговое усиление, чтобы вывести исходный сигнал в допустимый диапазон, а цифровое – для точной настройки последних нескольких децибел. Классический дизайн WebRTC как раз так и работает: в режиме adaptive analog петля обратной связи отслеживает уровень сигнала и корректирует громкость микрофона в операционной системе – в пределах шкалы 0–255, – а цифровая ступень доводит сигнал до нужного уровня. На телефоне, где приложению недоступен аналоговый регулятор микрофона, этот инструмент отсутствует, поэтому система переходит на виртуальный микрофон – программный аналог, полностью имитирующий аналоговый ползунок в цифровой среде.

Рис. 1. Два рычага AGC. Аналоговое усиление применяется на аппаратном уровне до оцифровки; цифровое – к отсчётам после. Первое добавляет детали, но работает медленно; второе мгновенно и точно, но не может восстановить то, что микрофон не зафиксировал.

Два стиля управления: за пиком и по целевой громкости

Помимо вопроса где применять усиление, возникает вопрос на что направлять усилия. Две философии соперничают уже десятилетиями.

Первая – следование за пиком. Здесь регулятор отслеживает самый громкий мгновенный отсчёт – пик – и быстро снижает усиление, как только пик приближается к 0 dBFS и рискует быть обрезан. Это делает лимитер, который выступает в роли страховочной сетки на выходе почти любого тракта AGC. Следование за пиком реагирует быстро и никогда не даёт сигналу клиппировать, но если использовать его в одиночку, голос звучит сдавленно, потому что лимитер жёстко сжимает каждый громкий слог.

Вторая – управление по целевой громкости. Здесь регулятор измеряет среднюю громкость в заданном временном окне – ближе к тому, как воспринимает громкость человеческое ухо, – и плавно изменяет усиление так, чтобы эта средняя величина соответствовала заданной цели. Такой подход звучит естественно, потому что не реагирует на каждый всплеск, а отслеживает общий уровень сигнала. Однако медленный регулятор может оказаться не готов к внезапному громкому звуку – поэтому ниже по цепочке всегда ставят быстрый пиковый лимитер в качестве страховки.

Реальные системы используют оба подхода: медленное изменение громкости по цели выравнивает уровень речи, а быстрый пиковый лимитер стоит в самом конце, чтобы даже кашель или хлопок по столу не вызывали срезов на выходе. Модуль WebRTC называет эти задачи прямо – адаптивный цифровой контроллер усиления, стремящийся к цели, защита от насыщения, предугадывающая пики, и лимитер, ловящий то, что пропустил предыдущий этап.

Петля управления: измерь, сравни, подстрой – медленно

Любой AGC – это петля обратной связи, и самое важное проектное решение в этой петле – насколько быстро она реагирует. Пройдём по петле один раз. Регулятор измеряет текущий уровень голоса, сравнивает его с целевой величиной, вычисляет, насколько нужно изменить усиление, чтобы закрыть разрыв. А затем – и это ключевой момент – применяет это изменение постепенно, за десятки или сотни миллисекунд, а не одномоментно.

Почему постепенно? Потому что громкость человеческой речи естественным образом меняется в пределах одной фразы: мы подчёркиваем одни слова и почти не произносим другие, а в конце фразы голос затихает. Если бы AGC реагировал на каждое такое изменение, он усиливал бы затихающие окончания и подавлял ударные слова – в результате громкость голоса стала бы рывками меняться. Этот эффект инженеры называют пульсацией или дыханием.

Решение – настроить петлю так, чтобы она работала медленно при увеличении громкости и быстро при уменьшении: плавно повышать уровень, чтобы тихие участки не провисали, но быстро снижать усиление при появлении громкого звука, чтобы ничего не обрезалось. Эти две характеристики – атака (насколько быстро усиление снижается при громком звуке) и восстановление (насколько медленно оно возвращается к исходному уровню при тихом звуке).

Международный стандарт регулировки уровня в телефонной сети, Рекомендация ITU-T G.169 (Automatic level control devices, 06/1999), закрепляет именно эту осторожность. Он не устанавливает конкретный алгоритм, но задаёт жёсткие ограничения на поведение устройства: усиление «не должно возрастать быстрее 10 дБ/с», а начальное усиление в начале звонка по умолчанию равно единице (то есть без изменений) и в любом случае «не должно превышать +4 дБ». Логика здесь та же, что и на совещании: регулятор, слишком быстро увеличивающий усиление, расшатывает всё соединение и заставляет всех звучать так, будто они говорят сквозь туннель, размер которого постоянно меняется.

Почему AGC должен знать, когда вы говорите

Вот тонкость, отделяющая хороший AGC от плохого. Петля выше говорит: «измерь текущий уровень голоса». Но в паузах между словами и фразами голоса нет – только шум комнаты, вентилятор, далёкий трафик. Если бы регулятор наивно измерял эти паузы и видел слабый сигнал, он сделал бы вывод: «этот говорящий слишком тихий» – и увеличил бы усиление, превратив шум в громкое шипение. Потом вы начинаете говорить, уровень резко возрастает, и он мгновенно снижает усиление. Снова артефакт дыхания, на этот раз полностью порождённый тишиной.

Поэтому грамотный AGC включает детектор речевой активности, по-английски VAD (voice activity detection) – небольшой классификатор, который по кадрам определяет, идёт ли речь или нет. AGC обновляет оценку уровня сигнала и подстраивает усиление только тогда, когда VAD сообщает: «речь есть»; в тишине усиление остаётся неизменным. В WebRTC AGC использует статистический детектор, отслеживающий краткосрочную и долгосрочную оценку энергии сигнала и анализирующий, насколько кратковременный уровень отклоняется от долгосрочного «центра тяжести»: большое отклонение указывает на вероятность речи. В реальном времени детектору также приходится вычитать остаточное эхо с дальней стороны, попавшее в микрофон, чтобы не принять чужой голос за свой и не подстроиться под чужой сигнал. Детектору посвящена отдельная статья – Детектор речевой активности (VAD) и прерывистая передача (DTX).

«Подвох, прямым текстом. Когда клиент говорит: «фоновый шум становится громким, как только я замолкаю, а потом падает, когда я начинаю говорить» – это проблема AGC-плюс-VAD, а не шум. Усиление резко возрастает в паузах, потому что детектор речи пропускает молчание или потому что шумоподавление перед усилением работает недостаточно эффективно. Решение – выше по цепочке обработки: улучшить детектор речи и усилить шумоподавление, а не просто понижать уровень усиления. Проверяйте намеренно: посадите тестировщика в шумную комнату и попросите делать паузы по десять секунд между фразами – прислушайтесь к всплескам громкости.»
Рис. 2. Петля AGC. Она измеряет уровень голоса – но только пока детектор речи подтверждает наличие речи, – сравнивает его с целевой величиной и постепенно изменяет усиление. Пиковый лимитер на выходе гарантирует, что сигнал не будет обрезан на уровне 0 dBFS.

Числовой пример: выравниваем двух говорящих

Числа делают всё конкретным. Пусть цель – −18 dBFS, и к звонку подключены двое.

Говорящий A находится близко к хорошему микрофону и даёт уровень −12 dBFS – на шесть децибел выше целевого. Нужно уменьшить усиление AGC:

изменение усиления = цель − измерено = −18 − (−12) = −6 дБ

Регулятор устанавливает усиление на −6 дБ для канала A, уменьшая амплитуду вдвое. Он достигает этого значения за несколько сотен миллисекунд, поэтому переход остаётся незаметным для слуха.

Говорящий B находится вдали от тихого планшета и достигает уровня −38 dBFS – на двадцать децибел ниже целевого. Необходимо увеличить усиление AGC:

изменение усиления = цель − измерено = −18 − (−38) = +20 дБ

Двадцать децибел – это десятикратное увеличение амплитуды. Регулятор не может применить это мгновенно: при скорости 10 дБ/с, соответствующей ограничению G.169, разгон занял бы две полные секунды, а хорошо настроенный конференц-AGC работает быстрее, но всё равно требует заметной доли секунды. Вот в чём ловушка, которую раскрывает пример: подняв уровень сигнала B на 20 дБ, вы одновременно повышаете на те же 20 дБ и фоновый гул его помещения. Если шумовой пол был на уровне −60 dBFS, теперь он поднялся до −40 dBFS – тихо, но уже различимо. Поэтому при значительном усилении всегда требуется мощное шумоподавление на входе, и именно поэтому регулятор ограничивает, насколько сильно он может усиливать сигнал: цифровое усиление WebRTC на практике поднимает очень тихого говорящего максимум примерно на 30–35 дБ и достигает этого предела за несколько секунд, а не мгновенно.

Как это делает WebRTC: AGC1, AGC2 и переход к цифровому формату

Большинство браузерных голосовых приложений и многие нативные используют открытый стек libwebrtc, а управление усилением реализовано внутри модуля обработки аудио – Audio Processing Module (APM), который отвечает за очистку сигнала на этапе захвата, включая подавление эха и шума. Подробно этот процесс описан в Конвейер аудио WebRTC целиком. У кода усиления существует два поколения, и их названия регулярно появляются в баг-репортах инженеров.

AGC1 – классический модуль. Он предлагает три режима. Fixed digital применяет постоянное усиление с лимитером и без обратной связи – просто и надёжно, подходит для встраиваемой техники. Adaptive analog использует петлю, подстраивающую ползунок уровня микрофона ОС (от 0 до 255), а остаток компенсирует цифровым способом – оптимальный выбор для ПК и Mac. Adaptive digital имитирует эту аналоговую петлю с помощью виртуального микрофона – решение для телефонов, где доступ к ползунку отсутствует. Две главные настройки AGC1 – целевой уровень в dBFS и усиление компрессии в дБ, то есть максимальный прирост, на который модулю разрешено поднять тихий сигнал.

AGC2 – более новый модуль, построенный вокруг адаптивного цифрового контроллера усиления, классификатора голоса, защитника от насыщения, предугадывающего пики до клиппинга, и финального лимитера. Направление индустрии за последние несколько лет – перенести основную работу в цифровой путь AGC2 и рассматривать аналоговый ползунок как грубый помощник, а не как основной элемент управления. Причина практическая: аналоговый ползунок общий для всей операционной системы, на части оборудования он работает с грубыми шагами и часто удивляет пользователей – отсюда и давняя жалоба, к которой мы перейдём дальше.

Порядок в тракте важен. Регулировка усиления идёт после эхоподавления и после шумоподавления в тракте захвата WebRTC. Логика здесь строгая: если бы AGC усилил сигнал до шумоподавления, он бы усилил и шум, что усложнило бы работу подавителя; а если бы регулировка шла до эхоподавления, она изменила бы уровень сигнала, который подавитель пытается компенсировать. Поэтому порядок фиксирован: сначала фильтр высоких частот, затем эхоподавление (Акустическое эхоподавление (AEC): как это работает), потом шумоподавление (Шумоподавление: классическое NS, RNNoise, Krisp, NVIDIA RTX Voice), и в конце – регулировка усиления. Она устанавливает уровень уже очищенного голоса.

Споры: «перестаньте трогать мой микрофон»

Есть известная точка трения, которую стоит назвать, потому что её увидит ваша поддержка. Когда adaptive-analog AGC браузера двигает ползунок микрофона ОС, пользователь видит, как его собственный ползунок едет. Музыкант, подкастер или любой с тщательно настроенным аудиоинтерфейсом наблюдает, как браузер дёргает его входной уровень посреди сессии, и это ощущается так, будто приложение с ним борется. Это многолетняя жалоба на реализацию WebRTC в Chrome, пользователи просят способ запретить браузеру трогать аппаратный ползунок.

Рычаг для этого – ограничение autoGainControl, определённое спецификацией W3C Media Capture and Streams. Когда приложение вызывает getUserMedia, чтобы получить доступ к микрофону, оно может запросить autoGainControl: false, чтобы попросить браузер не применять автоматическое усиление. Спецификация чётко определяет, что может обещать источник: если устройство вообще не поддерживает AGC, оно возвращает одиночное значение false; если AGC нельзя отключить – одиночное значение true; и только в случае, когда скрипт действительно управляет этой функцией, возвращаются оба значения – true и false. Иными словами, возможность отключения AGC зависит от браузера и устройства, поэтому хорошее приложение проверяет эту возможность, а не делает предположения.

// Просим браузер НЕ трогать уровень микрофона — для музыки, студии, профессионального аудио.
const stream = await navigator.mediaDevices.getUserMedia({
  audio: { autoGainControl: false, echoCancellation: false, noiseSuppression: false }
});

Практическое правило: для совещания или звонка оставляйте AGC включённым – ровные уровни говорящих важнее верности. Для музыки, записи инструмента или пользователя с профессиональным интерфейсом дайте переключатель, ставящий autoGainControl: false, потому что на таком оборудовании собственная настройка усиления пользователя лучше любой автоматической петли.

Какие настройки показывать, а какие скрывать

Это самая практичная часть статьи, взятая прямо из плана раздела: какие элементы управления должны быть в интерфейсе вашего продукта, а какие – только в конфиге инженера.

НастройкаОткрывать пользователям?Почему
AGC вкл/выкл (ограничение autoGainControl)Да, для режима музыки / профзвукаМузыкантам нужна своя настройка усиления; совещаниям – нет
Ползунок «уровень входа» микрофона (аналог)Да, но как ручной обходПользователи ждут контроля над своим железом; внезапные изменения ощущаются как баг
Целевой уровень (dBFS)НетНеверная цель делает всех слишком громкими или тихими по всему продукту
Компрессия / максимум подъёма (дБ)НетСлишком высоко – усиливает шум; слишком низко – тихие неслышны; настраивать по платформе
Времена атаки / восстановленияНетАртефакт пульсации живёт здесь; трогать должен только аудиоинженер
Лимитер вкл/выклНетСтраховку от клиппинга нельзя давать отключать на звонке

Закономерность ясна. Открывайте намерение – «я на совещании» или «я слушаю музыку» – и скрывайте механизм. Каждая ручка в нижней части таблицы – это способ испортить продукт при неправильной настройке, и ни одну из них нельзя подстроить «на глаз» в нужный момент без инженера.

Где здесь Фора Софт

Мы интегрируем аудио в реальном времени в видеоконференции, телемедицину, онлайн-обучение и live-мероприятия с 2005 года, и неравномерные уровни громкости – одна из самых частых жалоб, с которыми сталкиваются все эти продукты. Особенно остро это проявляется в телемедицине: врач с качественной гарнитурой и пациент, говорящий с динамика ноутбука на расстоянии – вот типичный пример рассинхронизации: −12 dBFS против −38 dBFS, как описано в статье. Привести оба голоса к комфортному уровню – значит превратить напряжённую консультацию в спокойный диалог.

Наша задача – выбрать подходящую стратегию усиления для каждого типа устройства, настроить модуль обработки аудио WebRTC так, чтобы аналоговый регулятор громкости не вызывал у пользователей неожиданностей, определить, когда отключать AGC для музыки или образовательных задач, и заранее протестировать систему на склонность к чрезмерному усилению и шуму, пока эти проблемы не достигли конечного пользователя. Мы не переписываем AGC2 с нуля – мы заставляем его корректно работать на разнообразном наборе устройств, которыми реально пользуются ваши клиенты.

Главное

  • AGC выравнивает громкость говорящих, чтобы тихий и громкий голоса воспринимались слушателем одинаково.
  • Усиление – это множитель в децибелах: +6 дБ удваивает амплитуду сигнала, −6 дБ уменьшает её вдвое.
  • Аналоговое усиление (регулировка уровня микрофона ОС) добавляет детализацию, но работает медленно; цифровое – мгновенное, но усиливает шум.
  • Петля должна нарастать постепенно и спадать быстро, иначе голос будет пульсировать и «дышать».
  • Детектор речи должен управлять петлёй, иначе AGC будет усиливать тишину до уровня громкого шума.
  • Для совещаний оставляйте AGC включённым; для музыки отключайте autoGainControl: false.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.