File size: 8,196 Bytes
d89411a
 
 
 
48cb3df
 
d9e7f6e
d89411a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88b2df2
d89411a
 
 
 
 
 
 
 
 
88b2df2
d89411a
 
 
 
 
 
 
 
 
88b2df2
d89411a
 
 
 
 
 
 
 
88b2df2
d89411a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e85f4a9
 
 
 
 
d89411a
 
88b2df2
e8b9148
 
 
 
d89411a
 
 
88b2df2
 
 
 
 
 
d89411a
 
88b2df2
 
 
d89411a
3658535
4834705
3658535
4834705
3658535
 
 
 
950d88b
d89411a
 
 
88b2df2
 
 
 
d89411a
88b2df2
d89411a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88b2df2
 
d89411a
88b2df2
d89411a
 
 
 
 
 
e8b9148
d89411a
 
 
 
d9e7f6e
d89411a
 
 
 
 
88b2df2
d89411a
88b2df2
 
 
 
 
 
 
d89411a
d9e7f6e
 
 
d89411a
 
df068c7
 
 
 
 
d89411a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88b2df2
e85f4a9
d89411a
 
 
 
 
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
---
language:
- da
license: other
license_name: nvidia-open-model-license
license_link: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-open-model-license/
thumbnail: https://huggingface.co/RyeAI/ekko-v1-tiny/resolve/e37e698805c538e447c25062ab13fa862462ee9e/cover.png
library_name: nemo
pipeline_tag: automatic-speech-recognition
base_model: nvidia/parakeet-rnnt-110m-da-dk
base_model_relation: finetune
datasets:
- alexandrainst/nst-da
- alexandrainst/ftspeech
- alexandrainst/nota
- CoRal-project/coral-v3
tags:
- automatic-speech-recognition
- speech-recognition
- speech-to-text
- danish
- danish-asr
- offline
- local-inference
- cpu-inference
- nemo
- gguf
- onnx
- sherpa-onnx
- rnnt
- word-timestamps
metrics:
- wer
model-index:
- name: Ekko v1 Tiny
  results:
  - task:
      type: automatic-speech-recognition
    dataset:
      name: CoRal conversation
      type: CoRal-project/coral-v3
      config: conversation
      split: test
    metrics:
    - type: wer
      value: 23.88
  - task:
      type: automatic-speech-recognition
    dataset:
      name: CoRal read aloud
      type: CoRal-project/coral-v3
      config: read_aloud
      split: test
    metrics:
    - type: wer
      value: 11.74
  - task:
      type: automatic-speech-recognition
    dataset:
      name: FLEURS Danish
      type: google/fleurs
      config: da_dk
      split: test
    metrics:
    - type: wer
      value: 9.36
  - task:
      type: automatic-speech-recognition
    dataset:
      name: FTSpeech
      type: alexandrainst/ftspeech
      split: test_balanced
    metrics:
    - type: wer
      value: 7.57
---

![Ekko v1 Tiny — offline Danish speech recognition](cover.png)

[Leaderboard](https://huggingface.co/spaces/RyeAI/danish-asr-leaderboard) ·
[Benchmark data](https://huggingface.co/datasets/RyeAI/danish-asr-leaderboard) ·
[Evaluation harness](https://github.com/Rye-A1/danish-asr-leaderboard)

# Ekko v1 Tiny — Offline Danish Speech-to-Text with Word Timestamps

Ekko v1 Tiny is a compact, 110M-parameter Danish speech recognition model with
word timestamps. It is a FastConformer RNN-T fine-tuned from
`nvidia/parakeet-rnnt-110m-da-dk` and runs locally. Its raw output is lowercase
text; pair it with `RyeAI/ekko-pnc` for capitalization and punctuation.

**Best fit:** clear Danish speech from one speaker, delivered at a steady pace,
such as dictation or reading aloud. The published results are stronger on read
and formal speech than on spontaneous conversation. Dictation itself was not
evaluated as a separate test set.

## Benchmark

**12.14% mean WER** across 26,780 rows from five Danish test sets, evaluated
with the leaderboard harness. Scores use the published defaults: NFKC
normalization, spoken-number folding, Danish number-word normalization,
lowercase, punctuation removal, symmetric filler removal, and whitespace
collapse. Lower is better.

| Test set | Speech type | WER |
|---|---|---:|
| CoRal conversation | Spontaneous conversation | 23.88% |
| CoRal read aloud | Read speech | 11.74% |
| Common Voice Danish (CV 25.0 test subset) | Crowd-sourced read speech | 8.15% |
| FLEURS `da_dk` | Read news-style speech | 9.36% |
| FTSpeech | Parliamentary speech | 7.57% |
| **Equal-weight mean** | | **12.14%** |

The NeMo checkpoint processed the benchmark at **795.8x realtime** on one A100.
The official run saved raw per-sample outputs. Rescoring those same outputs with
the leaderboard normalization updated on 15 October 2026 gives 12.14%; no
model inference was rerun.

### Comparison with models below 800M parameters

![Mean WER of Ekko v1 Tiny and twelve open-weight leaderboard models below 800M parameters](comparison.png)

As of 18 October 2026, Tiny's NeMo checkpoint scores 12.14% mean WER in the
[Danish ASR Leaderboard](https://huggingface.co/spaces/RyeAI/danish-asr-leaderboard),
compared with 12 other open-weight models below 800M parameters. Each score
is an equal-weight mean across the same five Danish test sets (26,780 clips).

### Native GGUF quantization

The F32, F16, Q8_0, Q6_K, Q5_K, Q5_0, Q4_K, and Q4_0 files are
scored on the same 26,780 clips under the earlier normalization policy. Their
WER figures below have not yet been rescored with the 15 October 2026 update;
they should not be compared directly with the current NeMo score. All 40
variant/domain outputs completed and passed exact-row offline scoring.

| Variant | Size | Mean WER (earlier scoring) | CPU speed |
|---|---:|---:|---:|
| **F16** | 248.2 MiB | **12.315%** | 74.4x |
| F32 | 430.6 MiB | 12.318% | 71.8x |
| **Q8_0** | 162.7 MiB | **12.323%** | **74.9x** |
| Q6_K | 141.8 MiB | 12.325% | 63.0x |
| Q5_K | 129.8 MiB | 12.337% | 60.1x |
| **Q5_0** | **128.5 MiB** | **12.370%** | **69.4x** |
| Q4_K | 118.4 MiB | 12.442% | 65.4x |
| Q4_0 | 117.1 MiB | 12.467% | 72.1x |

Q5_0 remains the packaged default: it is 128.5 MiB, runs at 69.4x realtime,
and is 0.047 mean-WER points behind Q8_0. Choose Q8_0 when the extra 34.2 MiB
is acceptable and maximum quantized accuracy is preferred. F16 is the native
reference tier.

### ONNX and browser export

The model is available for sherpa-onnx and was evaluated on the same 26,780-row
matrix with mandatory non-silent peak normalization to 0.95. The browser
downloads the compact int8 export. The ONNX WER figures below also use the
earlier normalization policy and have not yet been rescored.

| Export | Size | Mean WER (earlier scoring) | CPU speed |
|---|---:|---:|---:|
| FP32 ONNX | 450.6 MiB | 12.465% | 53.4x |
| **INT8 ONNX** | **129.0 MiB** | **12.946%** | **49.2x** |

Both exports completed all five domains with zero runtime failures. INT8 is
71.4% smaller than FP32 and trades 0.481 mean-WER points for the smaller browser
download.

## Artifacts

The current NeMo, GGUF, and ONNX artifacts are pinned at Hub revision
`e37e698805c538e447c25062ab13fa862462ee9e` and verified by SHA-256.

Clean-cache packaged download and inference tests passed on macOS arm64 and
Linux x64 with native word timestamps. The Windows x64 artifact is mapped but
has not been exercised against this release.

| Format | Path | Mean WER |
|---|---|---:|
| NeMo | `ekko-v1-tiny.nemo` | 12.14% (current) |
| parakeet.cpp GGUF | `gguf-parakeet.cpp/ekko-v1-tiny-{f32,f16,q8_0,q6_k,q5_k,q5_0,q4_k,q4_0}.gguf` | 12.315-12.467% (earlier) |
| sherpa-onnx FP32 | `onnx-sherpa/{encoder,decoder,joiner}.onnx` | 12.465% (earlier) |
| sherpa-onnx INT8 | `onnx-sherpa/{encoder,decoder,joiner}.int8.onnx` | 12.946% (earlier) |

The GGUF and ONNX scores above use the earlier normalization policy; the NeMo
score uses the current leaderboard policy.

The browser loads `onnx-sherpa/runtime-config.json` with the INT8 files and
checks its SHA-256 before using its audio and model settings.

## Local Use

For pinned downloads, word timestamps, and optional PnC, see the
[Ekko STT quickstart](https://github.com/Rye-A1/ekko-danish-stt#run-locally).
If you already have `parakeet-cli` from parakeet.cpp, you can also run the
GGUF model directly:

```bash
hf download RyeAI/ekko-v1-tiny \
  gguf-parakeet.cpp/ekko-v1-tiny-q5_0.gguf \
  --local-dir ./ekko-v1-tiny
parakeet-cli transcribe \
  --model ./ekko-v1-tiny/gguf-parakeet.cpp/ekko-v1-tiny-q5_0.gguf \
  --input audio.wav --timestamps
```

NeMo usage:

```python
from nemo.collections.asr.models import EncDecRNNTBPEModel

model = EncDecRNNTBPEModel.from_pretrained("RyeAI/ekko-v1-tiny")
transcript = model.transcribe(["audio.wav"])[0]
print(transcript.text)
```

## Training and limitations

Ekko v1 Tiny trained for 50,000 steps on an 879,083-row,
1,549.6-hour Danish manifest, including 454.1 hours of quality-gated
pseudo-labelled audio.

- Danish only.
- Raw output has no punctuation or capitalization.
- The 44-token vocabulary does not contain uppercase or punctuation tokens.
- Punctuation and capitalization require a separate restoration model such as
  `RyeAI/ekko-pnc`.
- Spontaneous conversation remains the hardest benchmark domain (23.88% WER).
- Noisy audio and overlapping speakers were not evaluated separately.

## License

The complete model and data terms are documented in
[`MODEL_LICENSE.md`](MODEL_LICENSE.md) and the bundled `LICENSES/` files.