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

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

Опубликовано: 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 – Линейное предсказание: смоделировать голос, а не хранить его

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

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

Важно, что энтропийное кодирование – единственная идея, общая для каждого кодека, с потерями и без. 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-миллисекундный фрагмент одного голоса гораздо более предсказуем, чем такой же по длительности кусочек полного микса.

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

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

Главное

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

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

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

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