File size: 4,551 Bytes
9fb8a95
 
 
272e46f
 
 
 
 
 
 
 
 
 
 
 
 
9fb8a95
272e46f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
---
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.