Draft: Add Parakeet MLX STT feasibility harness - #313
Merged
Conversation
rgbkrk
marked this pull request as ready for review
July 7, 2026 15:49
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — Adds an external Parakeet MLX eval harness to eval/evaluate.py alongside a feasibility doc; the existing Whisper eval path is unchanged and the new path is opt-in everywhere.
eval/evaluate.py— Parakeet MLX engine — renamestranscribe→transcribe_voice, addstranscribe_parakeet_mlx+ dispatcher, threadsengine/parakeet_bin/parakeet_cache_dirthroughevaluate(), extends JSON output withengine,error_count, and Parakeet binary metadata, and adds strict-by-default exit behavior with--allow-errorsescape hatch.eval/compare.sh+eval/synth_eval.sh— appends an opt-inPARAKEET_MLX=1block usinguv run --with parakeet-mlx; existing Whisper model matrix is untouched.eval/test_evaluate.py— adds four new unit tests coveringparakeet_txt_output_path,build_parakeet_mlx_command, and theexit_code_for_summarystrict/lenient paths.docs/parakeet-stt-feasibility.md— records smoke evidence, streaming assessment, native Candle blockers, and a recommended next slice. All 11 tests pass.
ℹ️ Nitpicks
eval/compare.sh:44andeval/synth_eval.sh:57invokeuv run --with parakeet-mlx python eval/evaluate.pywhile the adjacent Whisper legs usepython3. Withinuv runthis works fine (uvalways exposespythonin the managed venv), but it's inconsistent —python3in both paths would be more uniform.evaluate()and its call sites always receive aparakeet_binargument and emit"parakeet_binary"in the JSON result even whenengine == "voice". The field is harmless but adds noise to Whisper eval JSON files; passingNoneor omitting the field for thevoiceengine would keep the output schema tighter.
us.anthropic.claude-sonnet-4-6 | 𝕏
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
This is an external Parakeet feasibility harness and documentation slice, not a native Rust Parakeet backend.
eval/evaluate.py --engine parakeet-mlxso the existing WER/CER scorer can run MLX Parakeet on the same recording fixtures as the currentvoiceCLI path.PARAKEET_MLX=1support toeval/compare.shandeval/synth_eval.sh; existing Whisper model matrices stay unchanged by default.docs/parakeet-stt-feasibility.md.Feasibility status
mlx-community/parakeet-tdt-0.6b-v3mlx-community/parakeet-tdt-0.6b-v2mlx-community/parakeet-ctc-1.1bparakeet-mlxruns locally on Apple Silicon without CUDA or NeMo runtime assumptions.voiceis an explicit eval/final-pass harness. This PR does not routevoice listen,voice transcribe, or the daemon through Python/MLX.Local smoke evidence
Parakeet TDT v3 first run:
real 810.15Fox jumps over the lazy dog.The quick brown fox jumps over the lazy dog.~/.cache/huggingface/hub/models--mlx-community--parakeet-tdt-0.6b-v32,508,288,736bytesCached Parakeet TDT v3 eval:
real 5.3017.1s0.28160/241.7%001 => Fox jumps over the lazy dog.,002 => Shells by the seashore.Current Rust Whisper default comparison:
cargo build -p voicepassed after LFS data was fetched into this Codex worktree.real 7.6717.1s0.44450/236.1%001 => The fox jumps over the lazy dog.,002 => Shells by the seashore.Parakeet TDT v2:
mlx-community/parakeet-tdt-0.6b-v2and interrupted afterreal 182.06because no visible model-cache progress occurred beyond a 40 KB repo stub.Verification
Review fixes
Follow-up commit
122a831addresses the first adversarial review pass:error_countand makeeval/evaluate.pyexit nonzero by default.--allow-errorsis available only for exploratory runs that intentionally want empty/error transcripts scored without failing the process.eval/compare.shandeval/synth_eval.shnow run the optional Parakeet leg throughuv run --with parakeet-mlx python eval/evaluate.py, so a clean checkout withuvdoes not need a preinstalledparakeet-mlxscript.Review-fix verification:
git diff --check python3 -m unittest eval.test_evaluate bash -n eval/compare.sh bash -n eval/synth_eval.sh cargo build -p voice uv run --with parakeet-mlx python -c "import shutil; print(shutil.which('parakeet-mlx'))" python3 eval/evaluate.py --recordings eval/recordings --engine parakeet-mlx --parakeet-bin /tmp/missing-parakeet-mlx --json-out /tmp/voice-parakeet-missing-bin-after-fix.json python3 eval/evaluate.py --recordings eval/recordings --engine parakeet-mlx --parakeet-bin /tmp/missing-parakeet-mlx --allow-errors --json-out /tmp/voice-parakeet-missing-bin-allow-errors.json uv run --with parakeet-mlx python eval/evaluate.py --recordings eval/recordings --engine parakeet-mlx --json-out /tmp/voice-parakeet-eval-v3-after-fix.jsonMissing-bin behavior after the fix:
1.error: 2 transcription item(s) failed; use --allow-errors for exploratory scoring."error_count": 2.0only when--allow-errorsis set.Review status
Draft intentionally. This should get adversarial Codex review before it is marked ready, especially around the harness API shape and the feasibility conclusion.