--- language: - en - zh - multilingual tags: - audio - speech - antispoofing - deepfake-detection - source-tracing - audio-language-model license: cc-by-nc-4.0 pipeline_tag: audio-text-to-text base_model: - openbmb/MiniCPM5-2B - Qwen/Qwen3-ASR-1.7B datasets: - mueller91/MLAAD - jungjee/spoofceleb - CodecFake/CodecFake_Plus_Dataset - isjwdu/DFADD - openslr/librispeech_asr - speechcolab/gigaspeech - AISHELL/AISHELL-3 ---
**VeriSpoof-Plus** is an open-weight audio language model for speech deepfake forensics. From a single recording it decides whether the speech is genuine or spoofed, names the system that generated it,
tells whether a second recording comes from the same generator, acoustic model or vocoder, and recognizes the noise,
reverberation and codec of the channel. It explains every decision in short lines that can each be checked against
the audio, and its 2.9 B parameters run on a single 12 GB GPU.
It is the best open-weight detector on both [Speech-DF-Arena](https://huggingface.co/spaces/Speech-Arena-2025/Speech-DF-Arena)
(2.14% pooled EER over 14 test sets, #3 of 28 systems) and [SpoofRadar v1.0](https://tefficlabs.com/spoofradar) (4.04% over
16 test sets). It localizes synthesized spans at 0.16 s resolution, accepts recordings at any sample rate, and with vLLM
reasons over a batch at 0.05 s per recording.

## News
- **2026-11-04** · VeriSpoof-Plus released, with the [demo](https://huggingface.co/spaces/AustinXiao/VeriSpoof-demo),
the [benchmark](https://huggingface.co/datasets/AustinXiao/VeriSpoof-Bench) and a two-minute film.
- **2026-11-04** · 🥇🏆 **#1 open-weight on SpoofRadar v1.0**: pooled EER 4.04% over 16 test sets; the next open-weight
system is at 9.96%.
- **2026-10-31** · 🥇🏆 **#1 open-weight on Speech-DF-Arena**: pooled EER 2.14% over 14 test sets, **#3 of 28 systems**
overall, behind two proprietary systems (public snapshot of 31 Oct 2026).
- **2026-10-31** · [VeriSpoof-Base](https://huggingface.co/AustinXiao/VeriSpoof-Base) released.
## Highlights
- **Best open-weight deepfake detector.** First among open-weight systems on both Speech-DF-Arena (2.14% pooled EER,
third of 28 overall) and SpoofRadar v1.0 (4.04%), with less than half the error of the next open-weight system on
each board.
- **One model, five forensic questions.** The same weights detect spoofed speech, identify the generator (96.8% on
MLAAD), verify whether two recordings come from the same system (6.17% EER on generators never seen in training),
and recognize noise, reverberation and codec (81.3%). Every answer is the model's own text answer, scored; there are
no task-specific heads.
- **Evidence you can check.** The reasoning states bandwidth, noise level, the synthesized span and a decision, each
line checkable against the audio. The decision follows the evidence: invert the stated span and the decision flips,
in 100% of tests, also with wording never seen in training.
- **Catches partial fakes.** With reasoning, 99.6% of partially edited recordings in PartialEdit and 97.6% in HAD are
caught.
## The film
*1:59, Chinese and English captions. All voices in the film are synthetic (Fish Audio), including Yang Xiao’s. Music “78 PULSE” by kjartan_abel (CC BY 4.0); sound effects “2 Impact Wet” by original_sound (CC BY 3.0) and “data corrupted” by Saltbearer (CC BY 4.0), the rest CC0, via Openverse and Freesound; recordings from PartialEdit (CC BY 4.0) and MLAAD (CC BY-NC 4.0). Every model output shown is a real VeriSpoof output on that clip. The character is AI-generated art.*
## Base or Plus?
| | **VeriSpoof-Plus** (this model) | [VeriSpoof-Base](https://huggingface.co/AustinXiao/VeriSpoof-Base) |
|---|---|---|
| Speech-DF-Arena, 14 sets: pooled / mean EER | **2.14 / 1.79%** (#3 of 28) | 4.43 / 4.28% (#4 of 28) |
| SpoofRadar v1.0, 16 sets: pooled / mean EER | **4.04 / 1.65%** | 4.23 / 3.76% |
| Same-generator EER, MLAAD unseen models / unseen architectures | **6.17 / 15.00%** | 13.80 / 20.25% |
| Generator identification (MLAAD) / recording condition | **96.8 / 81.3%** | 95.4 / 75.9% |
| Training data | ≈ 4.4 M utterances | official training splits only, ≈ 0.38 M utterances |
**Use Plus** for the best detection and source verification. **Use Base** for controlled comparisons with models
trained on official training splits only. Training data and recipe: see the
[technical report](https://arxiv.org/abs/2611.04634).
## Model at a glance
| | |
|---|---|
| Parameters | 2.9 B: audio encoder from Qwen3-ASR-1.7B, language model MiniCPM5-2B |
| Input | a speech recording at any sample rate (resampled to 16 kHz) |
| Output | an answer with its score; reasoning lines; a per-token synthetic-speech probability (every 0.16 s) |
| Tasks | detection, generator identification, source verification, recording condition, grounded reasoning |
| Hardware | one CUDA GPU with about 12 GB |
## Quick start
```bash
hf download AustinXiao/VeriSpoof-Plus --include "code/*" --local-dir verispoof
pip install ./verispoof/code
```
```python
from verispoof import VeriSpoof
model = VeriSpoof.from_pretrained("AustinXiao/VeriSpoof-Plus") # weights are downloaded on first use
# Detection. score = log p(spoof answer) - log p(bona fide answer); label uses threshold 0
model.detect("sample.wav") # {'label': 'spoof', 'score': ...}
model.detect(["a.wav", "b.flac"], batch_size=16) # a list in, a list out; arrays need sr=...
# Grounded reasoning, plus the per-token head (probability that each 0.16 s token is synthesized)
r = model.explain("sample.wav")
print(r["text"]) # OBSERVATIONS / CHANNEL_STATUS / LOCALIZATION / SOURCE_PROFILE / DECISION lines
r["decision"], r["spans"], r["token_prob"]
# Source verification of two spoofed recordings: generator, acoustic_model or vocoder
model.same_source("a.wav", "b.wav", level="generator") # {'same': ..., 'score': log p(yes) - log p(no)}
model.compare("a.wav", "b.wav") # source-verification reasoning
# Closed questions
model.condition("sample.wav", attr="codec") # also "noise", "reverb"
model.generator("sample.wav", ["XTTS-v2", "Bark", "VITS"]) # candidate systems you supply
```
A probability instead of a score: P(spoof) = sigmoid(0.930 · score − 0.872), calibrated on development data (as in the demo).
### Faster reasoning with vLLM
```bash
pip install "./verispoof/code[vllm]"
```
```python
from verispoof.vllm_backend import VeriSpoofVLLM
if __name__ == "__main__": # vLLM starts its engine in a separate process
m = VeriSpoofVLLM.from_pretrained("AustinXiao/VeriSpoof-Plus")
results = m.explain(["a.wav", "b.wav", "c.wav"]) # batched
pairs = m.compare([("a.wav", "b.wav"), ("c.wav", "d.wav")])
```
| Reasoning, one A100 | per recording | speed-up |
|---|---:|---:|
| `VeriSpoof.explain`, one at a time | 2.24 s | 1× |
| `VeriSpoofVLLM.explain`, one at a time | 0.50 s | 4.5× |
| `VeriSpoofVLLM.explain`, batch of 64 | 0.05 s | 46× |
Detection scores and the per-token head use `VeriSpoof`. If vLLM fails to load a FlashInfer sampling kernel, set
`VLLM_USE_FLASHINFER_SAMPLER=0`.
## Results
### Speech-DF-Arena leaderboard
Public snapshot of 31 Oct 2026, ordered by pooled EER as on the board; every line of the official protocols
([speech_df_arena](https://github.com/Speech-Arena/speech_df_arena), commit 97a4445) is scored.
| System | Availability | Params | Average EER | Pooled EER |
|---|---|---:|---:|---:|
| Modulate VELMA-2 | Proprietary | 0.3 B | 1.10 | 1.59 |
| Resemble Detect-3B-Omni | Proprietary | 3 B | 2.60 | 2.10 |
| 🥇 **VeriSpoof-Plus (this model)** | **Open-weight** | **2.9 B** | **1.79** | **2.14** |
| Hiya Authenticity Verification | Proprietary | 1 B | 2.11 | 2.32 |
| 🥈 VeriSpoof-Base | Open-weight | 2.9 B | 4.28 | 4.43 |
| DLMSL SpeakSure | Proprietary | 0.7 B | 3.80 | 6.14 |
| Whispeak | Proprietary | 0.1 B | 3.05 | 8.06 |
| DF Arena 1B | Open-weight | 1 B | 5.66 | 9.52 |
| XLS-R + SLS | Open-weight | 0.3 B | 14.01 | 16.08 |
Average = mean of the 14 set EERs. Each VeriSpoof model is ranked on its own (Plus third of 28, Base fourth of 28).