
Надёжный фреймворк для аудио-водяных знаков, встраивающий бинарные сообщения в амплитудные спектрограммы, с дифференцируемым моделированием атак, пулингом Q-Former, маскированием PESQ и кодами с исправлением ошибок для устойчивости к атакам кодеков и обработки сигналов.
Исходный код CRAW — робастного метода аудиоводяного маркирования, построенного на встраивании в области STFT-амплитуды. Кодер встраивает бинарное сообщение в спектрограмму амплитуды аудиоклипа (фаза сохраняется из чистого сигнала); декодер восстанавливает сообщение при широком спектре атак: обработки сигнала, нейрокодеков, шумоподавления и вокодеров.
Этот репозиторий — форк TimbreWatermarking (NDSS 2024), расширенный следующим:
watermarking_model/ — весь код модели водяного маркирования:
архитектура (model/), обучение (train.py), симуляция атак
(distortions/, utils/distortions.py), оценка
(eval/) и скрипты экспорта/экспериментов (scripts/).Требуется Python 3.8.
Встроенные сторонние зависимости, перечисленные ниже, не включены в этот репозиторий. Они нужны только для атак FACodec/денойзера/TiCodec — не для базовой проверки встраивания/декодирования (см. раздел «Инференс» ниже). Если вы хотите запустить эти атаки, склонируйте публичные репозитории самостоятельно в указанные пути:
git clone https://github.com/lifeiteng/naturalspeech3_facodec.git watermarking_model/naturalspeech3_facodec
git clone https://github.com/modelscope/ClearerVoice-Studio.git watermarking_model/ClearerVoice-Studio
git clone https://github.com/y-ren16/TiCodec.git watermarking_model/codecs/ticodec_repo
Зависимости Python для основного конвейера обучения/оценки перечислены в
watermarking_model/requirements.txt.
Для рендеринга атак с помощью кодеков (EnCodec, TiCodec) мы рекомендуем
отдельное окружение conda для каждого кодека, поскольку у каждого из них
свои — иногда конфликтующие — зависимости; см. инструкции по настройке в
docstring каждого скрипта (codecs/encode_*.py).
Для обучения и оценки используются LibriSpeech (наборы train + test), а для
экспериментов zero-shot cross-domain — LJSpeech. Пути к наборам данных задаются в
поле path.raw_path конфигурации обучения каждого эксперимента
(watermarking_model/config/**/train_*.yaml) и через --audio_dir в
скриптах eval/export — укажите в них пути к вашим собственным локальным копиям
LibriSpeech и
LJSpeech.
cd watermarking_model
python3 train.py \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml
Это обучает полную модель (устойчивый слой искажений + Q-Former + повторяющийся
ECC) — конфигурацию, использованную для основных результатов CRAW. Журналы обучения записываются в
Weights & Biases в проекте craw; сначала задайте
WANDB_ENTITY/войдите через wandb login под своей учётной записью.
Обучение использует фиксированное случайное зерно (2022, задаётся в train.py
для random/numpy/torch/torch.cuda) для воспроизводимости.
Маскирование PESQ применяется на этапе экспорта/инференса, а не во время
обучения — см. scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Предобученный чекпоинт CRAW (эпоха 20, соответствующая основным результатам статьи)
включён непосредственно в эту поставку — загрузка не требуется — по пути
watermarking_model/results/craw/ckpt/pth/ (test.model_path из config/craw/model.yaml
указывает сюда).
Чтобы встроить сообщение в один WAV-файл и сразу декодировать его обратно (без применения атаки) в качестве быстрой проверки работоспособности:
cd watermarking_model
python3 -m scripts.infer \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml \
--input /path/to/clean.wav \
--output /path/to/watermarked.wav \
--ckpt 20
Это выводит встроенное/декодированное сообщение и битовую точность. Для полной
оценки набора атак, использованной в статье, см. eval/common_test.py ниже.
eval/common_test.py запускает полный набор атак (классическая обработка
сигналов, нейронные кодеки, шумоподавители, вокодеры) против обученного
чекпоинта и сообщает точность декодирования и достоверность (SI-SNR,
PESQ, STOI) для каждой атаки.
eval/tpr_eval.py калибрует порог обнаружения для каждой модели на основе
частоты ложноположительных срабатываний на чистом аудио и сообщает TPR при общем FPR;
eval/compare_tpr.py агрегирует результаты по экспериментам в
сравнительные таблицы статьи с проверкой значимости методом парного бутстрэпа.
scripts/plot_ablation_sweep.py, scripts/plot_fidelity_sweep.py,
scripts/visualize_mask.py и scripts/visualize_mask_zoom.py генерируют
рисунки статьи.
Если вы используете этот код, пожалуйста, цитируйте:
@article{chernin2026craw,
title={CRAW: Codec Robust Audio Watermarking},
author={Chernin, David and Fetaya, Ethan},
journal={arXiv preprint arXiv:2609.03107},
year={2026},
url={https://arxiv.org/abs/2609.03107}
}
Основано на TimbreWatermarking (NDSS 2024). Использует NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec и EnCodec для атак на кодек/шумоподавитель.