---
license: other
language:
- en
tags:
- automatic-speech-recognition
- asr
- speech
- streaming
- mimi
- kupe
- kupe-slm
pipeline_tag: automatic-speech-recognition
metrics:
- wer
- cer
model-index:
- name: kupe-asr-en
results:
- task:
type: automatic-speech-recognition
metrics:
- type: wer
value: 10.3
name: Test WER (%)
- type: cer
value: 4.9
name: Test CER (%)
---
### Streaming English ASR — early **Phase‑1** checkpoint
A 670M streaming speech‑to‑text model: audio is turned into Mimi codec tokens and the
**Kupe‑SLM‑670M** language backbone reads them and writes English text. Small, fast, real‑time.
| Split | WER | CER |
|---|---|---|
| **Test** (held‑out, n=500) | **10.3 %** | **4.9 %** |
| Validation | 11.2 % | 5.4 % |
| Silence → empty output | 100 % | — |
> ⚠️ **Early Phase‑1 checkpoint.** This is a first sanity‑milestone model trained on ~2.6k h
> to prove the pipeline and architecture. It is **not** the final release — quality will
> improve substantially with more data, augmentation, and epochs in later phases.
---
## Overview
- **Task:** English automatic speech recognition (streaming + full‑file).
- **How it works:** speech → **Mimi** neural audio codec (8 codebooks @ 12.5 Hz) → the 8
codebooks are summed into one embedding per 80 ms frame → fed to **Kupe‑SLM‑670M** as
`inputs_embeds` → the model decodes English text. No separate acoustic encoder.
- **Streaming:** emits turn signals from the model's own end‑of‑sequence probability —
`PRE_HIT_LLM` (prefetch your LLM) and `END_OF_SPEECH` (commit final).
- **Anti‑hallucination:** trained with 5 % silence/ambient clips labelled `""`, so silence
decodes to **nothing** (measured 100 %).
## Results in context
Production English ASR on much larger corpora sits around 4–6 % WER. **10.3 % from a
Phase‑1 670M model on 2.6k h is a strong early result** and already usable for voice agents.
Live WER during training fell 41 % → 18 % → 12.8 % → **10.3 %**.
## Training data (~2.6k h English, encoded)
| Source | Hours | Clips |
|---|---|---|
| LibriSpeech (clean+other) | 599 | 172,657 |
| People's Speech (CC‑BY) | 2,100 | 543,069 |
| Svarah (Indian‑accented EN) | 8.6 | 5,227 |
| Silence / ambient (labelled "") | 35 | 36,315 |
| **Total encoded** | **~2,606** | **716,968** |
24 kHz mono, Mimi‑encoded (8 codebooks). Splits: train ~2,733 h · val 5.1 h · test 5.0 h.
## Training setup (1× H100 80 GB)
| | |
|---|---|
| Method | **full fine‑tune** (all params), causal‑LM cross‑entropy |
| Effective batch | 128 (micro‑batch 32 × grad‑accum 4) |
| LR / schedule | 2e‑4, cosine, 3 % warmup |
| Epochs / steps | 2 / 11,158 |
| Precision | bf16 + TF32, fused AdamW |
| Regularisation | SpecAugment (time masking) |
| Wall‑clock | ~3.5 h · final eval_loss 0.26 |
## Tokenizer efficiency (fertility)
The 131,072‑vocabulary tokenizer is very efficient — low **fertility** (tokens/word) means
shorter targets, faster decoding, lower CER.
| Language | Fertility (tok/word) | Round‑trip |
|---|---|---|
| **English** | **1.29** | 100 % |
| Hindi | 1.63 | 100 % |
| Gujarati | 1.60 | 100 % |
| Punjabi | 1.47 | 100 % |
| Bengali | 1.77 | 100 % |
| Marathi | 1.93 | 100 % |
| Telugu / Kannada / Tamil / Odia | 2.1–2.3 | 100 % |
| Malayalam | 3.12 | 100 % |
## Multilingual outlook (this checkpoint is EN‑only)
The backbone was pre‑trained on English + 11 Indic languages; a probe found it already
generates coherent Hindi & Gujarati and has **100 % tokenizer round‑trip across all 11
scripts**. So extending to Hindi/Gujarati/… is mainly a matter of **more data on the same
pipeline** — the model side is ready.
## Files
- `kupe-lm/` — the Kupe‑SLM‑670M backbone (weights + tokenizer).
- `frontend.pt` — audio frontend (codebook embeddings + projector).
- `asr_config.json` — frontend mode (`per_frame_sum`), codebooks (8), embed dim.
## Inference
Requires **`transformers==5.4.0`** and the
[`kupe-asr-en`](https://github.com/iNavLabsResearch/kupe-asr-en) code.
```python
from kupe_asr_en.modeling.asr_model import LummaASR # loader class name; loads Kupe-SLM
model, tok = LummaASR.load("anuj-inavlabs/kupe-asr-en", device="cuda")
```
Streaming from a wav (turn flags):
```python
from kupe_asr_en.stream import transcribe_file
for ev in transcribe_file("model_dir", "audio.wav"):
print(ev.type, ev.text) # PARTIAL / PRE_HIT_LLM / END_OF_SPEECH
```
Live mic / Gradio demo (file + realtime, with RTF):
```bash
python scripts/06_mic_stream.py --model-dir # terminal mic
python scripts/10_gradio_kaggle.py # web UI (file + live mic)
```
## Related repos
- **Data:** `anuj-inavlabs/kupe-asr-en-data`
- **Runs:** `anuj-inavlabs/kupe-asr-en-runs`
- **Code:** https://github.com/iNavLabsResearch/kupe-asr-en
## License & credits
Speech‑LM backbone weights are used under their upstream license; audio codec: `kyutai/mimi`.
Data: LibriSpeech, MLCommons People's Speech (CC‑BY), AI4Bharat Svarah. Released as `other`.
Built by **iNavLabs**.