Содержание статьи +
- Кратко
- Почему это важно
- Проблема: каждый говорящий приходит с разной громкостью
- Что на самом деле такое «усиление»
- Два рычага: аналоговое и цифровое усиление
- Два стиля управления: за пиком и по целевой громкости
- Петля управления: измерь, сравни, подстрой – медленно
- Почему AGC должен знать, когда вы говорите
- Числовой пример: выравниваем двух говорящих
- Как это делает WebRTC: AGC1, AGC2 и сдвиг к цифре
- Споры: «перестаньте трогать мой микрофон»
- Какие настройки открывать, а какие прятать
- Где здесь Фора Софт
- Главное
- Что почитать дальше
Кратко
Автоматическая регулировка усиления, по-английски 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, – пока цифровая ступень доводит остаток. На телефоне, где приложению не открыт аналоговый ползунок микрофона, этот рычаг отсутствует, поэтому система переходит на виртуальный микрофон: программный заменитель, имитирующий аналоговый ползунок целиком в цифровой области.
Два стиля управления: за пиком и по целевой громкости
Помимо вопроса, где применять усиление, есть вопрос, на что целиться. Две философии конкурируют десятилетиями.
Первая – следование за пиком. Здесь регулятор следит за самым громким мгновенным отсчётом – пиком – и быстро убавляет усиление каждый раз, когда пик грозит достичь 0 dBFS и срезаться. Это делает лимитер, и лимитер – страховочная сетка в конце почти любого тракта AGC. Следование за пиком реагирует быстро и никогда не даёт сигналу клиппировать, но если использовать его в одиночку, голос звучит сдавленным, потому что лимитер жёстко зажимает каждый громкий слог.
Вторая – управление по целевой громкости. Здесь регулятор измеряет среднюю громкость в окне времени – ближе к тому, как громкость судит ухо, – и медленно ведёт усиление так, чтобы это среднее село на цель. Это звучит естественно, потому что не реагирует на каждый всплеск; оно отслеживает общий уровень голоса. Цена в том, что медленный регулятор можно застать врасплох внезапным громким звуком, – поэтому ниже по тракту всегда держат быстрый пиковый лимитер как страховку.
Реальные системы сочетают оба: медленная ступень по целевой громкости делает музыкальную работу выравнивания говорящих, а быстрый пиковый лимитер стоит в самом конце, чтобы даже кашель или хлопок по столу никогда не срезали выход. Модуль WebRTC называет эти задачи прямо – adaptive digital gain controller, ведущий к цели, saturation protector, предугадывающий пики, и limiter, ловящий то, что проскользнуло.
Петля управления: измерь, сравни, подстрой – медленно
Любой AGC – это петля обратной связи, и самое важное проектное решение в этой петле – как быстро она реагирует. Пройдём петлю один раз. Регулятор измеряет текущий уровень голоса. Сравнивает его с целью. Вычисляет, насколько изменить усиление, чтобы закрыть разрыв. А затем – и это ключевая часть – применяет это изменение постепенно, за десятки или сотни миллисекунд, а не разом.
Почему постепенно? Потому что человеческая громкость естественно меняется внутри одной фразы. Мы выделяем одни слова и проглатываем другие; конец фразы затихает. Если бы AGC гонялся за каждым таким колебанием, он усиливал бы затихающие хвосты и зажимал ударные слова, и голос дёргался бы по громкости – артефакт, который инженеры зовут пульсацией или дыханием. Лечение – сделать петлю медленной на подъёме и быстрой на спаде: мягко подниматься к более громкой цели, чтобы тихие места поднимались плавно, но быстро убавлять при появлении громкого, чтобы ничего не срезалось. Эти две скорости – атака (как быстро усиление падает на громком звуке) и восстановление (как медленно оно возвращается на тихом).
Международный стандарт регулировки уровня в телефонной сети, Рекомендация ITU-T G.169 (Automatic level control devices, 06/1999), кодифицирует ровно эту осторожность. Он не предписывает алгоритм, но задаёт жёсткие пределы поведению: усиление устройства «не должно возрастать быстрее 10 дБ/с», а начальное усиление в начале звонка по умолчанию равно единице (без изменения) и в любом случае «не должно превышать +4 дБ». Логика та же, что нужна совещанию: регулятор, хватающий усиление быстро, расшатывает всё соединение и заставляет всех звучать так, будто они говорят сквозь туннель, который всё время меняет размер.
Почему AGC должен знать, когда вы говорите
Вот тонкость, отделяющая хороший AGC от плохого. Петля выше говорит «измерь текущий уровень голоса». Но в паузах между словами и фразами голоса нет – только шум комнаты, вентилятор, далёкий трафик. Если бы регулятор наивно мерил эти паузы и видел тихий сигнал, он заключил бы «этот говорящий слишком тихий» и поднял усиление, раздув шум в громкое шипение. Потом вы начинаете говорить, уровень подскакивает, и он резко убирает усиление. Снова артефакт дыхания, на этот раз порождённый целиком тишиной.
Поэтому грамотный AGC включает детектор речевой активности, по-английски VAD (voice activity detection), – маленький классификатор, который покадрово решает, речь сейчас или нет. AGC обновляет свою оценку уровня и подстраивает усиление, только когда VAD говорит «речь есть»; в тишине он держит усиление неизменным. AGC в WebRTC делает это статистическим детектором, который отслеживает кратко- и долговременную оценку энергии сигнала и смотрит, насколько кратковременный уровень отклоняется от долговременного «центра тяжести»: высокое отклонение – вероятна речь. В реальном времени детектору ещё приходится вычитать остаточное эхо дальней стороны, просочившееся в микрофон, чтобы не принять чужой голос за ваш и не подстроиться под не тот сигнал. Детектору посвящена отдельная статья – Детектор речевой активности (VAD) и прерывистая передача (DTX).
«Подвох, прямым текстом. Когда клиент говорит «фоновый шум становится громким, как только я замолкаю, а потом падает, когда я начинаю», – это проблема AGC-плюс-VAD, а не проблема шума. Усиление лезет вверх в тишину, потому что детектор речи пропускает паузы или потому что шумоподавление перед усилением работает слишком слабо. Лечение – выше по тракту усиления: лучший детектор речи и более сильное шумоподавление, а не более низкая цель. Проверяйте намеренно: посадите тестировщика в шумную комнату и попросите молчать по десять секунд между фразами – слушайте раздувание.»
Числовой пример: выравниваем двух говорящих
Числа делают всё конкретным. Пусть цель – −18 dBFS, и к звонку подключаются двое.
Говорящий A близко к хорошему микрофону и приходит на −12 dBFS – на шесть децибел громче цели. AGC нужно убавить:
изменение усиления = цель − измерено = −18 − (−12) = −6 дБРегулятор оседает на −6 дБ усиления для A, умножая амплитуду на 0,5. Он доходит туда за несколько сотен миллисекунд, так что срез неслышен.
Говорящий 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), и доводит остаток цифрой – путь PC и Mac. Adaptive digital имитирует эту аналоговую петлю виртуальным микрофоном для телефонов, где ползунок не открыт. Две главные ручки AGC1 – целевой уровень в dBFS и усиление компрессии в дБ, максимум, на который модулю разрешено поднять тихий сигнал.
AGC2 – более новый модуль, построенный вокруг adaptive digital gain controller, классификатора голоса, saturation protector, предугадывающего пики до клиппинга, и финального лимитера. Направление индустрии за последние несколько лет – перенести основную работу в цифровой путь 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) | Нет | Неверная цель делает всех слишком громкими или тихими по всему продукту |
| Компрессия / максимум подъёма (дБ) | Нет | Слишком высоко – усиливает шум; слишком низко – тихие неслышны; настраивать по платформе |
| Времена атаки / восстановления | Нет | Артефакт пульсации живёт здесь; трогать должен только аудиоинженер |
| Лимитер вкл/выкл | Нет | Страховку от клиппинга нельзя давать отключать на звонке |
Закономерность ясна. Открывайте намерение – «я на совещании» против «я играю музыку» – и прячьте механизм. Каждая ручка в нижней половине таблицы – способ сделать продукт хуже при неверной настройке, и ни одну из них нельзя подстроить на слух в моменте без инженера.
Где здесь Фора Софт
Мы встраиваем real-time аудио в видеоконференции, телемедицину, онлайн-обучение и live-shopping с 2005 года, и неровные уровни говорящих – жалоба, на которую отвечает каждый из этих продуктов. В телемедицине особенно: врач в хорошей гарнитуре и пациент на далёком динамике ноутбука – это ровно тот рассинхрон −12 dBFS против −38 dBFS, который описывает статья, и свести оба голоса к одному комфортному уровню – разница между спокойной консультацией и напряжённой. Наша работа в основном – выбрать правильную стратегию усиления под класс устройства, настроить WebRTC Audio Processing Module так, чтобы аналоговый ползунок не удивлял пользователей, решить, когда открыть переключатель отключения AGC для музыки или обучения, и намеренно тестировать на погоню за усилением и раздувание шума до того, как они дойдут до клиента. Мы не переписываем AGC2; мы заставляем его вести себя на пёстром наборе устройств, которыми реально владеют ваши пользователи.
Главное
- AGC выравнивает говорящих, чтобы слабый и громкий голоса дошли к слушателю на одном уровне.
- Усиление – это множитель в децибелах: +6 дБ удваивает амплитуду, −6 дБ срезает вдвое.
- Аналоговое усиление (ползунок микрофона ОС) добавляет деталь, но медленное; цифровое мгновенное, но усиливает шум.
- Петля должна подниматься медленно и падать быстро, иначе голос пульсирует и «дышит».
- Детектор речи должен шлюзовать петлю, иначе AGC усиливает тишину в громкий шум.
- Для совещаний держите AGC включённым; для музыки открывайте autoGainControl: false.