Skip to content

Text Cleanup

Chris Smashe edited this page Jul 27, 2026 · 5 revisions

Text Cleanup & Formatting

This is the flagship Wispr-Flow-style workflow: press a key, talk, and have clean, punctuated text land in whatever app you are in. Text cleanup turns raw dictation into polished output through a layered pipeline of deterministic and LLM-driven steps.

The Auto cleanup level control (None / Light / Medium / High) on the Dictation settings — Medium and High route through your LLM provider

Cleanup pipeline levels

The optional transcription cleanup pipeline has three levels:

Level Behavior
Light Deterministic cleanup, applied locally — no LLM.
Medium Runs the Light pass first, then sends the result to the configured LLM provider with a built-in readability prompt.
High Runs the Light pass first, then sends the result to the configured LLM provider with a built-in concise-prose prompt.

Medium and High always run the deterministic Light pass first, then send that lightened text to your configured LLM providers for the LLM pass. They use built-in system prompts baked into the cleanup service — Medium improves readability while preserving meaning, facts, tone, and terminology; High rewrites the text as concise, polished prose. If no provider is available, or the LLM call errors, both fall back to the deterministic Light result so cleanup never blocks dictation.

These built-in cleanup prompts are distinct from the seeded Auto Clean Up Text Prompts & AI actions action — that action is a separate, user-editable prompt; the Medium/High prompts are fixed in code.

What the deterministic Light pass does

The Light pass (CleanupService.CleanLight) is the local, no-LLM stage that Light always uses and Medium/High run first. It handles:

  • Filler removal ("um", "uh", "er", "you know") and abandoned leading/trailing noise.
  • "Scratch that" / self-correction backtracks ("X actually Y", "I mean") applied in place.
  • Spoken punctuation ("comma", "period" / "full stop", "question mark", "exclamation mark/point", "colon", "semicolon"), applied only where the surrounding word context fits.
  • Spoken numbers and bulleted / numbered list formatting when clearly signalled.
  • Basic sentence casing and whitespace tidy-up.

Spoken-number normalization

Separately from the cleanup levels above, a deterministic post-processing step converts spoken numbers into digits before text is inserted or exported:

Spoken Result
"twenty three" 23
"dreiundzwanzig" 23
"veintitrés" 23

It is controlled by Normalize spoken numbers to digits in Settings → Dictation and is on by default. Parsers ship for English, German, and Spanish only; other transcription languages pass through unchanged.

The parser is deliberately conservative — it won't rewrite text that is already adjacent to digits, and it leaves bare scale words alone — so ordinary prose isn't mangled. Because it runs as its own stable-ordered pipeline step, it applies at every cleanup level, including None, and to file-transcription and recorder output as well as dictation.

Translation

When a profile sets a translation target (see Profiles), the translation step must succeed for the dictation to complete. If the translation fails, the dictation is aborted and nothing is inserted — the untranslated source text is never emitted as a silent fallback. This mirrors how the LLM cleanup step is guarded.

Profile style presets

Style presets bundle a cleanup level plus formatting flags per profile, so each Profiles context can dictate-and-format differently. Each preset resolves to a cleanup level plus a smart formatting flag (enables the spoken-punctuation / spoken-number / list formatting in the Light pass), a developer formatting flag, and a terminal-safe flag:

Preset Cleanup level Flags
Raw None
Clean Light smart formatting
Concise High smart formatting
Formal email Medium smart formatting
Casual message Light smart formatting
Developer None developer formatting
Terminal-safe None developer formatting + terminal-safe
Meeting notes Medium smart formatting

Each preset can also carry optional cleanup-level and developer-formatting overrides on a per-profile basis, letting you force a different level or developer behavior than the preset's default. See Profiles for the per-profile override controls.

A profile's Style Preset selector (here set to Formal email), which bundles a cleanup level and formatting choices per profile

Developer-safe formatting

Developer-safe formatting (DeveloperFormattingService) converts spoken symbols, casing commands, and code tokens into code-friendly output, so dictation is usable in editors and terminals where literal symbols and specific casing matter. It covers:

  • Casing commandscamel case ..., snake case ..., kebab case ... rewrite the following words as camelCase, snake_case, or kebab-case.
  • Spoken email addresses — "x at y dot com" becomes x@y.com.
  • Dotted code tokens — "foo dot bar" becomes foo.bar (and numeric "two plus two" / "five minus one" become 2+2 / 5-1).
  • Symbol map — pipe |, slash /, backslash \, brackets [ ], braces { }, parentheses ( ), single/double quotes ' ", at @, hash #, dollar $, ampersand &, star *, colon :, semicolon ;, comma ,, underscore _, equals =, and "dash dash" → --.

Voice command suffixes

These voice commands are parsed at the end of a dictation and carried out:

Suffix Effect
press enter Sends Enter after the text.
new paragraph Starts a new paragraph.
new line Starts a new line.
cancel Cancels the dictation.

Spoken IDE file references

Spoken file references such as "at file dot ts" are mapped to file tags for editor and IDE workflows.

Recommended local setup

This mirrors the maintainer's daily-driver setup, tuned to feel as close to Wispr Flow as possible on Linux.

Piece What to use
LLM server An OpenAI-compatible LLM server (Ollama).
Model mistral-small:24b.
Prompt The seeded Auto Clean Up Text prompt action drives the cleanup.
Profile The seeded Auto Format profile binds that prompt action to a hotkey (Ctrl+Alt+E), so dictation goes straight through cleanup before it is inserted.

Both the Auto Clean Up Text prompt and the Auto Format profile ship seeded but disabled on a fresh install. Turn them on and point the cleanup at your own LLM. See LLM providers for configuring the OpenAI-compatible provider, and Prompts & AI actions for the prompt action and palette.

What the Auto Clean Up Text prompt does

The seeded Auto Clean Up Text system prompt steers a general-purpose LLM to clean dictation the way Wispr Flow does, treating the dictation strictly as data to format — never as a request to answer. Its design:

  • Treats the dictated text as raw data to clean and format, not as a question or instruction — a dictated question stays a question; a dictated command stays text. It never answers, decides, follows, or adds information.
  • Strips filler words ("um", "uh", "like", "you know"), false starts, repeated words, and abandoned fragments.
  • Applies spoken self-corrections in place ("actually", "I mean", "no wait", "scratch that"), swapping only the changed word or phrase and keeping the rest of the sentence intact.
  • Fixes capitalization, punctuation, grammar, and spacing, and breaks long text into readable paragraphs at natural topic changes.
  • Preserves your meaning, wording, and tone exactly — keeps contractions and casual words, and never expands or formalizes phrasing; never drops meaningful words such as trailing tag questions ("right?", "okay?").
  • Detects message/email context (greeting, recipient, sign-off) and formats it as a message with natural paragraphs.
  • Carries out spoken formatting commands and then deletes the command words — writing spoken numbers as digits, inserting spoken punctuation ("period", "comma", "question mark", "exclamation point"), and formatting bulleted/numbered lists only when clearly signalled.

The canonical copy lives in code at src/TypeWhisper.Core/Services/FirstRunDefaults.cs (AutoCleanupSystemPrompt), mirrored in docs/prompts/auto-clean-up-text.md.

The Auto Clean Up Text prompt action open in the editor, showing its system prompt

Related pages

  • Prompts & AI actions — prompt actions, provider overrides, and the prompt palette.
  • LLM providers — configuring the OpenAI-compatible (Ollama) provider that Medium/High cleanup and the cleanup prompt run against.
  • Profiles — binding a cleanup style preset and prompt action to a context.

Changelog

Date Change
2026-06-17 Initial version.
2026-06-17 Added cleanup, style-preset, and system-prompt screenshots.
2026-06-17 Removed unused screenshot placeholders.
2026-06-17 Added style-preset resolution table and smart-formatting flag, documented the built-in Medium/High prompts and Light-first/fallback behavior, attributed deterministic formatting to the Light pass, and expanded developer-safe formatting (casing, emails, code tokens, symbol map).
2026-07-27 v0.12.1: documented the deterministic spoken-number normalization step (en/de/es, on by default) and that a failed translation aborts the dictation instead of emitting the source text.

Clone this wiki locally