transkun-onnx / README.md
lawls's picture
v2.0.0 β€” Transkun transformer-only ONNX export + decode spec (from audio-claudio)
b445981 verified
|
Raw
History Blame Contribute Delete
3.16 kB
---
license: mit
library_name: onnxruntime
tags:
- audio
- music
- piano-transcription
- amt
- onnx
- transkun
- semi-crf
pipeline_tag: audio-to-audio
---
# Transkun β€” transformer-only ONNX export + decode spec
A **self-contained ONNX export of [Transkun](https://github.com/Yujia-Yan/Skipping-The-Frame-Level)**
(Yujia Yan's Neural Semi-CRF piano transcriber, 0.984 MAESTRO note F1) that runs the full model **in-process
with no Python/PyTorch at runtime**. This is **not** a drop-in `.onnx` transcriber: `torch.fft.rfft` and the
custom semi-CRF backtracking are not ONNX-exportable, so the mel front end and the Viterbi decode are provided
as a **documented decode spec** + a **reference decoder**.
> **Attribution.** The model, weights and architecture are the work of **Yujia Yan, Frank Cwitkowitz and
> Zhiyao Duan** (*"Skipping the Frame-Level: Event-Based Piano Transcription with Neural Semi-CRFs"*, NeurIPS
> 2021). This is an independent export + decode spec, not affiliated with or endorsed by the authors. Upstream:
> <https://github.com/Yujia-Yan/Skipping-The-Frame-Level>. License: **MIT** (Β© 2021 Yujia Yan).
## What's in the package
| File | Role |
|---|---|
| `transkun.onnx` (~53 MB, opset 17) | `featuresBatch [1,T,229,6] β†’ (S [T,T,90], ctx [90,T,256])` β€” the transformer + semi-CRF scorer + backbone features |
| `transkun-heads.onnx` (~3.4 MB) | `attr [N,768] β†’ (velLogits [N,128], ofRaw [N,4])` β€” velocity + sub-frame onset/offset heads |
| `freq2mels.f32 [2049,229]`, `windows.f32 [6,4096]`, `symbols.i32 [90]`, `params.json` | frozen front-end constants |
| `LICENSE.transkun` | upstream MIT license |
| `export_transkun.py`, `export_transkun_heads.py` | regeneration scripts (need the `transkun` PyTorch package) |
The **decode spec** (`DECODE_SPEC.md`) documents the mel front end, the `S` layout, the 90-track
symbol map (`[-64, -67, 21..108]` = sustain/soft pedal + MIDI 21–108), the semi-CRF `viterbiBackward`, the
16 s/8 s segment stitching, and the attribute heads (velocity = argmax; `ofValue` = ContinuousBernoulli mean).
## Reference decoder + validation
The reference decoder is the C# implementation in **[audio-claudio](https://github.com/TuesdayCrowd/audio-claudio)**
(mel front end, `SemiCrfViterbi`, `TranskunTranscriber`). It is validated **note-identical to the native
`transkun` CLI (PyTorch)**: on the test clips it reaches **100% note-level F1 at Β±25 ms** with **exact
velocity** on every note β€” the export + decode spec reproduce the reference implementation, not merely
approximate it.
## Pipeline (how to run)
```
audio (mono, 44.1 kHz)
β†’ mel front end (framing 4096/1024, 6 windows, rfft ortho, freq2mels, log-norm) β†’ featuresBatch
β†’ transkun.onnx β†’ (S, ctx)
β†’ semi-CRF viterbiBackward(S) β†’ per-track note intervals, over 16 s/8 s stitched segments
β†’ gather ctx at interval endpoints β†’ transkun-heads.onnx β†’ velocity + sub-frame onset/offset
β†’ notes (+ sustain/soft pedal from tracks 0/1)
```
See the repo's decode spec and `TranskunTranscriber` for the exact arithmetic (segment padding, `forcedStartPos`
carry, merge, `resolveOverlapping`).