
Framework robuste de tatouage audio intégrant des messages binaires dans des spectrogrammes d’amplitude, avec simulation d’attaques différentiables, pooling Q-Former, masquage PESQ et codes correcteurs d’erreurs pour une résilience face aux attaques de codec et de traitement du signal.
Code source de CRAW, une méthode de tatouage audio robuste reposant sur l'insertion dans le domaine de la magnitude STFT. Un encodeur insère un message binaire dans le spectrogramme de magnitude d'un clip audio (la phase est préservée à partir du signal propre) ; un décodeur récupère le message face à un large éventail d'attaques de traitement du signal, de codecs neuronaux, de débruitage et de vocodeurs.
Ce dépôt est un fork de TimbreWatermarking (NDSS 2024), étendu avec :
watermarking_model/ — tout le code du modèle de
tatouage : architecture (model/), entraînement (train.py), simulation
d'attaques (distortions/, utils/distortions.py), évaluation (eval/),
et scripts d'export/expérimentation (scripts/).Nécessite Python 3.8.
Les dépendances tierces intégrées ci-dessous ne sont pas fournies dans ce dépôt. Elles ne sont nécessaires que pour les attaques FACodec/débruitage/TiCodec spécifiquement — pas pour la vérification de base de l'insertion/décodage (voir Inférence ci-dessous). Si vous souhaitez exécuter ces attaques, clonez vous-même les dépôts publics dans les chemins indiqués :
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
Les dépendances Python pour le pipeline principal d'entraînement/évaluation sont listées dans
watermarking_model/requirements.txt.
Pour le rendu des attaques par codec (EnCodec, TiCodec), nous recommandons un environnement
conda distinct par codec, car chacun possède ses propres dépendances — parfois
en conflit ; consultez les instructions d'installation dans la docstring de chaque script
(codecs/encode_*.py).
L'entraînement et l'évaluation utilisent LibriSpeech (splits train + test) et, pour les
expériences cross-domain zero-shot, LJSpeech. Les chemins des jeux de données sont définis dans
le champ path.raw_path de la configuration d'entraînement de chaque expérience
(watermarking_model/config/**/train_*.yaml) et via --audio_dir sur les
scripts d'évaluation/export — pointez ces chemins vers vos propres copies locales de
LibriSpeech et
LJSpeech.
cd watermarking_model
python3 train.py \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml
Cela entraîne le modèle complet (couche de distorsion robuste + Q-Former + ECC de répétition) — la configuration utilisée pour les résultats principaux de CRAW. L'entraînement est journalisé dans Weights & Biases sous le projet craw ; définissez WANDB_ENTITY/connectez-vous via wandb login pour votre propre compte au préalable.
L'entraînement utilise une graine aléatoire fixe (2022, définie dans train.py pour random/numpy/torch/torch.cuda) à des fins de reproductibilité.
Le masquage PESQ est appliqué au moment de l'export/inférence, et non pendant l'entraînement — voir scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Un checkpoint CRAW pré-entraîné (époque 20, correspondant aux résultats principaux de l'article) est fourni directement dans cette soumission — aucun téléchargement nécessaire — à l'emplacement watermarking_model/results/craw/ckpt/pth/ (test.model_path de config/craw/model.yaml pointe ici).
Pour intégrer un message dans un fichier WAV et le décoder immédiatement (aucune attaque appliquée) comme vérification rapide de bon fonctionnement :
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
Cela affiche le message intégré/décodé et la précision des bits. Pour l'évaluation complète de la suite d'attaques utilisée dans l'article, voir eval/common_test.py ci-dessous.
eval/common_test.py exécute la suite d'attaques complète (traitement classique du signal, codecs neuronaux, débruiteurs, vocodeurs) sur un point de contrôle entraîné et rapporte la précision de décodage et la fidélité par attaque (SI-SNR, PESQ, STOI).
eval/tpr_eval.py calibre un seuil de détection par modèle à partir des taux de faux positifs sur audio propre et rapporte le TPR à un FPR commun ; eval/compare_tpr.py agrège les résultats entre les expériences dans les tableaux de comparaison de l'article avec un test de signification par bootstrap apparié. scripts/plot_ablation_sweep.py, scripts/plot_fidelity_sweep.py, scripts/visualize_mask.py et scripts/visualize_mask_zoom.py génèrent les figures de l'article.
Si vous utilisez ce code, veuillez citer :
@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}
}
Basé sur TimbreWatermarking (NDSS 2024). Utilise NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec et EnCodec pour les attaques par codec/débruiteur.