--- license: apache-2.0 base_model: Trelis/tiron pipeline_tag: automatic-speech-recognition library_name: whisper.cpp tags: - automatic-speech-recognition - whisper - whisper-large-v3 - speaker-diarization - meeting-transcription - crispasr - ggml - gguf language: - en --- # tiron — multi-speaker meeting ASR (GGML for CrispASR) GGML conversions of [**`Trelis/tiron`**](https://huggingface.co/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**](https://github.com/CrispStrobe/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 | file | quant | size | notes | |------|-------|------|-------| | `tiron-f16.bin` | F16 | 3.1 GB | full precision; reference-exact token stream | | `tiron-q4_k.bin` | Q4_K | 889 MB | recommended default; ~3.5× smaller, negligible WER change | 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: ```bash crispasr --backend tiron -m auto -f meeting.wav ``` Or point at a local file: ```bash crispasr --backend tiron -m tiron-q4_k.bin -f meeting.wav ``` Add **meeting-level speaker labels** (`SPEAKER_00`, `SPEAKER_01`, …) by turning on diarization, which clusters voiceprints across windows: ```bash crispasr --backend tiron -m tiron-q4_k.bin -f meeting.wav --diarize ``` ## How 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_NN` identities 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`](https://huggingface.co/Trelis/tiron) — Apache-2.0. - **Reference harness:** [`TrelisResearch/tiron`](https://github.com/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 `--diarize` is enabled; without it, treat `<|speakerN|>` as window-scoped.