--- license: other license_name: lfm-open base_model: juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit library_name: mlx tags: - mlx - lfm2 - text-cleanup - dictation - course-correction - lora language: - en pipeline_tag: text-generation --- # LC-lfm2.5-350m — dictation cleanup with course-correction A small, fast **on-device voice-dictation cleanup** model: it turns messy spoken transcripts into clean written text, and — unlike most cleanup models — it **honors spoken self-corrections** ("book the 7pm flight *no wait* the 9pm one" → "Book the 9pm flight."). Built for [MacWispr](https://github.com/vasanthsreeram/macwispr). This repo ships the **fused** model (LoRA baked in) so you can pull and run it directly; the standalone LoRA adapter is under [`lora-adapter/`](./lora-adapter). - **Base:** `juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit` (LFM2.5-350M, MLX 5-bit) - **Method:** LoRA (8 layers, 600 iters, LR 5e-6), fused into the base - **Runtime:** MLX (Apple Silicon) — also loadable in Swift via `mlx-swift-lm` (LFM2) ## What it does 1. Removes fillers and stutters ("um", "uh", "that that" → "that"). 2. **Honors self-corrections** — drops the retracted item, keeps the replacement, and keeps the rest of the sentence. 3. Writes numbers as digits ("three seventy-five" → "375"). 4. Fixes light grammar/punctuation/capitalization without summarizing. ## Prompt format Trained on a raw completion format (**not** a chat template): ``` ### Input: {raw dictation} ### Output: ``` ## Usage (mlx-lm) ```python from mlx_lm import load, generate from mlx_lm.sample_utils import make_sampler model, tok = load("vasanth009/LC-lfm2.5-350m") raw = "set the oven to three fifty no wait three seventy five for the lasagna" prompt = f"### Input:\n{raw}\n\n### Output:\n" out = generate(model, tok, prompt=prompt, max_tokens=64, sampler=make_sampler(temp=0.0)) print(out.split("###")[0].strip()) # -> Set the oven to 375 for the lasagna. ``` To apply the LoRA to the base yourself instead of using the fused weights: ```bash mlx_lm.generate --model juanquivilla/sotto-cleanup-lfm25-350m-mlx-5bit \ --adapter-path lora-adapter --prompt "### Input:\n...\n\n### Output:\n" ``` ## Honest evaluation (leak-free held-out) Graded by an LLM judge on a **94-item held-out set generated on topics disjoint from training** (0/94 overlap with the training data — verified). This is a real generalization test, not memorized phrases. | Model | Course-correction | Light cleanup | Preserve (anti over-edit) | |-------|------------------:|--------------:|--------------------------:| | Base (Sotto LFM2.5-350M) | 10/16 | 12/12 | 6/8 | | **This model (+LoRA)** | **13/16** | 12/12 | **7/8** | Course-correction is the headline improvement (10→13/16). Light cleanup was already strong (tie). Latency ~50–100 ms/utterance on Apple Silicon. ### Limitations - The base is **5-bit quantized**; rare token corruptions can occur ("simmer" → "smear"). A higher-precision base would reduce this. - 350M parameters — capable for cleanup, not a general assistant. It only cleans text; it does not answer questions in the transcript. - Occasionally over-shortens a long correction (drops a trailing clause). ## Provenance Training data (course-correction / light-cleanup / preserve pairs) was generated and QC-filtered with an LLM on fresh topics, with a hard leakage gate against the held-out eval. See the MacWispr repo's `bench/polish_finetune/` for the full, reproducible pipeline.