Special-purpose model. This checkpoint does exactly one job: cleaning up speech-to-text output under the fixed system prompts and JSON output contract documented below. It is not a general-purpose chat or instruction model; off-task use (open-ended chat, question answering) is unsupported and will underperform the base model. All Yooz task models are collected in Yooz Working Models; for general-purpose local LLMs see Lean QAT MLX.
Speech-to-text touchup model from Yooz Labs.
Takes raw STT output and returns a cleaned-up version, either lightly proofread
or more aggressively rewritten, as a single JSON object: {"result": "..."}.
This is the second-generation Quality tier of the Yooz Engine touchup stack. It runs fully on-device on Apple Silicon via MLX, in the privacy-first Yooz tradition: no cloud, no logging, no leak.
{"result": "<cleaned text>"}. No explanation, no markdown.mlx-community/Qwen3.5-0.8B-MLX-4bit (Apache 2.0).mlx-lm,
then fused with mlx_lm.fuse into a standalone 4-bit checkpoint.yooz-touchup synthetic dataset, 5,936 samples covering:
proofread, rewritecasual, technical, business, dictationeasy, medium, hardBenchmarked on the gold-standard test split of yooz-touchup (n=5,936),
combining both proofread and rewrite prompts.
| Metric | Value |
|---|---|
| Exact match (combined) | 19.4% |
| JSON parse rate | 99.4% |
| Avg CER | 0.263 |
| Avg semantic similarity | 0.902 |
| Avg latency (M-series, batch=1) | 311 ms |
By mode:
| Mode | EM | CER | Sim |
|---|---|---|---|
| Proofread | 32.4% | 0.063 | 0.944 |
| Rewrite | 6.4% | 0.463 | 0.860 |
By difficulty:
| Difficulty | n | EM | CER | Sim |
|---|---|---|---|---|
| easy | 2,234 | 35.7% | 0.286 | 0.918 |
| medium | 2,290 | 12.6% | 0.233 | 0.900 |
| hard | 1,412 | 4.6% | 0.275 | 0.881 |
By domain:
| Domain | n | EM | CER | Sim |
|---|---|---|---|---|
| casual | 706 | 41.4% | 0.401 | 0.910 |
| technical | 3,318 | 14.2% | 0.249 | 0.891 |
| business | 1,866 | 20.0% | 0.237 | 0.920 |
| dictation | 46 | 32.6% | 0.221 | 0.871 |
Latency was measured on Apple Silicon M-series with mlx-lm, batch size 1,
max_tokens=320. Full ablation in
yooz-engine#75.
Both modes use a system prompt + the raw STT transcription as the user message. Use these system prompts verbatim -- the model was trained on them and behavior degrades with paraphrases.
You are a copy editor. Proofread the speech-to-text transcription provided by the user. Fix spelling, punctuation, capitalization, and obvious word-choice errors caused by the speech-to-text engine. Convert spoken numbers to digits where it improves clarity (e.g. "nine am" -> "9 AM"). Keep the speaker's voice; do NOT rephrase or remove filler words (um, uh, like). Output ONLY a single JSON object of the form {"result": "<corrected>"} where <corrected> is the actual corrected text. No explanation, no markdown.
You are an editor. Rewrite the speech-to-text transcription provided by the user for clarity and readability. Fix grammar, spelling, and punctuation. Remove filler words (um, uh, like, you know, basically). Convert spoken numbers to digits. Split run-on sentences. Preserve the original meaning and intent. Output ONLY a single JSON object of the form {"result": "<rewritten>"} where <rewritten> is the actual rewritten text. No explanation, no markdown.
from mlx_lm import load, generate
model, tokenizer = load("YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA")
PROOFREAD_SYSTEM = (
"You are a copy editor. Proofread the speech-to-text transcription provided by the "
"user. Fix spelling, punctuation, capitalization, and obvious word-choice errors "
"caused by the speech-to-text engine. Convert spoken numbers to digits where it "
"improves clarity (e.g. \"nine am\" -> \"9 AM\"). Keep the speaker's voice; do NOT "
"rephrase or remove filler words (um, uh, like). "
"Output ONLY a single JSON object of the form {\"result\": \"<corrected>\"} where "
"<corrected> is the actual corrected text. No explanation, no markdown."
)
raw_stt = "um so the meeting is at nine am tomorow with sarah from product"
messages = [
{"role": "system", "content": PROOFREAD_SYSTEM},
{"role": "user", "content": raw_stt},
]
prompt = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, tokenize=False
)
response = generate(model, tokenizer, prompt=prompt, max_tokens=320, verbose=False)
# response is a JSON string: {"result": "Um, so the meeting is at 9 AM tomorrow with Sarah from Product."}
import json
cleaned = json.loads(response)["result"]
print(cleaned)
For rewrite mode, swap the system prompt for REWRITE_SYSTEM (above).
If you have the Yooz Engine menu
bar service running, this model is consumed via the local API on
localhost:19920:
curl -s http://localhost:19920/v1/touchup \
-H 'Content-Type: application/json' \
-d '{
"text": "um so the meeting is at nine am tomorow with sarah from product",
"mode": "proofread"
}'
# {"result": "Um, so the meeting is at 9 AM tomorrow with Sarah from Product."}
The engine handles model loading, batching, and JSON enforcement. See the engine's API docs.
If you'd rather keep the base model unmodified and apply the LoRA adapter at
load time, the adapter weights live under adapters/ in this repo:
from mlx_lm import load
model, tokenizer = load(
"mlx-community/Qwen3.5-0.8B-MLX-4bit",
adapter_path="YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA/adapters",
)
Files:
adapters/adapters.safetensors -- LoRA weights (~7 MB)adapters/adapter_config.json -- LoRA hyperparamsadapters/lora_params.yaml -- training config snapshotSim and a downstream judge, not
EM, to evaluate rewrite quality.{"result":"..."}. Strip with
json.loads(response)["result"]. JSON parse rate is 99.4%; handle the
0.6% with try/except plus a regex fallback.Qwen/Qwen3.5-0.8B weights if you need CUDA / CPU.@misc{yooz-quality-v2-2026,
title = {Yooz-Quality-v2-Qwen3.5-0.8B-LoRA: On-device speech-to-text touchup model},
author = {Yooz Labs},
year = {2026},
publisher = {Hugging Face},
url = {https://huggingface.co/YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA},
}
@misc{qwen3-2025,
title = {Qwen3 Technical Report},
author = {Qwen Team},
year = {2025},
publisher = {Alibaba},
}
Built on top of the Qwen3.5 base model from the Qwen team at Alibaba. LoRA fine-tune, dataset, and packaging by Yooz Labs.
Apache 2.0, matching the Qwen3.5 base model. See LICENSE upstream.
mlx-community/Qwen3.5-0.8B-MLX-4bit.Sovereign Intelligence. Built for the skeptical.
Special-purpose model. This checkpoint does exactly one job: cleaning up speech-to-text output under the fixed system prompts and JSON output contract documented below. It is not a general-purpose chat or instruction model; off-task use (open-ended chat, question answering) is unsupported and will underperform the base model. All Yooz task models are collected in Yooz Working Models; for general-purpose local LLMs see Lean QAT MLX.
Speech-to-text touchup model from Yooz Labs.
Takes raw STT output and returns a cleaned-up version, either lightly proofread
or more aggressively rewritten, as a single JSON object: {"result": "..."}.
This is the second-generation Quality tier of the Yooz Engine touchup stack. It runs fully on-device on Apple Silicon via MLX, in the privacy-first Yooz tradition: no cloud, no logging, no leak.
{"result": "<cleaned text>"}. No explanation, no markdown.mlx-community/Qwen3.5-0.8B-MLX-4bit (Apache 2.0).mlx-lm,
then fused with mlx_lm.fuse into a standalone 4-bit checkpoint.yooz-touchup synthetic dataset, 5,936 samples covering:
proofread, rewritecasual, technical, business, dictationeasy, medium, hardBenchmarked on the gold-standard test split of yooz-touchup (n=5,936),
combining both proofread and rewrite prompts.
| Metric | Value |
|---|---|
| Exact match (combined) | 19.4% |
| JSON parse rate | 99.4% |
| Avg CER | 0.263 |
| Avg semantic similarity | 0.902 |
| Avg latency (M-series, batch=1) | 311 ms |
By mode:
| Mode | EM | CER | Sim |
|---|---|---|---|
| Proofread | 32.4% | 0.063 | 0.944 |
| Rewrite | 6.4% | 0.463 | 0.860 |
By difficulty:
| Difficulty | n | EM | CER | Sim |
|---|---|---|---|---|
| easy | 2,234 | 35.7% | 0.286 | 0.918 |
| medium | 2,290 | 12.6% | 0.233 | 0.900 |
| hard | 1,412 | 4.6% | 0.275 | 0.881 |
By domain:
| Domain | n | EM | CER | Sim |
|---|---|---|---|---|
| casual | 706 | 41.4% | 0.401 | 0.910 |
| technical | 3,318 | 14.2% | 0.249 | 0.891 |
| business | 1,866 | 20.0% | 0.237 | 0.920 |
| dictation | 46 | 32.6% | 0.221 | 0.871 |
Latency was measured on Apple Silicon M-series with mlx-lm, batch size 1,
max_tokens=320. Full ablation in
yooz-engine#75.
Both modes use a system prompt + the raw STT transcription as the user message. Use these system prompts verbatim -- the model was trained on them and behavior degrades with paraphrases.
You are a copy editor. Proofread the speech-to-text transcription provided by the user. Fix spelling, punctuation, capitalization, and obvious word-choice errors caused by the speech-to-text engine. Convert spoken numbers to digits where it improves clarity (e.g. "nine am" -> "9 AM"). Keep the speaker's voice; do NOT rephrase or remove filler words (um, uh, like). Output ONLY a single JSON object of the form {"result": "<corrected>"} where <corrected> is the actual corrected text. No explanation, no markdown.
You are an editor. Rewrite the speech-to-text transcription provided by the user for clarity and readability. Fix grammar, spelling, and punctuation. Remove filler words (um, uh, like, you know, basically). Convert spoken numbers to digits. Split run-on sentences. Preserve the original meaning and intent. Output ONLY a single JSON object of the form {"result": "<rewritten>"} where <rewritten> is the actual rewritten text. No explanation, no markdown.
from mlx_lm import load, generate
model, tokenizer = load("YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA")
PROOFREAD_SYSTEM = (
"You are a copy editor. Proofread the speech-to-text transcription provided by the "
"user. Fix spelling, punctuation, capitalization, and obvious word-choice errors "
"caused by the speech-to-text engine. Convert spoken numbers to digits where it "
"improves clarity (e.g. \"nine am\" -> \"9 AM\"). Keep the speaker's voice; do NOT "
"rephrase or remove filler words (um, uh, like). "
"Output ONLY a single JSON object of the form {\"result\": \"<corrected>\"} where "
"<corrected> is the actual corrected text. No explanation, no markdown."
)
raw_stt = "um so the meeting is at nine am tomorow with sarah from product"
messages = [
{"role": "system", "content": PROOFREAD_SYSTEM},
{"role": "user", "content": raw_stt},
]
prompt = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, tokenize=False
)
response = generate(model, tokenizer, prompt=prompt, max_tokens=320, verbose=False)
# response is a JSON string: {"result": "Um, so the meeting is at 9 AM tomorrow with Sarah from Product."}
import json
cleaned = json.loads(response)["result"]
print(cleaned)
For rewrite mode, swap the system prompt for REWRITE_SYSTEM (above).
If you have the Yooz Engine menu
bar service running, this model is consumed via the local API on
localhost:19920:
curl -s http://localhost:19920/v1/touchup \
-H 'Content-Type: application/json' \
-d '{
"text": "um so the meeting is at nine am tomorow with sarah from product",
"mode": "proofread"
}'
# {"result": "Um, so the meeting is at 9 AM tomorrow with Sarah from Product."}
The engine handles model loading, batching, and JSON enforcement. See the engine's API docs.
If you'd rather keep the base model unmodified and apply the LoRA adapter at
load time, the adapter weights live under adapters/ in this repo:
from mlx_lm import load
model, tokenizer = load(
"mlx-community/Qwen3.5-0.8B-MLX-4bit",
adapter_path="YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA/adapters",
)
Files:
adapters/adapters.safetensors -- LoRA weights (~7 MB)adapters/adapter_config.json -- LoRA hyperparamsadapters/lora_params.yaml -- training config snapshotSim and a downstream judge, not
EM, to evaluate rewrite quality.{"result":"..."}. Strip with
json.loads(response)["result"]. JSON parse rate is 99.4%; handle the
0.6% with try/except plus a regex fallback.Qwen/Qwen3.5-0.8B weights if you need CUDA / CPU.@misc{yooz-quality-v2-2026,
title = {Yooz-Quality-v2-Qwen3.5-0.8B-LoRA: On-device speech-to-text touchup model},
author = {Yooz Labs},
year = {2026},
publisher = {Hugging Face},
url = {https://huggingface.co/YoozLabs/Yooz-Quality-v2-Qwen3.5-0.8B-LoRA},
}
@misc{qwen3-2025,
title = {Qwen3 Technical Report},
author = {Qwen Team},
year = {2025},
publisher = {Alibaba},
}
Built on top of the Qwen3.5 base model from the Qwen team at Alibaba. LoRA fine-tune, dataset, and packaging by Yooz Labs.
Apache 2.0, matching the Qwen3.5 base model. See LICENSE upstream.
mlx-community/Qwen3.5-0.8B-MLX-4bit.Sovereign Intelligence. Built for the skeptical.