Как работает сжатие звука: четыре идеи в основе любого современного кодека

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

Опубликовано: 2026-06-05 · Время чтения: 22 мин · Автор: Николай Сапунов, CEO Фора Софт

Кратко

Любой аудиокодек, который встретится вам в видеопродукте, – MP3, AAC, Opus, Dolby – собран из одних и тех же четырёх идей, смешанных в разных пропорциях. Две из них выбрасывают звук, который ухо не слышит (психоакустическое маскирование, удаляющее звуки, спрятанные за более громкими; и частотное преобразование MDCT – инструмент, который делает это удаление возможным), одна предсказывает речь вместо того, чтобы её хранить (линейное предсказание), а последняя упаковывает остаток так плотно, как позволяет математика, не теряя ни одного бита (энтропийное кодирование). Речевые и музыкальные кодеки сорок лет были двумя разными мирами, потому что опирались на разные идеи – речь на предсказание, музыка на маскирование, – пока Opus и xHE-AAC в 2012 году не собрали все четыре в одном потоке. Освойте эти четыре идеи один раз – и любое название кодека в техзадании 2026 года станет читаемым.

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

Если вы создаёте, покупаете или ведёте видеопродукт, ваши инженеры будут говорить о кодеках на языке – «маскирование», «MDCT», «LPC», «энтропийный этап», – который звучит как четыре несвязанные загадки. На самом деле это одна загадка, рассказанная четырьмя способами, и продакт-менеджер, который держит в голове эти четыре идеи, может следить за обсуждением кодеков, задавать более точные вопросы и понимать, почему один кодек звучит лучше другого на том же битрейте. Эта статья – концептуальный ключ ко всему блоку про кодеки в Learn: прочитайте её один раз, и подробные разборы AAC, Opus и остальных перестанут быть списками аббревиатур и станут вариациями на уже знакомую тему. Мы написали её для умного читателя без аудиобэкграунда; каждое техническое утверждение сверено с первоисточником-спецификацией, а не с пересказом из вторых рук.

Сначала – что именно делает «сжатие»

Перед четырьмя идеями зафиксируем задачу, которую они решают. Несжатый цифровой звук – такой, как описан в статье Что такое цифровой звук, – хранится как импульсно-кодовая модуляция, PCM: высоту звуковой волны измеряют десятки тысяч раз в секунду и записывают обычными числами. PCM честен и огромен. Посчитаем для одного стереотрека CD-качества:

44 100 отсчётов/с × 16 бит × 2 канала = 1 411 200 бит/с ≈ 1 411 кбит/с

Это примерно десять мегабайт в минуту – на один стереотрек. Задача кодека – сжать эти 1 411 кбит/с до чего-то вроде 128 кбит/с (в одиннадцать раз) так, чтобы слушатель почти не заметил разницы. Слово кодек – просто «coder-decoder»: кодер сжимает, декодер восстанавливает.

Есть два честных способа сжать, и разница важна для остального текста. Сжатие без потерь упаковывает звук, не выбрасывая ни одного отсчёта, – как ZIP упаковывает документ; так делает FLAC, и он даёт примерно 2:1, не больше, потому что это вся избыточность, которую содержит точная запись. Сжатие с потерями безвозвратно удаляет детали, которые ухо вряд ли заметит, и покупает этим куда большее сжатие – 11:1 и сильнее – ценой того, что реальные данные выбрасываются навсегда. MP3, AAC и Opus – все с потерями. Три из наших четырёх идей существуют, чтобы решить, что кодек с потерями может безопасно удалить; четвёртая, энтропийное кодирование, – это упаковка без потерь, общая для обоих видов.

Рис. 1. Четыре идеи одним взглядом. Маскирование и MDCT питают племя музыки, линейное предсказание – племя речи, а энтропийное кодирование – общий завершающий проход любого кодека.

Идея 1 – Психоакустическое маскирование: удалить то, что ухо не слышит

Первая и самая важная идея – не про математику. Она про пределы человеческого слуха. Психоакустическое маскирование («психоакустический» просто значит «как ухо и мозг на самом деле воспринимают звук») – это факт, что громкий звук скрывает рядом тихие, так что тихие можно удалить, и никто не заметит.

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

Маскирование бывает двух видов. Одновременное маскирование происходит по частоте: громкий тон скрывает более тихие тоны, близкие к нему по высоте и звучащие в тот же момент. Временно́е маскирование происходит во времени: громкий звук скрывает тихие звуки прямо до и после него – прямое маскирование, когда громкий всплеск поднимает порог слышимости для следующих звуков, длится примерно от 50 до 200 миллисекунд после конца всплеска. Кодек использует оба. Он смотрит на каждый кусочек звука, строит порог маскирования – линию, ниже которой звук неслышим, потому что его скрывает нечто более громкое, – и не хранит ничего ниже этой линии.

Работает это потому, что так физически устроено ухо. Внутреннее ухо, улитка, не слышит каждую частоту одинаково остро. Оно группирует частоты примерно в две дюжины критических полос, каждая из которых работает как один «размытый» фильтр. Стандартная модель – шкала барков (Bark), предложенная Эберхардом Цвиккером в 1961 году, – делит слышимый диапазон на 24 критические полосы. Стандарт MP3 (ISO/IEC 11172-3, 1993) использовал 25 таких полос, чтобы оценивать маскирование и решать, куда тратить биты. Внутри одной критической полосы ухо не может отделить тихий звук от громкого – поэтому кодек и не хранит тихий.

Вот практическое следствие, с числами. Пусть играет громкий тон 1000 Гц на уровне 80 децибел. Создаваемый им порог маскирования может лежать, скажем, на 40 децибелах для соседних частот. Любой звук по соседству тише 40 децибел неслышим – кодек округляет его до нуля и тратит эти биты в другом месте. Умножьте это решение на все критические полосы, по два десятка раз на кусочек, десятки кусочков в секунду – и вы убрали бо́льшую часть данных, почти не убрав воспринимаемого звука.

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

Идея 2 – Частотное преобразование (MDCT): инструмент, который делает маскирование применимым

Маскирование – это зачем; частотное преобразование – это как. Чтобы удалить звуки, спрятанные за маскером, кодек сначала должен увидеть звук как набор частот – потому что маскирование происходит частота за частотой. Инструмент, который это делает, – математическая операция под названием модифицированное дискретное косинусное преобразование, или MDCT.

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

MDCT – конкретное преобразование, которое использует почти каждый музыкальный кодек: MP3, AAC, AC-3, Vorbis и музыкальная половина Opus работают на нём. Его ввели Джон Принсен и Алан Брэдли в 1986 году, с «нечётно-уложенной» доработкой Принсена, Джонсона и Брэдли в 1987-м. Два свойства делают его правильным инструментом, и оба стоит понять простыми словами.

Во-первых, MDCT обрабатывает перекрывающиеся кусочки. Соседние кусочки делят 50% своих отсчётов – каждый блок звука покрыт двумя окнами, которые плавно переходят друг в друга. Если бы кодек резал звук на жёсткие, неперекрывающиеся блоки, шов между блоками щёлкал бы при воспроизведении. Перекрытие сглаживает швы.

Во-вторых – и это изящная часть – хотя кусочки перекрываются наполовину, MDCT не хранит вдвое больше данных. Оно критически дискретизировано: кусочек из 2N входных отсчётов даёт всего N выходных чисел. Кажется, половина информации потеряна. Она восстанавливается при воспроизведении трюком под названием компенсация наложения во временно́й области (time-domain aliasing cancellation): перекрытие одного кусочка несёт ровно ту ошибку, которая нужна, чтобы погасить ошибку перекрытия следующего, – при условии, что окна нарастания и спада удовлетворяют условию Принсена–Брэдли: w(n)² + w(n+N)² = 1. Уравнение читателю не нужно; вывод в том, что MDCT даёт плавные бесшовные кусочки и никакой платы за хранение перекрытия. Именно это сочетание сделало его универсальным движком кодирования музыки.

Рис. 2. MDCT превращает кусочек волны в частотный спектр; модель маскирования рисует кривую порога; всё, что ниже кривой, неслышимо и выбрасывается.

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

Идея 3 – Линейное предсказание: смоделировать голос вместо того, чтобы его хранить

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

Идея называется линейное предсказание, и за ней стоит наблюдение, что человеческий голос – не произвольный шум, а продукт одной гортани с известной физикой. Голосовые связки гудят, рождая сырой тон; горло, рот и язык формируют этот тон в гласные и согласные. Инженеры называют это моделью «источник-фильтр»: источник (гудение, а для согласных – шипение), пропущенный через фильтр (форму рта). Манфред Шрёдер и Бишну Атал превратили эту модель в практичный кодек – code-excited linear prediction (CELP) – в 1985 году, и почти каждый речевой кодек с тех пор, включая половину SILK в Opus, – его потомок.

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

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

Поэтому же речевые и музыкальные кодеки сорок лет были несовместимы. Линейное предсказание исходит из того, что звук породил один голосоподобный источник; подайте ему оркестр – и предсказание рухнет, потому что сорок инструментов – это не одна гудящая гортань. Кодеки на маскировании и преобразовании ничего не предполагают об источнике, поэтому справляются с музыкой, но тратят биты на одинокий голос, который могли бы предсказать. Каждое племя было отличным в своей задаче и слабым в чужой. Полная история этого раскола и история аудиокодеков, которая их слила, – отдельная статья.

«Подводный камень – неправильное племя для материала звучит плохо вполне определённым образом. Чистый речевой кодек, которому дали музыку на удержании, выдаёт водянистую, роботизированную версию мелодии, потому что его голосовой модели нечего предсказывать. Чистый музыкальный кодек, которому дали один голос на очень низком битрейте, выдаёт «вихревой» артефакт вокруг речи. Лечится это не бо́льшим битрейтом, а правильной идеей для материала – ровно ту проблему и решил Opus, понеся в себе оба подхода.»

Идея 4 – Энтропийное кодирование: упаковать остаток, не теряя ни бита

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

Простыми словами: после маскирования и преобразования бо́льшая часть частотных чисел – нули или около нуля, а несколько – большие. Хранить каждое число одинаковой шириной – скажем, по шестнадцать бит – расточительно, потому что частым малым значениям не нужно шестнадцать бит, а редкие большие редки. Энтропийное кодирование назначает короткие коды частым значениям и длинные – редким, так что итог сжимается. Тот же принцип, по которому азбука Морзе даёт частой букве «E» одну точку, а редкой «Q» – длинное тире-тире-точка-тире.

Доминируют два метода. Кодирование Хаффмана строит дерево кодов переменной длины – его используют MP3 и AAC: быстро и просто, с небольшой неэффективностью, потому что каждый код должен быть целым числом битов. Арифметическое кодирование и его близкий родственник range coder, который использует Opus, кодируют целый кусочек как одно очень длинное дробное число и подбираются ближе к теоретическому пределу ценой чуть бо́льших вычислений. Этот теоретический предел – не маркетинг; это теорема Шеннона о кодировании источника, задающая жёсткий пол на то, во сколько минимум битов может уместиться поток символов. Энтропийные кодеры оценивают по тому, насколько близко к полу Шеннона они подбираются.

Короткий пример делает экономию наглядной. Пусть в кусочке 100 частотных чисел и 90 из них – нули. Схема с фиксированными 8 битами на число стоит 100 × 8 = 800 бит. Энтропийный кодер, дающий значению «нуль» 1-битный код и тратящий в среднем 9 бит на каждое из 10 ненулевых, стоит около 90 × 1 + 10 × 9 = 180 бит – экономия лучше 4:1, без потери точности. Преобразование подготовило это, столкнув энергию в несколько чисел; энтропийный кодер обналичил.

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

Собираем четыре идеи вместе

Теперь соберём их. Современный музыкальный кодек с потерями запускает три из четырёх по очереди: MDCT превращает каждый кусочек в частоты, модель маскирования решает, насколько грубо можно хранить каждую частоту (или выбросить её), а энтропийное кодирование упаковывает результат. Современный речевой кодек запускает другую тройку: линейное предсказание моделирует голос и даёт малый остаток, более лёгкое маскирующее взвешивание решает, как потратить биты на этот остаток, а энтропийное кодирование упаковывает его. Две схемы делят только последний шаг – ровно поэтому два племени так долго оставались порознь.

Таблица ниже показывает, на какие идеи опирается каждый известный кодек. «Главный движок» – идея, делающая бо́льшую часть работы.

КодекГлавный движокМаскированиеЛин. предсказаниеЭнтропийный этапПлемя
MP3MDCT + маскированиеданетHuffmanмузыка
AAC-LCMDCT + маскированиеданетHuffmanмузыка
AC-3 (Dolby Digital)MDCT + маскированиеданетсвоёмузыка
VorbisMDCT + маскированиеданеткодовые книгимузыка
G.711нет (компанд. PCM)нетнетнетречь
CELP-кодеки речилин. предсказаниелёгкоедаразноеречь
Opus (режим SILK)лин. предсказаниелёгкоедаrange coderречь
Opus (режим CELT)MDCT + маскированиеданетrange coderмузыка
xHE-AAC / USACMDCT и предсказаниедадаарифметическоеоба

Две строки в этой таблице – кульминация всей истории кодеков. Opus несёт оба режима – речевой на линейном предсказании (SILK) и музыкальный на MDCT (CELT) – и переключается между ними (или смешивает их в гибридном режиме) внутри одного потока, всё упаковано единым range coder. xHE-AAC (стандарт USAC, ISO/IEC 23003-3) делает тот же трюк со стороны MPEG, сочетая преобразовательное кодирование с предсказанием. Оба появились в 2012 году, и оба работают, потому что наконец держат все четыре идеи сразу. Глубокая механика этого переключения – в статье Opus: открытый кодек, проглотивший WebRTC.

Рис. 3. Музыкальный и речевой конвейеры делят только финальный энтропийный этап. Унификатор вроде Opus несёт оба и переключается покусочно.

Сколько даёт каждая идея?

Полезно увидеть примерный вклад каждой идеи в итоговое сжатие, взяв стерео CD-качества (1 411 кбит/с) за старт и типичный музыкальный кодек 128 кбит/с за финиш. Это иллюстративные порядки величин, не точные цифры – разбивка смещается с материалом, – но они показывают, куда реально уходят биты.

Само преобразование почти ничего не экономит в одиночку; его работа – переупорядочить звук, чтобы следующие две идеи могли сработать. Маскирование делает основную работу на музыке: выбрасывание неслышимых частот даёт бо́льшую часть сжатия 11:1. Затем энтропийное кодирование добирает ещё кусок, упаковывая уцелевших, – нередко ещё 20–40% поверх того, что дало маскирование. Для речи линейное предсказание заменяет маскирование в роли тяжеловеса, и сжатие ещё драматичнее: голос с 1 411 кбит/с PCM становится разборчивым на 6–16 кбит/с – стократное уменьшение, потому что модель голоса гораздо мощнее обобщённого преобразования.

Рис. 4. Куда уходят биты. Маскирование делает основную работу для музыки; линейное предсказание – для речи; энтропийное кодирование подчищает за обоими.

Разобранный пример: один кусочек от начала до конца

Чтобы сделать четыре идеи осязаемыми, проследим за одним 20-миллисекундным кусочком стереомузыки через музыкальный кодек.

Кусочек приходит как PCM: на 48 кГц 20 мс – это 960 отсчётов на канал, по 16 бит, то есть 960 × 16 × 2 = 30 720 бит сырых данных на этот один кусочек. Шаг один, MDCT: 960 отсчётов каждого канала (с окном вместе с соседом) становятся примерно 960 частотными числами – то же количество, новый взгляд, энергия теперь сосредоточена в горстке из них. Шаг два, маскирование: модель находит громкие частоты, рисует под ними порог маскирования и выбрасывает или грубо округляет каждую частоту ниже линии; пусть 700 из 960 чисел падают в ноль. Шаг три, энтропийное кодирование: уцелевшие ~260 чисел плюс длинная серия нулей кодируются Хаффманом или range coder, частые нули берут долю бита каждый. Кусочек, вошедший как 30 720 бит, выходит как примерно 2 700 бит – а на 50 кусочках в секунду это выводит поток к ~135 кбит/с на два канала вместе. Ничто в цепочке не понимало «музыку»; оно понимало только ухо.

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

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

Эти четыре идеи для нас не академичны: они решают, как реально звучат продукты, которые мы строим. В работе с реальным временем – видеоконференции, телемедицина, онлайн-обучение, лайв-шопинг – мы опираемся на унификатор речи и музыки Opus именно потому, что он несёт линейное предсказание для голоса и MDCT для случайного общего музыкального или экранного звука, переключаясь автоматически по мере смены содержания звонка. В работе со стримингом и OTT мы ежедневно имеем дело с семейством на маскировании и преобразовании – AAC и его роднёй, – потому что это то, что встроено в мировое видео. Знание, на какую идею опирается кодек, говорит нам ещё до строчки кода, где его качество удержится, а где треснет: разреженный классический поток, шумная клиника, класс на 50 человек – каждый нагружает свою из четырёх идей. Фора Софт поставляет звук в видеоконференциях, OTT/Internet TV, видеонаблюдении, онлайн-обучении, телемедицине и AR/VR с 2005 года.

Главное

  • Любой современный кодек – смесь четырёх идей: маскирование, преобразование MDCT, линейное предсказание и энтропийное кодирование.
  • Психоакустическое маскирование удаляет звуки, спрятанные за более громкими, – тяжеловес для музыки.
  • MDCT превращает кусочки волны в частоты, чтобы маскирование могло сработать, без платы за хранение.
  • Линейное предсказание моделирует голос и хранит только ошибку – тяжеловес для речи.
  • Энтропийное кодирование – финальный проход без потерь, общий для каждого кодека, с потерями и без.
  • Opus и xHE-AAC (2012) слили племена речи и музыки, понеся все четыре идеи сразу.

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

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

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