
Marco robusto de marcas de agua de audio que incrusta mensajes binarios en espectrogramas de magnitud, con simulación diferenciable de ataques, agrupación Q-Former, enmascaramiento PESQ y códigos de corrección de errores para resistir ataques de códec y procesamiento de señales.
Código fuente de CRAW, un método robusto de marca de agua de audio basado en la inserción en el dominio de magnitud de la STFT. Un codificador inserta un mensaje binario en el espectrograma de magnitud de un clip de audio (la fase se conserva de la señal limpia); un decodificador recupera el mensaje bajo una amplia gama de ataques de procesamiento de señal, códecs neuronales, eliminación de ruido y vocoders.
Este repositorio es un fork de TimbreWatermarking (NDSS 2024), ampliado con:
watermarking_model/ — todo el código del modelo de marca de agua:
arquitectura (model/), entrenamiento (train.py), simulación de ataques
(distortions/, utils/distortions.py), evaluación
(eval/) y scripts de exportación/experimentos (scripts/).Requiere Python 3.8.
Las dependencias de terceros incluidas a continuación no están empaquetadas en este repositorio. Solo son necesarias para los ataques FACodec/denoiser/TiCodec específicamente — no para la verificación básica de inserción/decodificación (véase Inferencia más abajo). Si deseas ejecutar esos ataques, clona tú mismo los repositorios públicos en las rutas mostradas:
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
Las dependencias de Python para el pipeline principal de entrenamiento/evaluación se enumeran en
watermarking_model/requirements.txt.
Para la renderización de ataques de códecs (EnCodec, TiCodec), recomendamos un entorno
conda separado por códec, ya que cada uno tiene sus propias dependencias —a veces
en conflicto—; consulta las instrucciones de configuración en el docstring de cada script
(codecs/encode_*.py).
El entrenamiento y la evaluación utilizan LibriSpeech (divisiones de entrenamiento + prueba) y, para los
experimentos de dominio cruzado zero-shot, LJSpeech. Las rutas de los conjuntos de datos se establecen en el
campo path.raw_path de la configuración de entrenamiento de cada experimento
(watermarking_model/config/**/train_*.yaml) y mediante --audio_dir en los
scripts de evaluación/exportación — apunta estos a tus propias copias locales de
LibriSpeech y
LJSpeech.
cd watermarking_model
python3 train.py \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml
Esto entrena el modelo completo (capa de distorsión robusta + Q-Former + ECC de repetición) — la configuración usada para los resultados principales de CRAW. El entrenamiento se registra en Weights & Biases bajo el proyecto craw; configura WANDB_ENTITY/inicia sesión mediante wandb login para tu propia cuenta primero.
El entrenamiento usa una semilla aleatoria fija (2022, establecida en train.py para random/numpy/torch/torch.cuda) para reproducibilidad.
El enmascaramiento PESQ se aplica en tiempo de exportación/inferencia, no durante el entrenamiento — consulta scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Un checkpoint de CRAW preentrenado (época 20, coincidiendo con los resultados principales del artículo) está incluido directamente en este envío — sin necesidad de descarga — en watermarking_model/results/craw/ckpt/pth/ (test.model_path de config/craw/model.yaml apunta aquí).
Para incrustar un mensaje en un archivo WAV y decodificarlo inmediatamente después (sin aplicar ningún ataque) como una comprobación rápida de sanidad:
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
Esto imprime el mensaje incrustado/decodificado y la precisión de bits. Para la evaluación completa del conjunto de ataques utilizada en el artículo, consulte eval/common_test.py a continuación.
eval/common_test.py ejecuta el conjunto completo de ataques (procesamiento clásico de señales, códecs neuronales, eliminadores de ruido, vocoders) contra un checkpoint entrenado y reporta la precisión de decodificación y la fidelidad (SI-SNR, PESQ, STOI) por ataque.
eval/tpr_eval.py calibra un umbral de detección por modelo a partir de las tasas de falsos positivos en audio limpio y reporta el TPR con un FPR compartido; eval/compare_tpr.py agrega los resultados entre experimentos en las tablas comparativas del artículo con pruebas de significancia de bootstrap emparejado. scripts/plot_ablation_sweep.py, scripts/plot_fidelity_sweep.py, scripts/visualize_mask.py y scripts/visualize_mask_zoom.py generan las figuras del artículo.
Si utiliza este código, por favor cite:
@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}
}
Basado en TimbreWatermarking (NDSS 2024). Utiliza NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec y EnCodec para los ataques de códec/denoiser.