Skip to content

Sotto v0.1.2

Choose a tag to compare

@github-actions github-actions released this 21 Sep 08:38

Sotto 0.1.2 corrects Russian typos without an LLM, keeps macOS permissions across an update, and repairs the interface failures that only appeared in a packaged build. Most of the release is the result of an audit of the recording, saving and formatting paths.

New and improved

  • Typos are corrected offline. Processing → Text → Cleanup → Correct spelling checks lowercase Russian words against a bundled Hunspell dictionary — no LLM, no network, any speech engine, enabled by default. It only acts when a single valid candidate sits one edit away and the change repairs a mechanical error: a repeated letter, transposed neighbours, a trailing «э», or a missing hyphen with «кое-», «-то», «-либо», «-нибудь». It runs when the dictation language is Russian; Auto and other languages leave spelling alone. See Dictionaries.

  • Cleanup no longer edits your code. Backtick spans and fences, email addresses, paths, links and dotted names such as Cargo.toml keep their spaces and letter case through every automatic step. Enabled replacement rules reserve their matches before cleanup runs, so an explicit rule always wins; disabled and invalid rules reserve nothing.

  • Cleanup keeps what it used to swallow. A run that would leave nothing behind returns the original transcription, unless the deletion was explicit. Comma cleanup drops duplicates and a leading comma but keeps commas before conjunctions, «в общем и целом» and «чуть чуть» survive, and a missing space after a period is restored only before a capital letter, so lowercase domain names stay whole.

  • The glow answers a syllable. The voice-reactive overlay ran at the values its source library was authored for — a 0.325 s attack is longer than a syllable, so the level never reached its peak and every layer stayed dim. The envelope now follows speech, and the processing beam takes 1.5 s per pass instead of 2.8 s.

  • Every overlay position is visible. The nine anchor zones on the position picker drew nothing until the pointer was over them. Each now carries a dot in the overlay's own colour, brighter under the pointer and absent where the preview stands.

  • Model cards fill their bars where the answer is known. Sotto asks for the GPU by default while every reference measurement is a processor one, so most cards showed two hatched bars. Speed now borrows the nearest measurement of the same model, draws that bar fainter and names the context it came from. Memory counts a loaded model's own footprint back into the budget and treats Apple Silicon's shared pool as the processor's. Twelve of the twenty-one catalogue models still have no measurement and stay unknown.

  • macOS releases are signed with a stable identity. Previously each build was identified by its code hash, so every update was a new application to the system and both the microphone grant and the paste stopped working. Builds now carry an identity that survives an update. This is not Developer ID and changes nothing about Gatekeeper.

  • Formatting stays off the interface thread. Local formatting and dictionary preparation run on background workers for dictation, file transcription and the preview. On synthetic fixtures the 3000-word word diff went from 274.69 to 0.397 ms, formatting 480 English words against 1000 terms from 296.63 to 35.02 ms, and decoding 120 s at 96 kHz dropped peak live allocations from 83.40 to 10.71 MB. These are fixture measurements, not end-to-end dictation latency.

Fixed

  • Changing the interface language no longer leaves a second tray icon. Rebuilding a tray with the same ID does not replace the existing one, so each switch added a live icon. The original is reused and only its menu is rebuilt.

  • The light theme survives a packaged build. The production minifier shortened colours into a form the interface then rejected, and a failed lazy chunk left History unable to load. History now offers a retry, an unavailable glow animation no longer takes recording cancellation down with it, and startup before CSS is ready is handled.

  • A cloud request is no longer sent twice. A delayed response, a timeout and a cancellation each kept a single request. Inference errors are reported as errors instead of coming back as empty speech, and cancelling a file transcription now also stops optional LLM processing.

  • Saved settings arrive whole. Database migrations and legacy imports are transactional, configuration writers are serialized, and a hotkey whose write fails goes back to the shortcut that actually owns it. The AI page keeps your draft, reports a save only when it succeeded, and applies a locale change after the save rather than before.

  • Short API keys are no longer mostly readable. The long mask reveals six leading and four trailing characters but took effect from eleven, printing ten of them.

  • A file whose sample rate changes is named correctly. It is two recordings joined or a chained Ogg stream, not a damaged file; the message now sends you to re-encoding instead of to corruption.

  • Model downloads notice a stalled network. A connection that stops responding times out instead of hanging, without restarting the request; verification reads in chunks rather than loading the model into memory.

  • Overlay messages keep their order. A stale timer could hide a newer message, and the tray footer stayed visible at its own viewport size.

Update notes

  • macOS asks for the microphone once more on this update. 0.1.1 was identified by its code hash, so the move to a signed identity is still a new application to the system: grant the microphone again, and for the paste remove Sotto from Privacy & Security → Accessibility and add the updated /Applications/Sotto.app — toggling the switch is not enough. Updates from 0.1.2 onward keep both grants.
  • Correct spelling is on by default. It only touches Russian dictation and never invents a substitution, but it does change text a previous version delivered as recognised. Switch it off under Processing → Text → Cleanup, or disable local formatting entirely.
  • A replacement rule now wins over automatic cleanup. If a rule and a cleanup step disagreed before, the result changes in the rule's favour.
  • Windows x64 still requires AVX2, FMA and F16C, unchanged from 0.1.1; see Platforms.

Full changelog