Codync
免費、開源的 1:1 替代方案,取代 Grok Bot 與 Muse。從 iPhone、Mac 或 Linux 桌面將 Claude Code、Codex、Cursor 與 40+ 程式碼代理人作為持續機器人傳訊。群組聊天、主題串…
AI 翻譯
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
🦜 Synthetic Voice Detection
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗One API. Every state-of-the-art synthetic voice detector.
Synthetic voice detection is a fragmented landscape — state-of-the-art models are scattered across research repositories, each with its own dependencies, input formats, and output conventions. Jabberjay brings them all under one consistent Python API and CLI so you can detect AI-generated speech without wrestling with model internals.
DetectionResult with label, confidence, and scores$ jabberjay interview.wav
Bonafide ✔️ (94.1% confidence, model=VIT)
$ jabberjay suspicious.wav -m HuBERT
Spoof ❌ (97.8% confidence, model=HuBERT)
pip install jabberjay
Requires Python ≥ 3.12. Models are downloaded from Hugging Face Hub on first use and cached locally.
from Jabberjay import Jabberjay
jj = Jabberjay()
result = jj.detect("audio.wav")
print(result) # Bonafide ✔️ (94.1% confidence, model=VIT)
print(result.label) # "Bonafide"
print(result.is_bonafide) # True
print(result.confidence) # 0.941
| Model | Dataset | Visualisation |
|---|---|---|
| MattyB95/VIT-ASVspoof2019-ConstantQ-Synthetic-Voice-Detection | ASVspoof2019 | ConstantQ |
| MattyB95/VIT-ASVspoof2019-Mel_Spectrogram-Synthetic-Voice-Detection | ASVspoof2019 | MelSpectrogram |
| MattyB95/VIT-ASVspoof2019-MFCC-Synthetic-Voice-Detection | ASVspoof2019 | MFCC |
| MattyB95/VIT-ASVspoof5-ConstantQ-Synthetic-Voice-Detection | ASVspoof5 | ConstantQ |
| MattyB95/VIT-ASVspoof5-Mel_Spectrogram-Synthetic-Voice-Detection | ASVspoof5 | MelSpectrogram |
| MattyB95/VIT-ASVspoof5-MFCC-Synthetic-Voice-Detection | ASVspoof5 | MFCC |
| MattyB95/VIT-VoxCelebSpoof-ConstantQ-Synthetic-Voice-Detection | VoxCelebSpoof | ConstantQ |
| MattyB95/VIT-VoxCelebSpoof-Mel_Spectrogram-Synthetic-Voice-Detection | VoxCelebSpoof | MelSpectrogram |
| MattyB95/VIT-VoxCelebSpoof-MFCC-Synthetic-Voice-Detection |
| Model | Dataset |
|---|---|
| MattyB95/AST-ASVspoof2019-Synthetic-Voice-Detection | ASVspoof2019 |
| MattyB95/AST-ASVspoof5-Synthetic-Voice-Detection | ASVspoof5 |
| MattyB95/AST-VoxCelebSpoof-Synthetic-Voice-Detection | VoxCelebSpoof |
| Model | Dataset |
|---|---|
| Gustking/wav2vec2-large-xlsr-deepfake-audio-classification | ASVspoof2019 |
| Model | Dataset |
|---|---|
| abhishtagatya/hubert-base-960h-itw-deepfake | In-The-Wild |
| Model | Dataset |
|---|---|
| DavidCombei/wavLM-base-Deepfake_V2 | Mixed |
| Model | Architecture |
|---|---|
| lab260/spectra_0 | Wav2Vec2-XLS-R-300M + ECAPA-TDNN |
| lab260/Spectra-AASIST | Wav2Vec2-XLS-R-300M + AASIST |
| lab260/Spectra-AASIST3 | Wav2Vec2-XLS-R-300M + KAN-AASIST |
| Model | Paper | Codebase |
|---|---|---|
| Classical | — | Built-in KNN baseline |
| RawNet2 | Tak et al., ICASSP 2021 | rawnet2-antispoofing |
usage: jabberjay [-h] [-m {AST,Classical,HuBERT,RawNet2,Spectra0,SpectraAASIST,SpectraAASIST3,VIT,Wav2Vec2,WavLM}]
[-d {ASVspoof2019,ASVspoof5,VoxCelebSpoof}]
[-vis {ConstantQ,MelSpectrogram,MFCC}] [-v]
audio
# Quickstart — VIT with ConstantQ on VoxCelebSpoof (defaults)
jabberjay audio.wav
# Self-contained models (no dataset or visualisation required)
jabberjay audio.wav -m Spectra0
jabberjay audio.wav -m SpectraAASIST
jabberjay audio.wav -m SpectraAASIST3
jabberjay audio.wav -m Wav2Vec2
jabberjay audio.wav -m HuBERT
jabberjay audio.wav -m WavLM
jabberjay audio.wav -m RawNet2
# AST with a specific dataset
jabberjay audio.wav -m AST -d ASVspoof2019
# VIT with full options
jabberjay audio.wav -m VIT -d ASVspoof5 -vis MelSpectrogram
# Verbose output
jabberjay audio.wav -v
All public names are importable from the top-level package:
from Jabberjay import Jabberjay, DetectionResult, Model, Dataset, Visualisation
String names and enum values are both accepted:
jj = Jabberjay()
# Self-contained models — no extra arguments needed
result = jj.detect("audio.wav", model="Spectra0")
result = jj.detect("audio.wav", model="SpectraAASIST")
result = jj.detect("audio.wav", model="SpectraAASIST3")
result = jj.detect("audio.wav", model="Wav2Vec2")
result = jj.detect("audio.wav", model="HuBERT")
result = jj.detect("audio.wav", model="WavLM")
result = jj.detect("audio.wav", model="RawNet2")
result = jj.detect("audio.wav", model="Classical")
# AST — requires a dataset
result = jj.detect("audio.wav", model="AST", dataset="VoxCelebSpoof")
# VIT — requires a dataset and a visualisation
result = jj.detect("audio.wav", model="VIT", dataset="ASVspoof5", visualisation="MFCC")
# Enums give IDE autocomplete and catch typos at import time
result = jj.detect(
"audio.wav",
model=Model.VIT,
dataset=Dataset.ASVspoof5,
visualisation=Visualisation.MFCC,
)
Every call to detect() returns a DetectionResult regardless of the model used:
| Attribute | Type | Description |
|---|---|---|
label | str | "Bonafide" or "Spoof" |
is_bonafide | bool | True if the audio is classified as genuine |
confidence | float | Confidence score for the top prediction (0.0–1.0) |
model | Model | The model that produced this result |
scores | list[dict] | None | Full label/score breakdown for VIT, AST, Spectra0, SpectraAASIST, SpectraAASIST3, Wav2Vec2, HuBERT, and WavLM (sorted highest-first); None for Classical and RawNet2 |
if result.is_bonafide:
print(f"Genuine voice detected with {result.confidence:.1%} confidence")
else:
print(f"Synthetic voice detected with {result.confidence:.1%} confidence")
# Full per-label scores
if result.scores:
for entry in result.scores:
print(f" {entry['label']}: {entry['score']:.3f}")
Use load() when running multiple models on the same clip to avoid re-reading the file. Each model is also cached in memory after its first detect() call, so calling it again later in the process reuses the already-loaded weights instead of reloading them:
audio = jj.load("audio.wav") # returns (samples, sample_rate)
results = [
jj.detect(audio, model="Wav2Vec2"),
jj.detect(audio, model="HuBERT"),
jj.detect(audio, model="VIT", dataset="VoxCelebSpoof", visualisation="ConstantQ"),
]
jj.list_models() # returns list[Model]
jj.list_datasets() # returns list[Dataset]
jj.list_visualisations() # returns list[Visualisation]
The examples/ directory contains focused, runnable scripts:
| Script | What it shows |
|---|---|
quickstart.py | Minimum viable usage |
choosing_a_model.py | Every model family, string and enum APIs |
preloading_audio.py | Efficient multi-model runs with jj.load() |
exploring_results.py | All DetectionResult fields and score breakdown |
run_all.py | Exhaustive sweep across every model combination |
just example # run quickstart
just run-example preloading_audio # run a specific example
just run-all # full sweep (slow — downloads all models)
git clone https://github.com/MattyB95/Jabberjay.git
cd Jabberjay
just install # install all dependencies including dev tools
| Command | Description |
|---|---|
just test | Run the test suite |
just check | Lint, format check, and type check |
just fix | Auto-fix lint issues and reformat |
just detect audio.wav | Run the CLI against a file |
just build | Build the package |
See just --list for all available commands.
Contributions are welcome — especially new models! See CONTRIBUTING.md for a full guide.
The quickest way to make an impact is to open a model request issue with a HuggingFace link and licence details.
If Jabberjay saves you time, consider supporting its development:
If you use Jabberjay in your research, please cite it. GitHub's "Cite this repository" button (in the sidebar) will generate APA or BibTeX automatically from the CITATION.cff file, or you can use the entry below directly:
@software{boakes_jabberjay_2026,
author = {Boakes, Matthew},
title = {Jabberjay},
year = {2026},
url = {https://github.com/MattyB95/Jabberjay},
version = {0.1.2},
doi = {10.5281/zenodo.19056977},
}
Archived versions are available on Zenodo. The concept DOI (10.5281/zenodo.19056977) always resolves to the latest release.
This work was supported, in whole or in part, by the Bill & Melinda Gates Foundation [INV-001309].
| VoxCelebSpoof |
| MFCC |