How to use from the
Use from the
Transformers library
# Use a pipeline as a high-level helper
from transformers import pipeline

pipe = pipeline("feature-extraction", model="mlr2000/vocoder-small-watermark-detector", trust_remote_code=True)
# Load model directly
from transformers import AutoModel
model = AutoModel.from_pretrained("mlr2000/vocoder-small-watermark-detector", trust_remote_code=True, device_map="auto")
Quick Links

VocBulwark watermark detector

Standalone detector for the fixed 32-bit provenance watermark embedded by the companion VocBulwark vocoder. Given an audio clip, it extracts the watermark bits with the Cage extractor and compares them to the known fixed code, reporting how many bits match.

Self-contained: loads with trust_remote_code=True, no training repo required.

Companion Models

This detector is part of a set of 6 repositories:

Repo Role
mlr2000/vocoder-large Large vocoder
mlr2000/vocoder-large-watermark-detector Watermark detector for the large model
mlr2000/vocoder-large-speaker-encoder Speaker encoder for the large model
mlr2000/vocoder-small Small vocoder (generates the watermarked audio)
mlr2000/vocoder-small-watermark-detector Watermark detector (this repo)
mlr2000/vocoder-small-speaker-encoder Speaker encoder for the small model

Usage

import torchaudio
from transformers import AutoModel

det = AutoModel.from_pretrained("mlr2000/vocoder-small-watermark-detector", trust_remote_code=True).eval()

wav, sr = torchaudio.load("clip.wav")          # [C, T]
res = det.detect(wav, input_sample_rate=sr)    # resampled to 24 kHz internally
print(res)
# {'matches': 32, 'n_bits': 32, 'p_value': 8.9e-16}   # from our model

See example_roundtrip.ipynb in this repo for an end-to-end example (generate with the vocoder โ†’ detect here).

How detection works

detect() returns a dict with:

  • matches: how many of the 32 extracted bits equal the fixed code.
  • n_bits: 32.
  • p_value: the probability an unrelated clip matches at least this well under Binomial(32, 0.5).

A clip generated by our vocoder matches all 32 bits (p_value ~ 0); an unrelated clip matches about half of them (p_value ~ 1). There is no built-in yes/no threshold โ€” read matches / p_value and pick whatever operating point you need. Requiring all 32 bits gives an astronomically small false-positive rate; allowing a few mismatches trades that for robustness to lossy channels.

Notes

  • Detection runs on 24 kHz mono. Other inputs are resampled when you pass input_sample_rate, and multi-channel audio is downmixed to mono.
  • This detector is paired with mlr2000/vocoder-small. It will not correctly verify audio generated by the large vocoder (mlr2000/vocoder-large), which uses a different fixed 50-bit watermark.
  • A fixed public watermark is for attribution ("did our model make this"), not a secret mark.
  • Not intended for surveillance or any use that violates the privacy of individuals.

Citation

If you use this model, please cite:

@misc{muletta2026,
  title  = {Training a Discriminator-Free Foundation Vocoder 
             with Integrated Audio Watermarking},
  author = {Muletta, Romolo and Deriu, Jan},
  year   = {2026},
  note   = {VT2 Project Report, ZHAW School of Engineering}
}

License

cc-by-4.0. Trained on MLS (CC-BY-4.0) and Common Voice (CC0). Builds on BigVGAN (MIT) and wav2vec 2.0 (Apache-2.0). Please retain attribution when redistributing or building on this model.

Downloads last month
4
Safetensors
Model size
650k params
Tensor type
F32
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support