cstr/tiron-GGML
tiron — multi-speaker meeting ASR (GGML for CrispASR)
GGML conversions of **`Trelis/tiron`** (Apache-2.0) — a Whisper large-v3 model fine-tuned to transcribe multi-speaker meetings and emit inline `<|speakerN|>` speaker markers, so a single forward pass produces both the words and who said them.
These files run on **CrispASR**, whose whisper backend implements tiron's speaker-vocabulary detection, constrained decode, windowing, and cross-window speaker linking. They will not work with stock `whisper.cpp` — the speaker-token grammar and diarization are CrispASR-specific.
Files
Legacy GGML .bin (whisper format), quantized with CrispASR's crispasr-legacy-quantize. tiron-q4_k.bin is the registry default (crispasr --backend tiron -m auto auto-downloads it).
What it is
A drop-in WhisperForConditionalGeneration — Whisper large-v3 (128-mel, 32 encoder + 32 decoder layers, 1280-d) with an extended 51904-token vocabulary: <|speaker1|>…<|speaker8|> (ids 51866–51873) plus <|nospeech|>. Speaker indices are window-local (the first talker in each 30 s window is always <|speaker1|>), so "speaker1" in one window is not necessarily the same person as "speaker1" in another — see Diarization below.
Usage (CrispASR)
Auto-download the default (q4_k) and transcribe with inline speaker markers:
crispasr --backend tiron -m auto -f meeting.wavOr point at a local file:
crispasr --backend tiron -m tiron-q4_k.bin -f meeting.wavAdd meeting-level speaker labels (SPEAKER_00, SPEAKER_01, …) by turning on diarization, which clusters voiceprints across windows:
crispasr --backend tiron -m tiron-q4_k.bin -f meeting.wav --diarizeHow it works
- Constrained decode. Not plain greedy (which loses ~5 cpWER) — a port of the upstream harness's grammar: step 0 forces
<|speaker1|>/<|nospeech|>; a speaker tag forces an opening timestamp; text runs to a closing timestamp; a closing timestamp then allows EOS, another opening timestamp (same speaker continues), or the next speaker slot.no_repeat_ngram_size=15. Per-speaker timelines are non-monotonic, so whisper's "timestamps must increase" seek rule is disabled for the speaker vocabulary. - Windowing. A 0.75 s onset pad, fixed non-overlapping 30 s windows, and an RMS silent-window gate — driven exactly as the reference
engine.py. - Diarization (`--diarize`). CrispASR promotes the window-local indices to stable meeting-level
SPEAKER_NNidentities by clustering per-(window, local-speaker)voiceprints (TitaNet / ECAPA embeddings + agglomerative cosine), with a within-window must-link "spine". This is speaker diarization — grouping speakers within a recording — not identification against any external roster or database.
Validation
The CrispASR C++ decode was validated byte-exact against the Python reference (tools/reference_backends/tiron.py) on the F16 model — identical token streams per window — and the q4_k output matches at 1.000 decoded-word overlap.
Attribution & license
- Base model: `Trelis/tiron` — Apache-2.0.
- Reference harness: `TrelisResearch/tiron` — Apache-2.0.
- This conversion: Apache-2.0. These are quantized GGML re-encodings of the Trelis weights for the whisper.cpp/CrispASR runtime; all credit for the model goes to Trelis Research. See the base model card for training data and details.
Limitations
- English meeting audio; up to 8 concurrent speaker slots per 30 s window.
- Requires a CrispASR build with tiron decode support; incompatible with stock whisper.cpp.
- Window-local speaker indices are only promoted to consistent identities when
--diarizeis enabled; without it, treat<|speakerN|>as window-scoped.
