
Framework robusto di watermarking audio che incorpora messaggi binari negli spettrogrammi di magnitudine, con simulazione differenziabile degli attacchi, pooling Q-Former, mascheramento PESQ e codici di correzione degli errori per la resilienza contro attacchi codec e di elaborazione del segnale.
Codice sorgente per CRAW, un metodo di watermarking audio robusto basato sull'embedding nel dominio della magnitudine STFT. Un encoder incorpora un messaggio binario nello spettrogramma di magnitudine di una clip audio (la fase è preservata dal segnale pulito); un decoder recupera il messaggio sotto un'ampia gamma di attacchi di elaborazione del segnale, codec neurali, denoising e vocoder.
Questo repository è un fork di TimbreWatermarking (NDSS 2024), esteso con:
watermarking_model/ — tutto il codice del modello di watermarking:
architettura (model/), addestramento (train.py), simulazione degli attacchi
(distortions/, utils/distortions.py), valutazione
(eval/), e script di export/esperimenti (scripts/).Richiede Python 3.8.
Le dipendenze di terze parti incluse di seguito non sono raggruppate in questo repo. Sono necessarie solo specificamente per gli attacchi FACodec/denoiser/TiCodec — non per la verifica di base di embed/decode (vedi Inferenza di seguito). Se vuoi eseguire quegli attacchi, clona tu stesso i repository pubblici nei percorsi mostrati:
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
Le dipendenze Python per la pipeline principale di addestramento/valutazione sono elencate in
watermarking_model/requirements.txt.
Per il rendering degli attacchi codec (EnCodec, TiCodec), consigliamo un ambiente
conda separato per ciascun codec, poiché ognuno ha le proprie dipendenze — talvolta
in conflitto; consultare le istruzioni di configurazione nella docstring di ciascuno script
(codecs/encode_*.py).
L'addestramento e la valutazione utilizzano LibriSpeech (split train + test) e, per gli
esperimenti cross-domain zero-shot, LJSpeech. I percorsi dei dataset sono impostati nel
campo path.raw_path della configurazione di addestramento di ciascun esperimento
(watermarking_model/config/**/train_*.yaml) e tramite --audio_dir negli
script di eval/export — puntare questi alle proprie copie locali di
LibriSpeech e
LJSpeech.
cd watermarking_model
python3 train.py \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml
Questo addestra il modello completo (strato di distorsione robusto + Q-Former + ECC a ripetizione) — la configurazione utilizzata per i risultati principali di CRAW. Il training viene registrato su Weights & Biases nel progetto craw; imposta WANDB_ENTITY/accedi tramite wandb login per il tuo account prima.
Il training utilizza un seed casuale fisso (2022, impostato in train.py per random/numpy/torch/torch.cuda) per la riproducibilità.
Il mascheramento PESQ viene applicato in fase di export/inferenza, non durante il training — vedi scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Un checkpoint CRAW pre-addestrato (epoca 20, corrispondente ai risultati principali del paper) è incluso direttamente in questa submission — nessun download necessario — in watermarking_model/results/craw/ckpt/pth/ (config/craw/model.yaml's test.model_path punta qui).
Per incorporare un messaggio in un singolo file WAV e decodificarlo immediatamente (senza attacco applicato) come rapido controllo di sanità:
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
Questo stampa il messaggio incorporato/decodificato e l'accuratezza dei bit. Per la valutazione completa della suite di attacchi utilizzata nel paper, vedere eval/common_test.py di seguito.
eval/common_test.py esegue la suite completa di attacchi (elaborazione classica del segnale, codec neurali, denoiser, vocoder) contro un checkpoint addestrato e riporta l'accuratezza di decodifica e la fedeltà per ciascun attacco (SI-SNR, PESQ, STOI).
eval/tpr_eval.py calibra una soglia di rilevamento per modello a partire dai tassi di falsi positivi su audio pulito e riporta il TPR a un FPR condiviso; eval/compare_tpr.py aggrega i risultati tra gli esperimenti nelle tabelle comparative del paper con test di significatività paired-bootstrap. scripts/plot_ablation_sweep.py, scripts/plot_fidelity_sweep.py, scripts/visualize_mask.py e scripts/visualize_mask_zoom.py generano le figure del paper.
Se utilizzi questo codice, cita:
@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}
}
Basato su TimbreWatermarking (NDSS 2024). Utilizza NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec e EnCodec per gli attacchi codec/denoiser.