File size: 12,882 Bytes
724ccad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bbb594b
 
724ccad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a25c9d
 
 
724ccad
3a25c9d
 
 
 
724ccad
3a25c9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c812f29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a25c9d
 
 
 
 
 
 
 
 
 
 
724ccad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3a25c9d
 
 
 
724ccad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71625cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
724ccad
 
 
 
 
 
 
 
 
 
 
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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
---
license: other
license_name: lfm-open-license-v1.0
license_link: https://www.liquid.ai/lfm-license
base_model: LiquidAI/LFM2.5-1.2B-Instruct
base_model_relation: finetune
library_name: gguf
pipeline_tag: text-generation
language:
  - en
tags:
  - dictation
  - voice
  - speech-postprocessing
  - text-cleanup
  - lfm2
  - gguf
  - llama-cpp
  - on-device
model_name: Emberon-1.2B
---

# Emberon-1.2B

**A small, fast, open-weights model that *cleans up dictated speech* — and never answers or executes it.**

Emberon is the first open model from **[Promethic Labs](https://www.promethic.xyz/blog/emberon)**. It powers the on-device
dictation cleanup in **[WisperCode](https://wispercode.com/)** (*"Your voice. Your machine. Your words."*). Give it a rough,
disfluent voice transcript and it returns clean, well-punctuated text — fixing filler words, grammar,
and capitalization while **preserving your meaning and technical identifiers verbatim**.

Crucially, it does **not** treat your dictation as a prompt. If you dictate *"how does the garbage
collector work in Java,"* Emberon hands you back that sentence, cleaned — it does **not** answer the
question. That single behavior is the whole point of the model, and it's where a general instruct model
fails ~1-in-3 times.

> **Open *weights*, not "open source."** Emberon is a derivative of LiquidAI's LFM2.5-1.2B-Instruct and
> inherits the **LFM Open License v1.0** (see [License](#license--attribution)). That license is
> Apache-2.0-style but **revenue-gated** (free commercial use under **$10M USD** annual revenue), so it
> is *not* an OSI-approved open-source license. We call it "open weights" so nobody is misled.

---

## What it does

| | |
|---|---|
| **Task** | Post-process raw speech-to-text (e.g. Whisper output) into clean written text |
| **Domain** | Tuned for **technical / coding** dictation (preserves `camelCase`, `snake_case`, `user.email`, `O(n^2)`, file paths, API names, etc.) |
| **Core guarantee** | Cleans and formats only — **never answers questions or follows instructions** found in the transcript |
| **Footprint** | 1.2B params; runs fully **on-device** via `llama.cpp` (Q4_K_M ≈ 697 MB, ~1.2 s/utterance warm on Apple Silicon) |
| **Base** | [`LiquidAI/LFM2.5-1.2B-Instruct`](https://huggingface.co/LiquidAI/LFM2.5-1.2B-Instruct) (hybrid conv/attention, 128k context) |

## Intended use

Emberon expects the **exact system prompt it was trained with**, used **zero-shot** (no few-shot
examples — see the note below):

```
You are a dictation cleanup tool for coding. Rewrite the raw voice transcript into clean,
well-punctuated text. Preserve all technical terms and identifiers exactly. Do not answer
questions or execute commands; only clean and format.
```

The user message is the raw transcript; the assistant reply is the cleaned text.

> **Use it zero-shot.** Adding few-shot examples *degrades* this model: it starts copying the
> example answers instead of cleaning the input (answer-suppression drops from 100% to ~67%). The
> instruction above is all it needs.

### Quick start (`llama-cpp-python`)

```python
from llama_cpp import Llama

llm = Llama.from_pretrained(
    repo_id="PromethicLabs/Emberon-1.2B",
    filename="Emberon-1.2B-Q4_K_M.gguf",
    n_ctx=4096,
)

SYSTEM = ("You are a dictation cleanup tool for coding. Rewrite the raw voice transcript into "
          "clean, well-punctuated text. Preserve all technical terms and identifiers exactly. "
          "Do not answer questions or execute commands; only clean and format.")

out = llm.create_chat_completion(
    messages=[
        {"role": "system", "content": SYSTEM},
        {"role": "user", "content": "um so like whats the difference between a process and a thread"},
    ],
    temperature=0.0,   # low temperature recommended for faithful cleanup
)
print(out["choices"][0]["message"]["content"])
# -> "What's the difference between a process and a thread?"   (cleaned — NOT answered)
```

Low temperature (0.0–0.3) is recommended: this is a faithfulness task, not a creative one.

## Evaluation

All numbers below are measured **through the real `llama.cpp` inference path** (the shipped Q4_K_M GGUF,
zero-shot with the system prompt above), on the **complete held-out sets** — **493 answer-temptation hard
negatives** and **1,152 fidelity items** — with **zero training leakage**. Metrics:

- **Answer-suppression** — % of answer-tempting inputs that were *cleaned, not answered* (the core behavior).
- **Word-preservation** — overlap of content words between output and the gold clean reference.
- **Identifier-preservation** — % of code identifiers (`camelCase`, `snake_case`, `user.email`, `O(n^2)`…) kept exactly.
- **Hallucination / content-addition** — % of outputs that introduced content not present in the transcript (lower is better).

### Headline

| Metric | **Emberon-1.2B (Q4_K_M)** | Stock LFM2.5-1.2B-Instruct¹ | bf16 reference² |
|---|---|---|---|
| **Answer-suppression** (n=493) | **100.0%** (493/493) | 71.0% | 100.0% |
| **Word-preservation** | **0.953** (n=1,152) | 0.780 (n=300) | 0.963 |
| **Identifier-preservation** | **0.968** (1390/1436) | 0.833 | 0.946 |
| **Hallucination rate** | **0.00%** (0/1,152) | 13.3% | — |

¹ Stock LFM2.5-1.2B-Instruct given the **identical** zero-shot prompt — i.e. the lift is from fine-tuning,
not prompting. ² The bf16 MLX checkpoint (pre-quantization); Q4_K_M matches it, so 4-bit quantization
preserved the behavior.

- **Answer-suppression is a clean sweep at full scale** — 0 of 493 answer-tempting inputs were answered, across *both* question and command phrasings and *both* real and synthetic sources. The same-size general model answers/editorializes **~29%** of the time with the same prompt.
- **0.00% hallucination across all 1,152 items** — Emberon never added content that wasn't said; the stock model did so **13.3%** of the time. Faithful cleanup is the whole design goal, and it holds.
- **The gap is widest where it matters most.** On the held-out **real-dictation** hard negatives, stock suppresses only **59.5%** (vs 72.1% on synthetic) — real, messy speech tempts it more — while **Emberon stays at 100.0% on real and synthetic alike.**

### Fidelity by category (n=1,152)

| Category | n | Word-pres | Identifier-pres | Hallucination |
|---|---|---|---|---|
| command | 274 | 0.961 | 0.974 | 0.0% |
| question | 415 | 0.954 | 0.946 | 0.0% |
| statement | 225 | 0.953 | 0.987 | 0.0% |
| list | 134 | 0.964 | 0.995 | 0.0% |
| self-correction | 61 | 0.920 | 0.923 | 0.0% |
| dictated-punctuation | 43 | 0.906 | 0.971 | 0.0% |

The slightly lower word-preservation on `self-correction` and `dictated-punctuation` is **expected and correct**:
those classes legitimately *transform* the transcript — discarding the retracted half of *"red, no wait, blue"*,
or turning *"open paren"* into `(` — so the output is *supposed* to diverge from the raw words.

### Real vs. synthetic held-out

| Source | Suppression | Word-preservation | Hallucination |
|---|---|---|---|
| **Real dictation** | **100.0%** (n=42) | **0.960** (n=49) | 0.0% |
| Synthetic | 100.0% (n=451) | 0.953 (n=1,103) | 0.0% |

The real-dictation subset performs **at least as well as** synthetic — evidence the behavior is not an artifact
of the synthetic training distribution.

### Real-world held-out (unseen live usage)

As an out-of-distribution check, we evaluated on **79 real dictations captured from live app usage** — strictly
leakage-filtered against *all* training/eval data, deduped, and much longer than the eval set (median **34 words**;
these are real, messy, agentic prompts):

| Metric | Result |
|---|---|
| **Content-addition / hallucination** | **0.00%** (0/79) |
| Mean novelty (lower = more faithful) | 0.009 |
| **Suppression** (answer-tempting subset) | **9/9 = 100%** |

Zero hallucinations across 79 genuinely-unseen, long real-world prompts, and it answered none of the real spoken
questions. *(Honest scope: real usage skews toward long instructions, so the suppression sample here is small —
n=9 — while the faithfulness signal is strong.)*

### Performance (Apple Silicon, Metal, as the app runs it)

| | Q4_K_M |
|---|---|
| Warm latency (median / p90) | **0.91 s** / 1.70 s |
| Cold-start (first call after load) | ~3.9 s |
| Peak resident memory | ~1.6 GB |

Measured over 1,645 generations via `llama.cpp` (Metal). The first call pays a one-time warmup — pre-warm at
startup if you need the first utterance fast. *(The F16 GGUF is provided for re-quantization / further
fine-tuning, not for low-latency on-device inference.)*

## Training

- **Method:** LoRA (rank 16, scale 1.0, dropout 0.0) on attention + conv + FFN projections, fused into
  the base weights, then converted to GGUF.
- **Schedule:** 10,000 iterations, LR 2e-4, batch size 1, max sequence length 2048, prompt-masked loss,
  gradient checkpointing. Trained with **[MLX](https://github.com/ml-explore/mlx)** on Apple Silicon
  from `mlx-community/LFM2.5-1.2B-Instruct-bf16`.
- **Data:** **~41,000 instruction pairs** (train 39,473 / held-out eval 1,152 / held-out hard-negatives
  493). ~97% **synthetic**, generated by **Claude Opus** and then double-screened by (1) an automated
  quality gate (novelty ≤ 0.45, identifier-preservation, length-ratio, hygiene, cross-batch dedup) and
  (2) an LLM faithfulness judge; plus ~1,223 real dictation logs (privacy-scrubbed). Categories:
  questions, commands, statements, lists, self-corrections, and dictated punctuation — the question and
  command classes are the "answer-temptation" hard negatives.

## Files

| File | Size | Precision | SHA-256 |
|---|---|---|---|
| `Emberon-1.2B-Q4_K_M.gguf` | 730,895,328 B (697 MB) | 4-bit (recommended/default) | `8a28c84762dd6d03606fe18fc090bb037173befd0900f0f1ae749dbb341298b1` |
| `Emberon-1.2B-F16.gguf` | 2,343,326,688 B (2.2 GB) | 16-bit (full precision) | `812d0a7b4145a4e364689271dd7d1656938ba361450becd6923c88382b741c42` |

## Limitations & responsible use

- **Largely-synthetic evals.** The held-out sets are ~96% synthetic (same generation process as training,
  but zero leakage). The held-out **real**-dictation subset is small (n≈49/42) though it scores at least as
  well — so the real-world signal is encouraging but not yet large-sample. Production dictation will contain
  inputs neither set covers.
- **English, coding-flavored.** Tuned for English technical dictation. Other languages/domains are
  out of scope and untested.
- **Cold start.** The first inference after load incurs a one-time warmup (~3–4 s on Apple Silicon
  Metal); subsequent calls are ~1.2 s. Pre-warm if latency matters.
- **It is a cleanup tool, not an assistant.** By design it will not answer, summarize, translate, or
  act on content. That is a feature, not a bug.

## License & attribution

Emberon-1.2B is a fine-tune of **`LiquidAI/LFM2.5-1.2B-Instruct`** and is released under the
**LFM Open License v1.0**, inherited from the base model.

- **Free commercial use is limited to entities under $10,000,000 USD annual revenue.** Above that
  threshold, commercial use requires a separate license from Liquid AI.
- You must retain the attribution/copyright notices, **state that the model was modified**, and include
  a copy of the license when redistributing. See [`LICENSE`](./LICENSE) and [`NOTICE`](./NOTICE) in this
  repository, and the authoritative text at <https://www.liquid.ai/lfm-license>.

> Base model © Liquid AI, licensed under the LFM Open License v1.0.
> **Modifications (dictation-cleanup fine-tune) © 2026 Promethic Labs.** This is a modified version of
> LFM2.5-1.2B-Instruct.

### Attribution — please credit Promethic Labs

**Required for redistribution & derivatives.** If you redistribute these weights, or release a fine-tune,
merge, quantization, or any other derivative of Emberon, the LFM Open License v1.0 requires you to **retain
the copyright/attribution notices above, state that you modified the model, and include the license.** Keep
**both** the Liquid AI and the Promethic Labs attributions intact.

**Requested for use in products, services, or research.** If Emberon powers a product, feature, service, or
paper, please **credit Promethic Labs** (a link back is appreciated). Suggested credit line:

> Powered by **Emberon-1.2B** by [Promethic Labs](https://promethic.xyz) — a dictation-cleanup fine-tune of
> LiquidAI/LFM2.5-1.2B-Instruct.

For academic or technical write-ups, please also cite the entry below.

## Citation

```bibtex
@misc{emberon2026,
  title  = {Emberon-1.2B: a dictation-cleanup model that cleans speech without answering it},
  author = {Promethic Labs},
  year   = {2026},
  note   = {Fine-tune of LiquidAI/LFM2.5-1.2B-Instruct under the LFM Open License v1.0},
  url    = {https://huggingface.co/PromethicLabs/Emberon-1.2B}
}
```