Skip to content

Release 0.4.5: local Qwen3 (MLX) engine, settings redesign, refine prompt, Soniox v5 - #54

Merged
giraphant merged 17 commits into
mainfrom
giraphant/mlx-local-asr
Oct 12, 2026
Merged

giraphant merged 17 commits into
mainfrom
giraphant/mlx-local-asr

Conversation

@giraphant

Copy link
Copy Markdown
Owner

Summary

Release 0.4.5.

  • Local Qwen3 engine (MLX). New MLXASR engine target built on mlx-audio-swift, pinned to 244458d. Streaming output drives the HUD as a live preview. On stop, the whole recording is transcribed once more and that result is what gets pasted; streaming text is the fallback. The full pass uses a repetition penalty and gets glossary context. Only real-time streaming models are supported.
    • Model weights are owned by one process-wide store, and a lease allows only one inference at a time.
    • ingest just appends under a lock, so it is safe on the audio thread.
    • Every recording carries a generation guard.
    • Qwen's automatic-language headers are filtered out, including the incomplete ones that appear mid-stream.
  • Settings › 听写模型 redesign. Each engine is now a collapsible card with tags: 本地 / 远程 / 实时 / 使用中. The Qwen3 card can install, uninstall and select the 0.6B and 1.7B (8-bit) models. The engine is now named Qwen3; the stored local id migrates automatically.
  • Build. make build now uses xcodebuild, which compiles MLX's Metal shaders. Resource bundles go into Contents/Resources. Package.resolved is committed.
  • Refinement. You can now set a custom 润色提示词. Requests are logged with trace info.
  • Soniox. Moved to the stt-rt-v5 / stt-async-v5 models. Endpoint detection is off, because a long pause was inserting a sentence break mid-phrase.
  • Smoke CLI. New smoke-cli mlx-transcribe for headless real-model checks; it can switch the final pass off and pass context.

Verification

  • Ran swift test on the merged branch: 430 tests, 0 failures.
  • Real-model runs through smoke-cli on the author's recordings: 5 clips × {0.6B, 1.7B} × {zh-CN, auto}, all using the full-pass result.
    • Stop→final averaged 0.31 s on 0.6B and 0.46 s on 1.7B.
    • Peak memory was about 1.75 GB on 0.6B and 3.57 GB on 1.7B.
  • Ran make install and tested by hand in the app: live preview, final paste, switching to 1.7B, and the settings cards.

Known follow-ups

🤖 Generated with Claude Code

giraphant and others added 17 commits October 12, 2026 13:22
Move realtime/async to stt-rt-v5 / stt-async-v5 and disable automatic
endpoint detection: a long thinking pause could bake a sentence mark into
the middle of a phrase ("一种 [13s pause] 英雄式" → "一种。英雄式"). The
user's stop action already flushes via the end-of-audio marker. Adds a
quote-pairing regression test for a sentence mark inside a quotation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Settings gains a 润色提示词 editor (save / restore default); a custom prompt
fully replaces the default rules and is used by both dictation and the
connection test. TextRefiner logs a per-request trace (outcome, lengths,
finish reason, timing) and records whether the clipboard changed while a
deferred refinement was in flight.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@giraphant
giraphant merged commit 0256ed1 into main Oct 12, 2026
1 check passed
@giraphant
giraphant deleted the giraphant/mlx-local-asr branch October 12, 2026 15:24
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