MLX
Safetensors
English
Spanish
qwen3_5
dictation
speech-to-text
post-processing
spanish
english
8-bit precision
Instructions to use Enriqueag26/keysay-concise-0.8B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use Enriqueag26/keysay-concise-0.8B with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir keysay-concise-0.8B Enriqueag26/keysay-concise-0.8B
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
| license: apache-2.0 | |
| base_model: Qwen/Qwen3.5-0.8B | |
| tags: [mlx, dictation, speech-to-text, post-processing, spanish, english] | |
| language: [en, es] | |
| # keysay-concise-0.8B | |
| Turns rambling dictation into the short, direct message you meant to send, for | |
| [keysay](https://github.com/kikoncuo/keysay). | |
| ``` | |
| hey so I wanted to tell Laura to review her last pr about the the the latest bug | |
| we saw about the thing the thing that Luis reported about the duplicated texts | |
| -> Laura, please review your last PR about the latest bug we saw: Luis reported | |
| about duplicated texts. | |
| ``` | |
| Companion to | |
| [keysay-transcription-cleaner-0.8B-v2](https://huggingface.co/Enriqueag26/keysay-transcription-cleaner-0.8B-v2), | |
| which is deletion-only. This model **rewrites** — it reorders clauses, adds | |
| function words, and turns narration into direct address. That freedom is what | |
| makes it useful and also what makes it riskier, so the training data was built | |
| around a different guarantee. | |
| ## What it will not do | |
| Because the output is pasted without the original in view, invented facts are | |
| undetectable at the point they do damage. Every training pair was rejected | |
| unless it satisfied: | |
| - **no invented entities** — no person, place, date or quantity the speaker did | |
| not say. "when you can" never becomes "by Friday". | |
| - **relay preserved** — `dile a Carmen que...` means you are messaging somebody | |
| else and asking them to pass it on. The output keeps `Dile a Carmen que...` | |
| rather than re-addressing the message to Carmen. Every name survives that | |
| mistake, so it needs its own check. | |
| - **names verbatim** — a model cannot know which spelling of a proper noun is | |
| right, and one trained to fix them corrupts correct ones. Use keysay's | |
| per-user replacement list for that. | |
| - **short messages left alone** — a message that was already clear comes back | |
| essentially unchanged. | |
| ## Results | |
| 44 held-out hand-authored scenarios, ~50% Spanish. The eval set is deliberately | |
| not generated by the model that produced the training data, so blind spots | |
| shared between teacher and student stay visible. | |
| | metric | | | |
| |---|---| | |
| | invented a fact | **0 / 44** | | |
| | relay preserved | **100%** (n=7) | | |
| | already-tight left alone | **100%** (n=12) | | |
| | dropped a stated fact | 1 / 44 | | |
| | compression on rambles | 71% | | |
| ## Usage | |
| ```python | |
| from mlx_lm import load, generate | |
| model, tokenizer = load("Enriqueag26/keysay-concise-0.8B") | |
| prompt = tokenizer.apply_chat_template( | |
| [{"role": "system", "content": SYSTEM_PROMPT}, | |
| {"role": "user", "content": "oye dile a carmen que la reunión es el lunes no espera el martes a las diez"}], | |
| tokenize=False, add_generation_prompt=True, enable_thinking=False, | |
| ) | |
| generate(model, tokenizer, prompt=prompt, max_tokens=200) | |
| # -> "Dile a Carmen que la reunión es el martes a las 10." | |
| ``` | |
| `SYSTEM_PROMPT`: | |
| ``` | |
| You turn rambling dictated speech into the short, direct message the speaker meant to send. | |
| Lead with the actual request. Never invent anything the speaker did not say. | |
| Never change who the message is addressed to. Keep the original language. | |
| ``` | |
| ## Training | |
| LoRA via `mlx_lm` on Qwen3.5-0.8B-8bit — 16 layers, rank 8, 1800 iters, lr 3e-5. | |
| 4,196 synthetic pairs from two generators, because neither model could do both | |
| halves: gemini-3-flash writes convincingly messy dictation but drops stated | |
| reasons when rewriting, while gpt-5.6-sol rewrites faithfully but cannot write | |
| convincing rambling. So gemini generates the inputs and Sol rewrites them. | |
| The corpus deliberately spans both a light-disfluency and a heavy-rambling | |
| regime rather than averaging to a middle that resembles neither. | |
| 320 pairs are hand-written contrast sets for words that are both retraction cues | |
| and ordinary vocabulary — `espera`/`wait`, `mejor`, `digo`, `perdón`, | |
| `actually` — each appearing in both roles. Without them the model read | |
| `no espera a las siete` as content and kept the retracted time. | |
| ## Known limitations | |
| - **AM/PM is inferred, sometimes wrongly.** `a las ocho y media` for a school | |
| trip came back as `20:30`. If a time matters, check it. | |
| - **A named third party can be mistaken for the addressee.** "lo del cole de | |
| Nacho" produced a message addressed to Nacho. Explicit relay phrasing | |
| (`dile a X`) is handled correctly; a bare mention is not always. | |
| - Very long rambles occasionally shed a secondary qualifier. | |
| - Tuned for Spanish and English chat-style dictation. | |