Невидимые метки в аудио: как найти, кто слил запись из закрытого сообщества
В начале 2024 года я делал защиту контента для одного блогера. Он выкладывал в закрытое сообщество аудиоролики и аудиосообщения, и они утекали наружу. Задача: чтобы каждый подписчик получал свою, чуть-чуть другую копию, и по слитому файлу можно было понять, чья она. Тогда этого человека можно забанить, и информация из закрытого сообщества перестаёт утекать.
Я написал для этого сервис на TypeScript поверх ffmpeg. Каждый способ спрятать номер подписчика — отдельный плагин, и их можно комбинировать.
- Метаданные. Код в тегах файла. Самое простое и самое хрупкое: снимается одним пересохранением.
- Тихие звуки. В определённые моменты в запись подмешиваются еле слышные звуки — шумы и «волны». Каждый бит номера — это выбор одного из двух звуков на своём месте; метки повторяются в начале и в конце.
- Темп. Файл режется на куски, и каждый кусок чуть-чуть ускоряется или замедляется — на слух незаметно, а по длительности отрезков номер читается.
- Паузы. Программа находит в записи паузы между словами и удлиняет их на разную величину.
- Эквалайзер. На отдельных отрезках — узкий подъём и спад одной частоты.
- Сегменты — самое хитрое. Автор записывал несколько дублей одного и того же текста. Программа склеивала фразы из разных дублей, и у каждого подписчика получалась своя комбинация. Длительность каждой фразы подгонялась темпом, чтобы швы не было слышно. Такую метку не снять ни пересжатием, ни фильтрами: это не наложенный эффект, а сам текст в разном исполнении.
А если сливают вместе? Несколько человек могут сравнить свои копии и смешать их. Тогда в общем файле остаются только те метки, которые у них совпадают. Под этот случай я писал отдельный скрипт: по таким остаткам он перебирает тройки подписчиков, которые могли дать именно такую смесь.
Что было дальше. Видимо, у ребят было несколько аккаунтов. Они сравнили аудиосообщения, поняли, что копии разные, начали разбираться — и в итоге вообще перестали сливать аудио. Вычислить, кто это делал, нам тогда не удалось, но слив аудио прекратился.
Вместо этого они стали всё транскрибировать и выкладывать текстом. Мы думали и над этим: как с помощью ChatGPT в каждую копию чуть-чуть что-то добавлять — слова-паразиты, другие формулировки. Но когда у сливающего два аккаунта, он сравнивает две версии и вычищает различия, и справиться с этим практически нереально.
Видео. Весной добавилось видео. Ролики показывались через плеер VdoCipher, и номер зритель носил прямо на экране: из его битов считались положение водяного знака и интервалы, с которыми он перемещается, цветами кодировалась информация, показывались всплывашки. Сливщики привыкли всё это блурить — и расслабились. А мы добавили в видео ещё и аудиометки. По ним их в итоге вычислили и забанили.
Что я из этого вынес: ни один способ сам по себе не переживает всего — метаданные слетают при пересохранении, звуки можно вырезать, видимый знак заблурить. Поэтому меток должно быть несколько и разной природы. И самое опасное для сливщика — метка, о которой он не знает: пока они боролись с тем, что видели, их выдал звук.