Автор воссоздал для Linux эффект пространственного звука по записи выхода коммерческой программы
Автор давно пользовался на другой операционной системе программой, которая в реальном времени обрабатывала проигрываемый звук: он казался более далёким и лёгким, при этом нужная информация сохранялась, а после долгого прослушивания музыки меньше ощущалась «закупоренность». Он хотел такой же простой аналог для Linux и решил написать его сам, взяв за основу PipeWire. Название программы и прежней системы в тексте не раскрыты.
Первая попытка не удалась. Опыта в аудио у автора не было, поэтому он использовал большую языковую модель как собеседника и пробовал стандартные фильтры и психоакустические приёмы. Так он узнал про HRTF (функции, описывающие, как звук с определённого направления доходит до ушей с учётом геометрии слушателя). База MIT KEMAR показалась ему ужасной: она записана в безэховой камере, без отражений от помещения, а здесь они были нужны, и звук получался дешёвым и «внутри головы». База SADIE II, в которую входят и отклики помещений, звучала гораздо ближе к тому, что он помнил. Но дальше дело встало: модель сыпала терминами вроде «perceptual envelopment» (воспринимаемая объёмность), «late-field decorrelation» (декорреляция позднего поля), «spectral diffusion» (спектральное рассеяние) и «diffuse spatial energy» (рассеянная пространственная энергия). Лучше других с этим справлялась Gemini, к тому же только у неё была бесплатная студенческая программа. Автор слышал, что с эффектом что-то не так, но эти описания не указывали ничего, что он мог бы понять и использовать. Проект на время был заброшен.
Позже появилась другая идея: не выяснять внутренние параметры и алгоритмы программы, а изучить поведение самого фильтра. Копии программы у автора не было, он мог экспериментировать только на ноутбуке друга и поэтому не мог постоянно менять свою реализацию и сравнивать её с эталоном. Прочитав Signalsmith и блоги аудиоинженеров, он понял, что для снятия импульсных характеристик и других измеримых свойств не нужно постоянно пользоваться программой. Он сгенерировал на Linux аудиофайл, проиграл его через программу на ноутбуке друга и записал выход.
В тестовый файл вошли: импульс (один ненулевой отсчёт) отдельно в каждом канале, импульсы разной амплитуды для проверки зависимости от громкости, один и тот же импульс в обоих каналах и затем с инвертированным правым каналом, а между ними тишина, достаточная для затухания отклика. Поскольку у импульса на каждой частоте мало энергии, добавили и синусоидальную развёртку (sweep): отклик получали делением спектра записи на спектр сигнала с регуляризацией (параметр λ), чтобы шум записи не делился на значения, близкие к нулю. Кроме того, в файле были стационарные тона разных частот и амплитуд, длинные тоны от тихого к громкому и обратно, мультитон для проверки появления новых частот, повторы для проверки неизменности во времени и отложенный участок шума для итоговой проверки.
Запись и воспроизведение запускали вручную, поэтому смещение находили по эквидистантным щелчкам в начале файла, сравнивая энергию в окне; одно и то же смещение применяли к обоим каналам, чтобы сохранить задержку между ними. Для основного режима объёмного звучания (surround) масштабированные импульсы почти совпали, отклик на сумму входов совпал с суммой откликов, а мультитон почти не породил новых частот, то есть фильтр можно считать линейным и неизменным во времени. Ошибка модели на записанном выходе оказалась примерно равна различию между самими повторами и много меньше единицы (числовые значения автор не приводит). Режим, снижающий громкость, менял усиление в зависимости от амплитуды и восстанавливал его не сразу, а другой пространственный режим менялся между повторами, поэтому ни один из них нельзя воспроизвести фиксированным фильтром свёртки.
Записав оба выходных канала на импульс в каждом входном, автор получил четыре фильтра. Звук появлялся и в противоположном канале, тише и с небольшой задержкой, а затем шёл длинный хвост; вместе это и давало ощущение «вне головы». Длину отклика он подбирал, сравнивая всё более длинные фильтры на отложенном шуме, и оставил полный отклик, точнее предсказывавший шум, чем короткие версии. Загрузка четырёх откликов в Saq (усилитель звука реального времени для Linux) дала то расположение звука, которое автор безуспешно пытался воспроизвести вручную. Результат можно попробовать на странице статьи: нужно выбрать локальный аудиофайл или захватить вкладку (не в Firefox) и нажать на значок с квадратом, чтобы включить эффект.
Ключевые факты
- Попытка подобрать эффект через базы HRTF и подсказки нейросетей упёрлась в тупик: база MIT KEMAR звучала плохо из-за записи в безэховой камере, SADIE II с откликами помещений была ближе к желаемому, а описания модели оказались непригодны на практике.
- Решение: изучать не внутренности программы, а поведение фильтра. Автор сгенерировал тестовый файл (импульсы, развёртка, тона, мультитон, повторы, участок шума) и записал выход программы на ноутбуке друга.
- Основной режим объёмного звучания проверен на линейность и неизменность во времени; из записи извлечены четыре фильтра (2x2: выход на каждый вход), полный отклик оказался точнее укороченных на отложенном шуме.
- Режим со снижением громкости и ещё один пространственный режим нельзя воспроизвести фиксированной свёрткой: у них меняется усиление или поведение между повторами.
- Четыре отклика, загруженные в Saq, дали желаемое размещение звука; результат можно проверить в браузере со своим файлом или захваченной вкладкой.
Почему это важно
Это наглядный пример подхода «чёрного ящика»: вместо попыток угадать алгоритм достаточно записать отклик линейной системы на хорошо подобранные тестовые сигналы. Автор показывает и границы метода: он работает, пока фильтр линейный и неизменный во времени, а режимы с зависимостью от громкости или меняющимся поведением так не воспроизвести. История также честно фиксирует, что описания нейросети остались для новичка без практической пользы.
Кому это важно
Тем, кто занимается обработкой звука и пишет эффекты под PipeWire и Linux, а также любителям цифровой обработки сигналов, которым интересна практика измерения импульсных характеристик, регуляризованного деления спектров и проверки линейности. Для читателей, следящих за нейросетями, интересен небольшой эпизод о том, как языковая модель вела новичка в области, где он не мог проверить её терминологию.
Как это применить
По описанию автора метод выглядит так: сгенерировать файл с импульсами в каждом канале и разной амплитуды, развёрткой, тонами, мультитоном, повторами и отложенным шумом; проиграть его через изучаемый эффект и записать выход; найти смещение записи по щелчкам; получить отклики из импульсов и развёртки; проверить линейность и неизменность во времени; сверить прогноз с отложенным шумом, подобрать длину фильтра и загрузить фильтры в программу вроде Saq. Автор не называет цены и лицензий; в материале есть демонстрационная страница, которая работает с локальным файлом или захваченной вкладкой (в Firefox захват не поддерживается).
Можно ли доверять
Это личная запись в блоге, автор не назван. Улучшение звука описано по его собственному слуху: результатов слушательских тестов или оценки третьих лиц нет, числовые значения ошибки и длины фильтров не приводятся, а проверка модели описана только качественно. Само воспроизведение измеримых свойств основного режима опирается на сверку с отложенным участком шума, что даёт разумное, но не независимое подтверждение.
Риски и подводные камни
Метод годится только для линейных фильтров, не меняющихся во времени: режим со снижением громкости и ещё один пространственный режим автору воспроизвести не удалось. Результат основан на записи, сделанной на чужом ноутбуке, поэтому перепроверить его по оригиналу автор не мог. Юридическая сторона воссоздания эффекта коммерческой программы в материале не обсуждается. Субъективные оценки вроде «дальше от ушей» зависят от слушателя и наушников.
«Я скоро понял, что мне не нужно постоянно пользоваться программой, чтобы снять её импульсные характеристики и другие измеримые параметры.»
— автор статьи