beat-this-GGUF / README.md
cstr's picture
Add files using upload-large-folder tool
aa82ae3 verified
|
Raw
History Blame Contribute Delete
3.97 kB
---
license: mit
library_name: crispasr
tags:
- beat-tracking
- downbeat-tracking
- music-information-retrieval
- gguf
- ggml
base_model: CPJKU/beat_this
pipeline_tag: audio-classification
---
# Beat This! — GGUF
GGUF conversions of **[Beat This!](https://github.com/CPJKU/beat_this)** (Foscarin,
Schlüter & Widmer, CPJKU — ISMIR 2024), a transformer beat and downbeat tracker,
for use with [CrispASR](https://github.com/CrispStrobe/CrispASR) / ggml.
Checkpoint: `final0` (trained on all datasets except GTZAN, seed 0).
## Why this model
Nearly every published beat tracker post-processes its framewise output with
**madmom's Dynamic Bayesian Network**, which is Böck-patented and licensed for
non-commercial use only. Beat This! reaches state-of-the-art **without** one —
its postprocessing is plain peak-picking, and its dependency list
(numpy / torch / torchaudio / einops / rotary-embedding-torch / soxr) contains
no part of madmom.
Both the upstream code and the published weights are **MIT**. That combination —
SOTA accuracy, no DBN, MIT weights — is why this is usable in a commercial
product where most beat trackers are not.
## Files
| file | size | notes |
|---|---|---|
| `beat-this-f16.gguf` | 41 MB | **default.** Recommended for all normal use. |
| `beat-this-f32.gguf` | 81 MB | Reference build for exact-parity debugging. |
20.25 M parameters, 147 tensors. Both files bake in the `[513, 128]` mel
filterbank the model was exported with, so the front end never re-derives it
(slaney-vs-htk and the freq/mel layout are classic silent-drift sources).
## Verification
Ported stage by stage against a PyTorch reference driven by the original
checkpoint, comparing every sub-block rather than only the final output.
At **f32**, every stage is numerically exact:
| stage | cos | max rel err |
|---|---|---|
| `stem` | 1.00000000 | 3.0e-7 |
| `blk0_partial` | 1.00000000 | 3.0e-7 |
| `blk2` | 1.00000000 | 9.5e-7 |
| `linear` | 1.00000000 | 1.3e-6 |
| `transformer` | 1.00000000 | 9.3e-7 |
| `out_beat` / `out_downbeat` | 1.00000000 | 2.7e-6 / 1.4e-6 |
At **f16** the same stages score cos ≥ 0.99999973 with max rel err ~5e-4, flat
across all 12 attention/FF sub-blocks rather than compounding — i.e. the residual
is weight quantisation, not drift. The log-mel front end matches torchaudio at
cos = 1.00000000.
Windowing (1500-frame chunks, 6-frame border, `keep_first` overlap) and the
peak-picking postprocessor reproduce upstream exactly: on a 45 s two-chunk
fixture, running the reference's own logits through the ported peak-picker gives
identical beat and downbeat times to 1e-6 s.
## Usage
```bash
# one line per beat: time_sec <TAB> beat|downbeat
crispasr --beats -m beat-this-f16.gguf -f song.wav
# JSON, including a median-interval tempo estimate
crispasr --beats -m beat-this-f16.gguf --beats-format json -f song.wav
```
Input is decoded to the model's native 22.05 kHz mono automatically, and long
files are chunked internally.
**Every downbeat is also reported as a beat.** The postprocessor snaps each
downbeat onto its nearest detected beat, so downbeats are a strict subset and
you never have to merge two lists to reconstruct the grid.
## Licence and provenance
Code and weights are **MIT**, per upstream. Note that upstream's own README
records that some of the *training* audio is copyrighted or under restrictive
Creative Commons terms; the licence on the released weights is unambiguous, but
the provenance of the training corpus is a separate question that upstream, not
this conversion, is the authority on.
## Citation
```bibtex
@inproceedings{foscarin2024beatthis,
title = {Beat this! Accurate beat tracking without DBN postprocessing},
author = {Foscarin, Francesco and Schl{\"u}ter, Jan and Widmer, Gerhard},
booktitle = {Proceedings of the 25th International Society for
Music Information Retrieval Conference (ISMIR)},
year = {2024}
}
```