
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 fondée sur l'intégration dans le domaine de la magnitude STFT. Un encodeur intègre 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 sous une large gamme 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ériences (scripts/).Nécessite Python 3.8.
Les dépendances tierces intégrées ci-dessous ne sont pas incluses dans ce dépôt. Elles ne sont nécessaires que pour les attaques FACodec/denoiser/TiCodec spécifiquement — pas pour la vérification de base d'intégration/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 séparé par codec, car chacun a ses propres —
parfois conflictuelles — dépendances ; voir les instructions de configuration
dans le docstring de chaque script (codecs/encode_*.py).
L'entraînement et l'évaluation utilisent LibriSpeech (divisions 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 config
d'entraînement de chaque expérience
(watermarking_model/config/**/train_*.yaml) et via --audio_dir sur les
scripts d'évaluation/export — pointez-les 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 par répétition) — la configuration utilisée pour les principaux résultats
de CRAW. L'entraînement journalise dans Weights & Biases sous le projet
craw ; définissez WANDB_ENTITY/connectez-vous via wandb login avec
votre propre compte d'abord.
L'entraînement utilise une graine aléatoire fixe (2022, définie dans
train.py pour random/numpy/torch/torch.cuda) pour la
reproductibilité.
Le masquage PESQ est appliqué au moment de l'export/inférence, pas
pendant l'entraînement — voir
scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Un point de contrôle CRAW pré-entraîné (époque 20, correspondant aux
principaux résultats de l'article) est inclus directement dans cette
soumission — aucun téléchargement nécessaire — à
watermarking_model/results/craw/ckpt/pth/ (le test.model_path de
config/craw/model.yaml y pointe).
Pour intégrer un message dans un fichier WAV et le décoder immédiatement (aucune attaque appliquée) comme vérification rapide :
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 binaire. 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 du
signal classique, codecs neuronaux, débruitage, vocodeurs) contre un point
de contrôle entraîné et rapporte la précision de décodage par attaque et la
fidélité (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 partagé ;
eval/compare_tpr.py agrège les résultats entre expériences dans les
tableaux de comparaison de l'article avec des tests de significativité 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.
Construit sur TimbreWatermarking (NDSS 2024). Utilise NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec et EnCodec pour les attaques par codec/débruitage.