Kanso Koi 1.0 (1.7B + LoRA adapter)

Names. ZenVoice's formatting models are called Kanso since ZenVoice 1.3.1: Kanso Koi 1.0 was ZenPolish v2.2 Lite, Koi 0.9 was ZenPolish v2.2, Koi 0.8 was ZenPolish v2, Kanso Satori 1.0 was ZenPolish v3.2 4B and Satori 0.9 was ZenPolish v3 4B. The repositories were renamed from zen-polish-โ€ฆ; old links and pinned revisions redirect here. Tables below use the development version numbers (v2, v2.1, v2.2, v3, v3.1, v3.2).

ZenVoice's on-device dictation-enhancement model, compact tier. The 4B tier is Kanso-Satori-1.0. It takes raw speech-to-text output and restores:

  • punctuation and capitalization,
  • filler removal (leading and mid-sentence),
  • false-restart removal,
  • inverse text normalization: numbers, money, dates, times, percents, emails, URLs, phones,
  • meaning-preserving grammar repair.

It runs fully on-device via MLX.

Ship format: a 4-bit base (968 MB) + a bf16 LoRA adapter (70 MB), applied live. The adapter is in adapters/ and must be loaded on top of the base weights (LoRAContainer in mlx-swift-lm). Do NOT merge the adapter into the weights: fusing measurably damages behavior (money ITN and filler deletion).

Lite vs the original v2.2 upload. The original v2.2 upload, Kanso-Koi-0.9 at revision 53bd03b, shipped a 6-bit base (1.40 GB) derived from the v2.1 model. Lite ships the clean mlx-community/Qwen3-1.7B-4bit base the adapter was trained on, with the same adapter stored in bf16 instead of fp32. It is 32% smaller, decodes about 40% faster, and is more accurate (below).

It was first published as Kanso-Koi-0.9 revision 26b2ee6. The files here are identical to that revision with one exception: the unused config field in adapters/adapter_config.json now holds a bare file name instead of a local path.

Benchmark

500-dictation suite (eval_v500, leakage-controlled). Greedy decoding, Apple M5, MLX 0.32.2. "Original v2.2" is Kanso-Koi-0.9 at 53bd03b:

Metric Lite Original v2.2
WER 5.5% 6.7%
Exact match 65.8% 53.6%
Punct F1 0.863 0.759
Sentence-start 94.4% 91.6%
Bundle size 1.05 GB 1.55 GB
Peak memory 1.19 GB 1.77 GB
Decode speed 73 tok/s 51 tok/s

ZenVoice app runtime (mlx-swift-lm, the app's own formatting pipeline, eval_v500). The original v2.2 is shown in brackets.

  • Model output: WER 4.0% (4.7%), exact match 65.4% (43.2%).
  • Time: mean 0.23 s per dictation (0.27 s).
  • Peak memory: 1.39 GB (1.94 GB).

234-row leakage-controlled suite, as published for v2.2:

Metric v2.2 v3 (4B) v2.1 v2 Stock 1.7B
WER 9.9% 17.2% 12.6% 30.5% 11.0%
Exact match 50.4% 41.0% 29.9% 23.1% 5.0%
Punct F1 0.832 0.750 0.573 0.649 0.634
Casing acc 98.3% 95.6% 97.0% 92.4% 96.3%
Sent-start 90.9% 80.7% 86.2% 62.1% 74.9%
Hallucination 0.0โ€“7.2% 10.8% 7.2% 23.0% 0.9%

Lite with its bf16 adapter scores WER 9.7%, exact match 50.4% and punct F1 0.831 on the same 234 rows.

Usage

Load base + adapter (mlx-lm):

from huggingface_hub import snapshot_download
from mlx_lm import load, generate
from mlx_lm.sample_utils import make_sampler

path = snapshot_download("BuilderHelm/Kanso-Koi-1.0")
model, tokenizer = load(path, adapter_path=f"{path}/adapters")

SYSTEM = ("You clean up raw speech-to-text dictation. Fix punctuation and "
          "capitalization, remove filler words and false restarts, and restore the "
          "written forms of numbers, dates, times, money, URLs, and email "
          "addresses. Keep the speaker's meaning and wording. If an 'app:' line is "
          "given, match capitalization and tone to that context. Output only the "
          "cleaned text, with no commentary.")
messages = [{"role": "system", "content": SYSTEM},
            {"role": "user", "content": "the budget is two thousand five hundred dollars and fifty cents"}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False)
print(generate(model, tokenizer, prompt=prompt, max_tokens=200, sampler=make_sampler(temp=0.0)))
# -> "The budget is $2,500.50."

Training

Qwen3-1.7B-4bit, LoRA rank 32 / alpha 64 / scale 2.0, cosine decay 1e-4โ†’1e-6 with no warmup, dropout 0.05, 3,500 iters on a 90k-pair, 10-source corpus:

  • dictation cleanup and real-ASR pairs,
  • DisfluencySpeech mid-sentence fillers,
  • Hansard question intonation,
  • earnings-call money ITN,
  • BudgieScribe filler + money combined patterns,
  • Gutenberg exclamation mining,
  • go_emotions expressive targets,
  • identity passthrough negatives,
  • the v2.1 relabeled corpus.

Label-consistency policies: mid-sentence filler deletion, money always โ†’ $, exclamation preserved, sentence-start casing. Full pipeline: training/data_v22/ in the ZenVoice repo.

License

Apache-2.0 (Qwen3-1.7B base). Training data: MIT/Apache-2.0/CC-BY-4.0/CC0 sources only; attribution list in the ZenVoice repo.

Published under BuilderHelm AI. Previously imYChaudhary22/Kanso-Koi-1.0; existing repository links and pinned revisions redirect to this organization repository. Model filenames and weights are unchanged.

Downloads last month
228
Safetensors
Model size
2B params
Tensor type
U32
ยท
BF16
ยท
MLX
Hardware compatibility
Log In to add your hardware

4-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for BuilderHelm/Kanso-Koi-1.0

Finetuned
Qwen/Qwen3-1.7B
Adapter
(15)
this model

Collection including BuilderHelm/Kanso-Koi-1.0