
Código-fonte do CRAW, um método robusto de marca d'água em áudio construído sobre incorporação no domínio da magnitude STFT. Um codificador incorpora uma mensagem binária no espectrograma de magnitude de um clipe de áudio (a fase é preservada do sinal limpo); um decodificador recupera a mensagem sob uma ampla gama de ataques de processamento de sinal, codec neural, remoção de ruído e vocoder.
Este repositório é um fork do TimbreWatermarking (NDSS 2024), estendido com:
watermarking_model/ — todo o código do modelo de marca d'água:
arquitetura (model/), treinamento (train.py), simulação de
ataque (distortions/, utils/distortions.py), avaliação
(eval/) e scripts de exportação/experimentos (scripts/).Requer Python 3.8.
As dependências de terceiros incorporadas abaixo não estão incluídas neste repositório. Elas são necessárias apenas para os ataques específicos de FACodec/denoiser/TiCodec — não para a verificação básica de incorporação/decodificação (consulte Inferência abaixo). Se você quiser executar esses ataques, clone os repositórios públicos você mesmo nos caminhos mostrados:
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
As dependências Python para o pipeline principal de treinamento/avaliação estão listadas em
watermarking_model/requirements.txt.
Para a renderização de ataques de codec (EnCodec, TiCodec), recomendamos um ambiente
conda separado por codec, pois cada um tem suas próprias — às vezes
conflitantes — dependências; consulte as instruções de configuração no
docstring de cada script (codecs/encode_*.py).
O treinamento e a avaliação usam LibriSpeech (divisões de treino + teste) e, para os
experimentos de domínio cruzado zero-shot, LJSpeech. Os caminhos dos conjuntos de dados são definidos no
campo path.raw_path da configuração de treino de cada experimento
(watermarking_model/config/**/train_*.yaml) e via --audio_dir nos
scripts de avaliação/exportação — aponte-os para suas próprias cópias locais de
LibriSpeech e
LJSpeech.
cd watermarking_model
python3 train.py \
-p config/process.yaml \
-m config/craw/model.yaml \
-t config/craw/train.yaml
Isso treina o modelo completo (camada de distorção robusta + Q-Former + ECC de
repetição) — a configuração usada para os principais resultados do CRAW. O treinamento registra em
Weights & Biases sob o projeto craw; defina
WANDB_ENTITY/faça login via wandb login para sua própria conta primeiro.
O treinamento usa uma semente aleatória fixa (2022, definida em train.py
para random/numpy/torch/torch.cuda) para reprodutibilidade.
O mascaramento PESQ é aplicado no momento de exportação/inferência, não durante
o treinamento — consulte scripts/export_watermarked_dynamic.py --grad_mode spect_ft.
Um checkpoint CRAW pré-treinado (época 20, correspondendo aos principais resultados do artigo) está
incluído diretamente nesta submissão — sem necessidade de download — em
watermarking_model/results/craw/ckpt/pth/ (o test.model_path de config/craw/model.yaml
aponta para este local).
Para incorporar uma mensagem em um arquivo WAV e decodificá-la imediatamente (sem ataque aplicado) como uma verificação rápida de sanidade:
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
Isso imprime a mensagem incorporada/decodificada e a precisão de bits. Para a avaliação
completa da suíte de ataques usada no artigo, consulte eval/common_test.py abaixo.
eval/common_test.py executa a suíte completa de ataques (processamento de sinal
clássico, codecs neurais, removedores de ruído, vocoders) contra um
checkpoint treinado e relata a precisão de decodificação por ataque e a fidelidade (SI-SNR,
PESQ, STOI).
eval/tpr_eval.py calibra um limiar de detecção por modelo a partir de
taxas de falso positivo de áudio limpo e relata TPR em um FPR compartilhado;
eval/compare_tpr.py agrega resultados entre experimentos nas
tabelas de comparação do artigo com teste de significância bootstrap pareado.
scripts/plot_ablation_sweep.py, scripts/plot_fidelity_sweep.py,
scripts/visualize_mask.py e scripts/visualize_mask_zoom.py geram
as figuras do artigo.
Construído sobre TimbreWatermarking (NDSS 2024). Usa NaturalSpeech3 FACodec, ClearerVoice-Studio, TiCodec e EnCodec para ataques de codec/removedor de ruído.