FFmpeg loudnorm: нормализация громкости записи в два прохода
Как измерить громкость записи через loudnorm, перенести значения во второй проход и проверить LUFS, true peak и сохранность речи.
Когда нужен отдельный разбор loudnorm
У записей интервью бывает разная средняя громкость: один файл приходится слушать громко, другой резко звучит в наушниках. loudnorm помогает обработать копию по выбранной цели громкости. Это отдельная задача от устранения эха, шума и перегрузки: фильтр не добавляет информацию, которой нет в исходном сигнале.
Если нужно разобраться в различии пиков и воспринимаемой громкости, начните с основ нормализации записи. Здесь разбирается конкретная последовательность команд. Сохраните оригинал и выполняйте оба прохода над одной и той же выбранной аудиодорожкой.
Получите измерения без записи нового аудио
В командной строке выполните пример ниже. Цель I=-16 LUFS, предел TP=-1.5 dBTP и диапазон LRA=11 заданы для учебной задачи, а не как обязательный стандарт всех записей. Для вашего назначения могут потребоваться другие значения.
ffmpeg -i "input.wav" -map 0:a:0 -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json" -f null -
Результат JSON появляется в диагностическом выводе. Найдите input_i, input_tp, input_lra, input_thresh и target_offset. Если значения содержат -inf, например при почти пустом сигнале, не переносите их в обработку вслепую: сначала проверьте, что выбранная дорожка действительно содержит речь.
Подставьте показатели своей записи
Пара input_i → measured_I означает: в настройку фильтра нужно перенести измерение входного сигнала. Аналогично перенесите input_tp, input_lra и input_thresh. Сохраните те же целевые I, TP и LRA. Цифры из чужого примера нельзя использовать для своей записи.
linear=true просит линейное изменение уровня, когда оно возможно. Если ограничения по диапазону громкости или true peak этому мешают, loudnorm может перейти к динамическому режиму. Проверяйте normalization_type в итоговой сводке. Явный -ar 48000 задаёт частоту выходного файла; это предотвращает неожиданный выбор частоты после обработки.
Проверьте результат перед расшифровкой
Ещё раз измерьте готовый файл той же командой и сравните входные значения нового измерения с выбранными целями. Прослушайте начало, конец, тихого участника и громкую реплику. Допустимость результата определяют и числа, и слышимость слов. Усиленный фон может стать заметнее, хотя средняя громкость достигла цели.
Для обработки текста загрузите подходящую копию на страницу расшифровки аудио. Важные имена и числа сверяйте с записью. Не считайте loudnorm гарантией повышения точности распознавания: если исходник уже разборчив, дополнительная обработка может быть не нужна.
Учебный пример переноса измерений
Предположим, первый проход вернул input_i=-22.4, input_tp=-4.8, input_lra=5.2, input_thresh=-32.6 и target_offset=0.1. Это вымышленные учебные показатели. Во втором проходе они становятся измеренными параметрами. Команда ниже показывает структуру; для реального файла замените все пять значений.
| Измерение | Параметр второго прохода | Учебное значение |
|---|---|---|
| input_i | measured_I | -22.4 |
| input_tp | measured_TP | -4.8 |
| input_lra | measured_LRA | 5.2 |
| input_thresh | measured_thresh | -32.6 |
| target_offset | offset | 0.1 |
Команда второго прохода и журнал проверки
ffmpeg -i "input.wav" -map 0:a:0 -af "loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=-22.4:measured_TP=-4.8:measured_LRA=5.2:measured_thresh=-32.6:offset=0.1:linear=true:print_format=summary" -ar 48000 -c:a pcm_s16le "normalized.wav" Исходная дорожка: ____ Цель I / TP / LRA: ____ Измерения первого прохода: ____ Режим второго прохода: ____ Повторное измерение: ____ Тихие реплики, начало и конец прослушаны: ____
Частые вопросы
Почему нужен второй проход?
Он позволяет передать измеренные показатели исходника в обработку. Один проход тоже возможен, но здесь разобран управляемый вариант с отдельным измерением.
Можно ли применить -c:a copy?
Нет. Аудиофильтр требует декодирования и нового кодирования; копирование потока несовместимо с такой обработкой.
Исправит ли loudnorm клиппинг?
Нет. Повышение или снижение уровня не возвращает детали, потерянные при перегрузке записи.
Почему linear=true не дал линейный режим?
Условия по исходному диапазону громкости и пределу true peak могли не выполниться. Смотрите normalization_type и пересмотрите цели.