Skip to content

feat(stt): add parakeet - #2

Merged
sebastienfontaine merged 9 commits into
mainfrom
feat/parakeet-stt
Sep 3, 2026
Merged

feat(stt): add parakeet#2
sebastienfontaine merged 9 commits into
mainfrom
feat/parakeet-stt

Conversation

@sebastienfontaine

@sebastienfontaine sebastienfontaine commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Adds NVIDIA Parakeet as a fifth STT engine, running entirely on the machine.

Description written retroactively, after the fact: the PR was merged without one.

The engine

parakeet-tdt-0.6b-v3 through ONNX Runtime (parakeet-rs), multilingual across 25 languages with automatic detection. No audio ever leaves the machine and no API key is needed.

The int8 quantized export (~640 MB, against 2.5 GB for fp32) is downloaded from HuggingFace on demand, from the settings, with progress reporting, cancellation, integrity checking against content-length, and .part cleanup on failure. The model is loaded at startup rather than on first use, so the first dictation does not pay the ONNX load.

Since transcription is local but reformulation is not, parakeet_reformulation_provider lets you pick which chat provider handles the rewriting — or none, in which case the transcription is pasted as-is and the pipeline stays fully local.

Fixes that came with it

Reviewing the engine surfaced problems that predated it and affected all five engines:

  • Failures were silent. Every engine logged inference errors and emitted nothing, so a failed dictation pasted nothing with no explanation. SttEvent::Error now travels to a toast and a red overlay pill. A recording shorter than a second, empty buffer included, says so instead of vanishing.
  • Cancel transcribed what it was cancelling. Cmd+Shift+C went through pipeline.stop(), which flushes: it ran the transcription the user had just discarded, froze the overlay until it returned, and billed an API request for it. It now resets the engine instead.
  • The flush blocked a tokio worker. stop_recording_internal now runs it through spawn_blocking.
  • Deleting the local model left the engine loaded, still transcribing from a model the UI reported as absent.

Housekeeping

  • parakeet-rs 0.3.5 → 0.3.7 (ort rc.13)
  • Patched every open Dependabot alert except glib, which is Linux-only and pinned by Tauri's webkit stack: tauri 2.11.5, openssl 0.10.81, rustls-webpki 0.103.15, serde_with 3.22.0, tar 0.4.46, plus the npm dev tooling
  • Untracked src-tauri/gen/schemas, regenerated at every build

Verification

Local transcription measured end to end on real audio: model loaded in 0.8s, 4.8s of French speech transcribed in 0.1s, accurate. Two unit tests cover the cancel path and the blocking flush. Released as v0.7.0.

sebastien.fontaine and others added 4 commits June 3, 2026 20:46
- ParakeetEngine (parakeet-rs / ONNX Runtime, parakeet-tdt-0.6b-v3 int8)
- multilingual (25 languages) with auto language detection
- model downloader with progress (HuggingFace, ~670 MB) + delete
- Engine settings page: Parakeet option, download UI, local model info

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When STT is local (Parakeet), let the user pick which chat provider
(OpenAI, Groq, Mistral, Gemini) handles reformulation/translation,
with the matching API key field in the settings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sebastienfontaine sebastienfontaine self-assigned this Jun 11, 2026
sebastienfontaine and others added 5 commits September 3, 2026 22:48
src-tauri/gen/schemas is regenerated at every build; keeping it tracked only produced diff noise (a linux schema landed in the parakeet branch).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Pulls ort rc.13, cached mel FFTs and the streaming decoder fixes. The only breaking change (ParakeetUnified::from_shared) is on an API we don't use.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every engine used to swallow inference failures: a dictation that failed
pasted nothing with no explanation. SttEvent::Error is now emitted by all
five engines, shown as a toast in the settings window and as a red pill in
the overlay before it hides.

Parakeet also paid its ONNX load (~1s) on the first dictation. The engine
is now pre-created at startup, on engine switch and once the download
finishes, and dropped when the local model is deleted (it kept
transcribing from a model the UI reported as absent).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Covers every open Dependabot alert except glib (Linux-only, pinned by the
webkit2gtk stack, needs an upstream tauri bump).

npm (dev tooling only): vite 7.3.6, rollup 4.63.1, postcss 8.5.28,
nanoid 3.3.18, picomatch 4.0.7, @babel/core 7.29.7.
rust: tauri 2.11.5, openssl 0.10.81, rustls-webpki 0.103.15,
serde_with 3.22.0, tar 0.4.46, rand 0.9.5 (0.7/0.8 dropped).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…nload

Cancel (Cmd+Shift+C) went through pipeline.stop(), which flushes: it
transcribed the very audio the user asked to throw away, froze the overlay
until the result came back and, on the API engines, billed a request for
it. It now resets the engine instead. Same for the engine switch, whose
flush events had nowhere to go.

The flush blocks until the transcription completes, so stop_recording_internal
now runs it through spawn_blocking rather than stalling a tokio worker.

Downloads: the progress counter only counts the files actually missing, a
truncated body (HTTP 200 with a short read) is rejected instead of being
installed as valid, partial files are cleaned up on failure, and the whole
thing can be cancelled from the UI.

A recording under a second, empty buffer included, now says so instead of
vanishing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@sebastienfontaine
sebastienfontaine merged commit 2ffe68c into main Sep 3, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant