Changelog
All notable changes to Jabberjay are documented here.
The format follows Keep a Changelog. Jabberjay follows PEP 440 versioning, aiming to remain compatible with Semantic Versioning where possible.
0.0.8.post2 — 2026-03-16
Fixed
- Zenodo concept DOI corrected again — updated to
10.5281/zenodo.19056977acrossCITATION.cff,README.md, and both changelogs
0.0.8.post1 — 2026-03-16
Fixed
- Zenodo DOI corrected — all references updated from
10.5281/zenodo.19056978to the correct concept DOI10.5281/zenodo.19056977acrossCITATION.cff,README.md, and both changelogs
0.0.8 — 2026-03-16
Added
- Zenodo integration — repository is now archived on Zenodo; concept DOI
(
10.5281/zenodo.19056977) added toCITATION.cff, README badge row, and BibTeX entry in the README citation section .zenodo.json— explicit Zenodo record metadata (creator ORCID, affiliation, keywords, related identifiers for PyPI and docs) so archived records are consistent and complete- Pre-commit hooks expanded — added
trailing-whitespace,end-of-file-fixer,check-merge-conflict,check-added-large-files,check-yaml,check-json,check-toml, anddetect-private-keyfrompre-commit-hooks; addedscripts/sync_version.pylocal hook to keepCITATION.cffand README BibTeX version in sync withpyproject.tomlautomatically on every commit
Fixed
RawNet2/run.py— YAML config loading now raises a descriptiveRuntimeErrorinstead of a rawOSError/YAMLErrorif the bundled config file is missing or malformedUtilities/label_normalizer.py— removed redundantfloat(str(...))double conversion; score is cast directly withfloat()
0.0.7 — 2026-03-16
Added
CITATION.cff— machine-readable citation metadata for academic use; GitHub surfaces this as a "Cite this repository" button; compatible with Zenodo, Zotero, and other reference managers- Sample rate validation —
detect()now raisesValueErrorimmediately for zero or negative sample rates when a pre-loaded audio tuple is passed, preventing silent failures in downstream model inference - Test coverage for new behaviour — 7 new tests covering sample rate
validation,
BytesIObuffer cleanup on both success and error paths, figure cleanup on error paths, andClassical.predict()bonafide/spoof paths
Changed
- Dependency minimum versions pinned — all runtime dependencies now carry
lower-bound constraints (
torch>=2.0,transformers>=4.30,huggingface-hub>=0.20,librosa>=0.10, etc.) to prevent silent incompatibilities on fresh installs - Contact and copyright updated — maintainer email changed to
Matthew.Boakes@Gmail.comacrossCODE_OF_CONDUCT.md,SECURITY.md, andpyproject.toml;LICENSEupdated to2024-2026 Matthew Boakes and The Alan Turing Institute CONTRIBUTING.mdmodel template corrected — examplerun.pynow usescast()+normalize_pipeline_scores()(matching real handlers) and the handler example uses_result_from_scores()instead of buildingDetectionResultmanually; label normaliser variable names corrected to_BONAFIDE_SUBSTR/_SPOOF_SUBSTR/_BONAFIDE_EXACT/_SPOOF_EXACT
Fixed
VIT/utility.py—BytesIObuffer is now always closed in thefinallyblock, preventing a resource leak ifImage.open()orimg.load()raisesClassical/run.py— renamedmodelvariable tomodel_pathto accurately reflect thatdownload_pretrained_model()returns a file path, not a model object_result_from_scores()— parameter type restored tolist[PredictionScore], keeping the type contract consistent end-to-end from model handlers through toDetectionResult.scores
0.0.6 — 2026-03-16
Added
- Documentation site — MkDocs + Material for MkDocs, hosted on GitHub Pages at
https://mattyb95.github.io/Jabberjay; includes Getting Started, Models, CLI, and API Reference pages (auto-generated from docstrings via mkdocstrings) - GitHub Release automation (
release.yml) — creates a tagged release with changelog notes automatically on every push tomain - CodeQL security scanning (
codeql.yml) — static analysis on push/PR and on a weekly schedule
Changed
- Updated GitHub Actions:
actions/checkoutv4→v6,astral-sh/setup-uvv5→v7,actions/upload-artifactv4→v7 (via Dependabot) - Dependabot PRs now target the
developbranch
0.0.5 — 2026-03-16
Added
- Wav2Vec2 model —
Gustking/wav2vec2-large-xlsr-deepfake-audio-classification(Wav2Vec2-XLSR-300M fine-tuned on ASVspoof2019, EER 4.01%) - HuBERT model —
abhishtagatya/hubert-base-960h-itw-deepfake(HuBERT-base fine-tuned on the In-The-Wild dataset, EER 1.43%) - WavLM model —
DavidCombei/wavLM-base-Deepfake_V2(WavLM-base fine-tuned on a mixed deepfake dataset) - Label normaliser (
Utilities/label_normalizer.py) — maps arbitrary external model labels ("real","fake","LABEL_0", etc.) to the canonical"Bonafide"/"Spoof"labels used throughout the API just publish-testcommand to publish a dev build to TestPyPI locallyjust versioncommand to print the current package version
Changed
- CI/CD pipeline consolidated — three separate workflow files
(
ruff.yml,python-package.yml,python-publish.yml) replaced by a singleci.ymlwith a clear lint → test → publish job graph - Push to
developnow automatically publishes a pre-release ({version}.dev{run_number}) to TestPyPI after CI passes - Push to
mainnow automatically publishes the release version to PyPI after CI passes (previously required a manual GitHub release) - Test matrix extended to Python 3.10–3.14
- Label normalisation now applied consistently across all transformer models
(AST, VIT, Wav2Vec2, HuBERT, WavLM) via shared
normalize_pipeline_scores() _result_from_scores()now sorts scores by confidence descending, guaranteeing the top prediction is always the highest-confidence label- All package sub-directories now include
__init__.pyfor reliable imports
Fixed
RawNet2/run.py: removedos.chdir()at module level — was mutating the working directory for the entire processlabel_normalizer: fixed unsafe substring matching for short digit strings ("0","1") that could produce false-positive label mappingsVIT/utility.py: callimg.load()afterImage.open()to force pixel data into memory before the buffer is released;plt.close()now runs in atry/finallyblockjabberjay.load(): raisesFileNotFoundErrorwith a clear message for missing files; wraps other librosa errors in a descriptiveValueErrorjabberjay.detect(): raisesValueErrorimmediately for empty audio arraysEnumAction: invalid CLI values now produce a clear error listing valid choices instead of a rawKeyErrorhugging_face.download_pretrained_model: added missing-> strreturn typeClassical/run.py: corrected return type fromtuple[object, float]totuple[int, float]
0.0.4 — 2024-08-15
Added
- ASVspoof5 variants for all ViT visualisation types (ConstantQ, MelSpectrogram, MFCC) — nine new HuggingFace models in total
- Updated GitHub Actions versions
0.0.3 — 2024-01-30
Added
- PyPI publish workflow (
python-publish.yml) for automated package releases
Changed
- Core dependencies added to
pyproject.toml
0.0.2 — 2024-01-30
Changed
- Dependencies pinned and added to package metadata
0.0.1 — 2023-09-06
Added
- Initial project setup and packaging (
pyproject.toml,setup.py) - Classical model — feature-based KNN classifier for bonafide/spoof detection
- RawNet2 model — end-to-end anti-spoofing via rawnet2-antispoofing with weights from ASVspoof 2021
- ViT models — Vision Transformer image classifiers over three audio visualisations (ConstantQ, MelSpectrogram, MFCC) trained on ASVspoof2019 and VoxCelebSpoof
- AST model — Audio Spectrogram Transformer classifier trained on ASVspoof2019 and VoxCelebSpoof
- HuggingFace Hub integration for automatic model weight retrieval
- Command-line interface (
jabberjay <audio>) - GitHub Actions CI workflow and ruff linting