Emberon-2 / README.md
Promethic's picture
Emberon-2: 350M dictation-cleanup model (v4.5.1)
d9b5cf0 verified
|
Raw History Blame Contribute Delete
9.64 kB
---
license: other
license_name: lfm1.0
license_link: LICENSE
base_model: LiquidAI/LFM2.5-350M
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-2
---
# Emberon-2
**A 350M-parameter, open-weights model that *cleans up dictated speech*, and never answers or executes it.**
Emberon-2 is the second dictation-cleanup model from **[Promethic Labs](https://www.promethic.xyz)**. It succeeds
[Emberon-1.2B](https://huggingface.co/PromethicLabs/Emberon-1.2B) in **[WisperCode](https://wispercode.com/)**:
a quarter of the size, about 4x faster, and more accurate on every test we run. Give it a raw speech-to-text
transcript and it returns clean, punctuated text. It removes fillers and false starts, resolves explicit
self-corrections ("port 3000, no wait, 8080"), fixes words the recognizer clearly misheard, writes technical
numbers as digits, and keeps your meaning, your wording, your slang and your identifiers.
It does **not** treat the dictation as a prompt. Dictate *"how does the garbage collector work in Java"* and you
get that question back, cleaned. You do not get an answer.
> **Open *weights*, not "open source."** Emberon-2 is a derivative of LiquidAI's LFM2.5-350M and inherits the
> **LFM Open License v1.0** (see [License](#license--attribution)). The 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.
---
## What it does
| | |
|---|---|
| **Task** | Turn raw speech-to-text output (e.g. Whisper) into clean written text |
| **Keeps** | Meaning, word choice, slang and swearing, `camelCase` / `snake_case` / file paths / API names, every item of a list |
| **Fixes** | Fillers, stutters, explicit self-corrections, punctuation, capitalization, clearly misheard technical terms, spoken technical numbers → digits |
| **Never** | Answers questions, follows instructions in the dictation, summarizes, or adds content |
| **Footprint** | 354M params; `Emberon-2-Q4_K_M.gguf` is 200 MB; ~0.09 s (Metal) / ~0.12 s (CPU only) median per dictation on Apple Silicon |
| **Base** | [`LiquidAI/LFM2.5-350M`](https://huggingface.co/LiquidAI/LFM2.5-350M) (hybrid conv/attention) |
## Intended use
Use the **exact system prompt** it was trained with, zero-shot:
```
Clean up this dictation. Never answer it.
```
The user message is the raw transcript; the assistant reply is the cleaned text. Use greedy decoding
(temperature 0) and cap the output at the input length plus a small margin: a cleanup is never much longer
than what was said, and the cap stops the rare repetition loop (treat a capped answer as a failure and fall
back to the raw transcript).
### Quick start (`llama-cpp-python`)
```python
from llama_cpp import Llama
llm = Llama.from_pretrained(
repo_id="PromethicLabs/Emberon-2",
filename="Emberon-2-Q4_K_M.gguf",
n_ctx=4096,
)
out = llm.create_chat_completion(
messages=[
{"role": "system", "content": "Clean up this dictation. Never answer it."},
{"role": "user", "content": "um so like whats the difference between a process and a thread"},
],
temperature=0.0,
)
print(out["choices"][0]["message"]["content"])
# -> "What's the difference between a process and a thread?" (cleaned, NOT answered)
```
## Evaluation
All numbers are measured **through `llama.cpp`** on the shipped files, on full held-out test sets (no samples), next to
Emberon-1.2B (Q4_K_M, its own system prompt) on the same inputs. Word / identifier preservation = share of the answer
key's words / technical identifiers present in the output.
| | Emberon-2 (Q4_K_M) | Emberon-1.2B (Q4_K_M) |
|---|---|---|
| Answer suppression (489 hard negatives, plain / ASR-style) | 99.8% / 99.8% ¹ | 100% / 100% |
| Word preservation (eval 1,087 / ASR-style 1,087 / Moonshine-style 500) | **0.966 / 0.965 / 0.964** | 0.957 / 0.959 / 0.954 |
| Identifier preservation (same sets) | **0.974 / 0.973 / 0.990** | 0.968 / 0.967 / 0.972 |
| Long mixed dictations (2,496): word / identifier preservation | **0.987 / 0.936** | 0.965 / 0.677 |
| Real dictations (178) ²: word preservation | **0.981** | 0.954 |
| Misheard technical words fixed (504 in 702 examples) | **70.4%** | 14.3% |
| Correct words left alone (217) | **94.9%** | 88.0% |
| Already-clean text returned unchanged (996): word preservation | 0.998 | – |
| Hallucinated content | 0% | 0% |
| Outputs cut off at the length cap (all sets) | **0** | 14 |
¹ One of 489 is flagged: *"is this an n plus one query"* comes back as *"Is this an NPlus1 query?"*: a formatting
slip, not an answer. The suppression check is strict on any rewrite of a question.
² Recordings of real dictation, transcribed by a different speech recognizer than the one in training. Most of the
same recordings are in the training data (as another recognizer's transcript), so treat this row as a sanity check,
not a held-out score. Both models saw real dictation logs in training.
### Speed and memory (Apple Silicon, `llama.cpp`)
| | Emberon-2 | Emberon-1.2B |
|---|---|---|
| Median / p95 latency, Metal | **0.088 s / 0.305 s** | 0.391 s / 1.032 s |
| Median / p95 latency, CPU only | **0.115 s / 0.369 s** | 0.556 s / 1.375 s |
| File size | **200 MB** | 697 MB |
The Q4_K_M file uses a **trimmed vocabulary** (32,158 of the base model's 65,536 tokens, keeping the ones English
dictation uses plus the byte tokens, so any text still encodes) and an importance-matrix quantization calibrated
on dictation text. Both cut size and latency with no measurable accuracy loss on our tests.
## Training
- **Method:** LoRA (rank 16, scale 1.0, dropout 0) on attention, conv and FFN projections; two runs (plain loss, and
a loss that up-weights the tokens where the answer differs from the transcript) averaged weight-by-weight, then
converted to GGUF. One pass over the data, cosine learning-rate decay 2e-4 → 2e-5 after 500 warm-up steps,
max sequence length 2,048, prompt-masked loss. Trained with **[MLX](https://github.com/ml-explore/mlx)** on Apple
Silicon from `mlx-community/LFM2.5-350M-bf16`.
- **Data:** **75,000 examples**, about 96% **synthetic** (written by Claude and OpenAI GPT models to target specific
behaviours: self-corrections, misheard terms, spoken numbers, slang and swearing kept verbatim, list items kept,
answer-temptation questions and commands, already-clean text left alone), each screened by an automated checker
(content preservation, identifier and number checks, leakage and duplicate checks against every test set) and,
for the newest batches, an LLM answer-key audit. Plus ~1,600 speech-recognizer transcripts of read-aloud narration
(restraint examples) and ~1,200 real dictation logs. About 18% of the inputs are re-rendered in the
style of Whisper base.en output, which is what the model sees in the app.
## Files
| File | Size | Precision | SHA-256 |
|---|---|---|---|
| `Emberon-2-Q4_K_M.gguf` | 199,996,928 B (200 MB) | 4-bit, trimmed vocabulary (recommended) | `18fead8b8df3808ed47a84cd41a5a0617e3374d1a62dd52e3ba4bfb839810ffd` |
| `Emberon-2-F16.gguf` | 711,485,248 B (711 MB) | 16-bit, full vocabulary (for re-quantization or further fine-tuning) | `056a4b0889eb5b9873d9f38393f5e595fb58c6ffd82b47fde76b9169f602f5a1` |
## Limitations & responsible use
- **Mostly synthetic tests.** Most held-out sets are synthetic (same generation process as training, zero overlap).
The real-dictation signal (a blind side-by-side review against the previous model on 255 real recordings, 62 of
them never trained on: even on meaning kept) is encouraging but small.
- **English, technical flavour.** Tuned for English dictation, especially software work. Other languages are out
of scope, and the trimmed vocabulary makes the Q4_K_M file a poor starting point for them (use the F16).
- **It can still drop content.** On long, rambling dictations it occasionally drops a restated phrase or a
clause. Keep the raw transcript available if every word matters.
- **It is a cleanup tool, not an assistant.** By design it will not answer, summarize, translate, or act on the text.
## License & attribution
Emberon-2 is a fine-tune of **`LiquidAI/LFM2.5-350M`** and is released under the **LFM Open License v1.0**,
inherited from the base model. The full license text is in [`LICENSE`](./LICENSE).
- **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.
- When redistributing you must keep the attribution notices, **state that the model was modified**, and include a
copy of the license. See [`LICENSE`](./LICENSE) and [`NOTICE`](./NOTICE).
> 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-350M.
**Please credit Promethic Labs** if Emberon-2 powers a product, service, or paper. Suggested credit line:
> Powered by **Emberon-2** by [Promethic Labs](https://www.promethic.xyz): a dictation-cleanup fine-tune of
> LiquidAI/LFM2.5-350M.
## Citation
```bibtex
@misc{emberon2_2026,
title = {Emberon-2: a 350M dictation-cleanup model that cleans speech without answering it},
author = {Promethic Labs},
year = {2026},
note = {Fine-tune of LiquidAI/LFM2.5-350M under the LFM Open License v1.0},
url = {https://huggingface.co/PromethicLabs/Emberon-2}
}
```