
Надёжный фреймворк для аудио-водяных знаков, встраивающий бинарные сообщения в амплитудные спектрограммы, с дифференцируемым моделированием атак, пулингом Q-Former, маскированием PESQ и кодами с исправлением ошибок для устойчивости к атакам кодеков и обработки сигналов.
Исходный код CRAW — устойчивого метода аудио-водяных знаков, основанного на внедрении в STFT-магнитудную область. Кодировщик внедряет бинарное сообщение в магнитудную спектрограмму аудиоклипа (фаза сохраняется из чистого сигнала); декодер восстанавливает сообщение при широком спектре атак, связанных с обработкой сигнала, нейрокодеками, шумоподавлением и вокодерами.
Этот репозиторий является форком TimbreWatermarking (NDSS 2024), расширенным следующими возможностями:
watermarking_model/ — весь код модели водяных знаков:
архитектура (model/), обучение (train.py), симуляция
атак (distortions/, utils/distortions.py), оценка
(eval/) и скрипты экспорта/экспериментов (scripts/).Требуется Python 3.8.
Перечисленные ниже сторонние зависимости не включены в этот репозиторий. Они нужны только для конкретных атак FACodec/denoiser/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 — LJSpeech. Пути к наборам данных задаются в
поле path.raw_path конфигурации обучения каждого эксперимента
(watermarking_model/config/**/train_*.yaml), а также через --audio_dir в
скриптах оценки/экспорта — укажите здесь пути к вашим локальным копиям
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 генерируют
рисунки статьи.
Основано на TimbreWatermarking (NDSS 2024). Используются NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec и EnCodec для атак кодеков/шумоподавителей.