s1-mini-de-v3

A German dictation-normalization model: a full finetune of superwhisper/s1-mini (Qwen3, 596M params) that cleans raw German ASR output โ€” filler words, stutters, self-corrections, du/Sie styling, list formatting, and spoken-number conversion โ€” into finished written German.

It is the normalizer stage of yappr, a local press-to-talk dictation app for Hyprland/Wayland (Parakeet TDT v3 German ASR โ†’ this model โ†’ guardrail โ†’ typed into the focused window). It runs in-process via llama.cpp.

This repo ships the v3 checkpoint: s1-mini-q4_k_m-de-v3.gguf (Q4_K_M, 379 MB)

sha256: 1cc4f7e0bad193ed98da7267f26be074f90ad42f2a5bdaecf5521772f0c227a3

What it does

Input is real Parakeet TDT 0.6b v3 German output: already punctuated and capitalized, fillers kept verbatim ("รคh", "รคhm", "halt", "quasi"), numbers usually as words (including German ones-before-tens order: "siebenundachtzig" = 87), occasional compound splits ("Holz Dieb") and misheard words. The model:

  • removes fillers and stutter repetitions, repairs self-corrections
  • applies a requested styling axis (casual โ€ฆ formal, incl. du โ†’ Sie conversion)
  • emits real list lines when the speaker enumerates (structure: lists)
  • converts only the saturated number forms: clock times ("vierzehn Uhr dreiรŸig" โ†’ "14:30 Uhr"), percentages ("siebenundachtzig Prozent" โ†’ "87 Prozent"), dates, years, money with German thousands point ("zwei tausend acht hundert Euro" โ†’ "2.800 Euro"); relative times like "halb drei" deliberately stay as words
  • otherwise leaves correct words alone โ€” the downstream guardrail rejects any output with < 70 % token overlap against the input

Prompt format

ChatML (Qwen3), greedy sampling, with a pre-closed think block. The user turn starts with a control line:

<|im_start|>system
You are a text normalizer for speech-to-text transcripts. The input begins with a control line specifying the styling, structure, and context settings; clean the transcript to match those settings and output only the cleaned text.<|im_end|>
<|im_start|>user
[Styling: semi-casual] [Structure: prose] [Context: general]
ร„hm ja also ich glaub wir sollten das Meeting auf vierzehn Uhr dreiรŸig verschieben.<|im_end|>
<|im_start|>assistant
<think>

</think>
  • Styling: casual | semi-casual | semi-formal | formal
  • Structure: prose | lists
  • Context: general | email

Run it with llama.cpp:

llama-server -m s1-mini-q4_k_m-de-v3.gguf -c 4096 --port 8899
python3 probes/run.py --out results.json   # needs the yappr source tree, see below

Training

Full SFT (not LoRA) on one RTX 3090 โ€” see train_s1_de.py:

  • base: superwhisper/s1-mini @ 88f6b15896c73bbb13a3b596e0afe8ea0d5150b4 (the upstream repo replaces weights in place; pin the sha)
  • 3 epochs, lr 1e-5 cosine (S1-mini is already a finetuned specialist; higher LRs destroy its control-line behaviour), effective batch 32, bf16, max_length 1024, no packing, loss masked to the completion
  • exported to GGUF and quantized to Q4_K_M with export_gguf.py

Dataset and eval code in this repo

  • SPEC.md โ€” the dataset spec: the measured Parakeet output style, the guardrail constraints every row must survive (โ‰ฅ 0.70 token overlap is the one that bites), the number-conversion table, and what each part file targets.
  • part-*.jsonl โ€” the dataset sources (~1000 rows). Parts gโ€“o each pin a measured failure class, written after reproducing it. build_dataset.py assembles train.jsonl/val.jsonl with per-part oversampling (PART_WEIGHTS).
  • probes/ โ€” 69 held-out failure-class probes (never training data) plus recorded answers for the baseline, v2, v3, and v4 checkpoints. probes/run.py renders the prompt byte-identically to yappr's normalize::render_chat_prompt by reading the system prompt out of the Rust source, so it needs the yappr source tree to run; the exact prompt is reproduced above.

Versioning note: v3 was trained on parts aโ€“n. part-o-v3-residuals.jsonl is included here for completeness but postdates this checkpoint โ€” it pins what v3 left broken (auxiliary-switch chains under a lead-in, over-listing of three-item chains, more "siebenundachtzig" contexts) and feeds the next retune.

License

Inherits the license of superwhisper/s1-mini (license: other), itself a finetune of Qwen/Qwen3-0.6B. Check the base model's terms before commercial use.

Downloads last month
-
GGUF
Model size
0.6B params
Architecture
qwen3
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 Joni000000000/s1-mini-de-v3

Finetuned
Qwen/Qwen3-0.6B
Quantized
(11)
this model