Talk the way you talk. Get the sentence you meant, typed at your cursor in almost any app, and not a word leaves your Mac.
Hold fn (🌐), speak, and let go. Live Transcribe turns what you said into clean, punctuated text and types it where you are working: a message, an email, a document, a terminal. The "um"s are gone. "Monday, no wait, Tuesday" comes out as "Tuesday". Add your names and jargon once, and they are spelled your way.
Speech-to-text and a small language model run on your Apple silicon Mac with MLX. There is no account, no cloud and no telemetry, and once the models are downloaded it works offline. When you would rather watch than type, a live transcript window shows your words as you speak and tidies each line in place.
Free and open source (MIT) · Apple silicon · macOS 14 or later (tested on macOS 27) · English · build from source
A reply dictated into Slack: hold the shortcut, speak, let go.
Real outputs from the dictation eval, at the default Medium cleanup level:
| You say | Live Transcribe types |
|---|---|
| Um, I think we should, uh, push the launch by a week | I think we should push the launch by a week. |
| Let's meet on Monday, no wait, Tuesday | Let's meet on Tuesday. |
| The budget is fifty thousand, I mean sixty thousand | The budget is 60,000. |
| We're flying into Boston, scratch that, into New York | We're flying into New York. |
| Tell Daniel, sorry, tell Maria the draft is ready | Tell Maria the draft is ready. |
| So, uh, what time does the, um, the train leave | So, what time does the train leave? |
| I'll be about ten minutes late, the train is running slow today | I'll be about 10 minutes late. The train is running slow today. |
| hi emoji fireworks | Hi 🎆. |
| email me at john dot smith at example dot com | Email me at john.smith@example.com. |
And in anything that takes several lines, such as a document, an email or a chat message:
| You say | Live Transcribe types |
|---|---|
| Things to do today. First, call the bank. Second, book the flights. Third, send the invoice. | Things to do today: 1. Call the bank 2. Book the flights 3. Send the invoice |
| hi John thanks for the update I will review it tomorrow cheers Sam | Hi John, Thanks for the update, I will review it tomorrow. Cheers, Sam |
12 of 12 self-corrections resolved. 10 of 10 filler clips cleaned. 65 of 65 clips laid out as meant. 428 ms at p95. In the 65-clip dictation eval at Medium, dictating into a multi-line field, speech-to-text plus cleanup of sentence-length dictations took 186 ms at p50 and 428 ms at p95, well inside the 1.2 s target.
Measured on an M4 Pro with synthetic speech: the left column is the script a macOS text-to-speech voice read aloud. Stopping the recorder and inserting the text are not included in those times. Three of the 65 clips fell back to the uncleaned transcript: a plain sentence and two spoken lists, which were still laid out (details).
- Say it naturally, get what you meant. At the default Medium level, fillers disappear, spoken self-corrections are resolved and spoken lists and letters are laid out; say emoji, punctuation and line breaks at any level. Every edit is checked against what you said, and ⌃⌥Z puts your own words back.
- Dictate from any app. Hold fn (🌐) or a shortcut of your own, or double-tap it for hands-free. A small panel by your cursor shows what is happening, and Esc cancels.
- Make it yours. Snippets insert saved text when you say their phrase, and vocabulary spells your names and jargon your way. Choose how much it edits: None, Light, Medium or High.
- Dependable, app after app. Text goes in through Accessibility and is read back, or is pasted with your clipboard put back, so terminals, browsers and Electron apps work too. Line breaks go only where they belong, and nothing goes into a password field.
- Private by design. Speech-to-text and cleanup run on your Mac, with no account, no cloud and no telemetry. Dictation history stays on this Mac, and you can turn it off.
- A live transcript, too. Watch your words appear as you speak, each line cleaned in place and every session saved.
- Easy to start, easy to trust. Guided setup, VoiceOver support, more than 1,000 tests, a bench for your own recordings, a tool that retrains the adapter on your Mac, and your own models if you prefer.
Every feature, in detail: docs/features.md.
| Guide | What's in it |
|---|---|
| Features | Everything Live Transcribe does, in detail, and what's coming next |
| Using Live Transcribe | First launch, dictating, Dictation History, the live transcript, microphones, updates and every Settings tab |
| Cleanup and spoken commands | The four cleanup levels, what OutputGuard rejects, and the phrases that become emoji, punctuation, line breaks and addresses |
| Snippets, vocabulary and apps | Saved text, your names and jargon, and how each app gets its text and line breaks |
| Privacy | What is kept where, what goes over the network, and how to remove it all |
| Signing and Gatekeeper | Ad-hoc signing, and keeping permissions across rebuilds |
| Releasing | The Developer ID certificate, the notary credentials and the update signing key, and writing the changelog, building, notarizing, publishing and offering a release as an update |
| Known limitations | What doesn't work well yet |
| Development | The tests and their audio clips, the bench and the dictation eval, training the adapter, the licence notices, and the icons |
| Design notes | Why it is built the way it is |
| Dictation design | Dictation's decisions, assumptions, architecture, settings and eval results |
| Training the adapter | The self-correction adapter's dataset, training and evaluation |
A working proof of concept, free and open source under the MIT License.
- Download it from GitHub Releases: a disk image signed with Developer ID and notarized by Apple, which keeps itself up to date. Or build it from source (below).
- What changed in each release is in the changelog.
- Tested on an M4 Pro Mac with macOS 27 and Xcode 27. The app targets macOS 14 or later but has not been run on older systems.
- Tested with English speech. Qwen3-ASR also recognises 29 other languages, among them Chinese, Spanish, French and German, but the cleanup step has not been tested with them.
- Issues and pull requests are welcome; see Reporting a problem.
- What doesn't work well yet is in Known limitations.
Open an issue, in whatever form suits you. These help, when you have them:
- your Mac, the macOS version, and the app's version (About Live Transcribe in the menu bar);
- the app you were dictating into;
- what you said, what was typed, and what you expected;
- for a crash, the report macOS offers to send, or the one in Console › Crash Reports.
- An Apple silicon Mac. With the default models the app uses about 3 GB of memory. It has not been tested on 8 GB Macs.
- To build: Xcode 26.4 or later (Swift 6.3 or later), with its Metal Toolchain component
(
xcodebuild -downloadComponent MetalToolchain). MLX compiles Metal shaders, so build withxcodebuildor Xcode;swift buildproduces binaries without the Metal library. - Disk space: about 2 GB for the models (Qwen3-ASR 0.6B and Qwen3-1.7B-4bit are about 1 GB each) and about 2 GB for the build. The tests and the bench need roughly 5.5 GB more: their own copy of the models and their own build.
From the repository root, build the app in Release and open it:
make runmake on its own lists every target: the tests, the bench and the eval, releases, and upkeep such
as the licence notices, the icons and the app's log. The Makefile shows the command
behind each one.
Or open LiveTranscribe.xcodeproj in Xcode and choose Run. The shared scheme runs the
Release configuration, because MLX inference in Debug is several times slower. On the first
build Xcode asks you to trust mlx-swift's CudaBuild build-tool plugin, which only does work in
CUDA builds; the Makefile skips that prompt with -skipPackagePluginValidation.
Live Transcribe runs in the menu bar. On first launch, Set Up Dictation walks you through microphone access, Accessibility and the fn key while the models (about 2 GB) download; see First launch.
macOS treats every ad-hoc build as a new app. After a rebuild it asks for microphone access
again, and the shortcut does not work until you remove the old Live Transcribe entry in Privacy
& Security › Accessibility and add the new build. To keep the permissions across rebuilds, sign
with your own certificate: copy Config/Signing.local.xcconfig.example to
Config/Signing.local.xcconfig (gitignored) and set your team ID. More in
Signing and Gatekeeper.
The package has more than 1,000 Swift Testing tests. Unit tests need no models:
make testThe end-to-end tests, the bench and the dictation eval need generated audio clips and the models; see Development.
Audio and transcripts never leave your Mac, and there is no telemetry. The app goes online only to download the models from Hugging Face and, in a downloaded release, to check GitHub for a new version about once a day if you allow it. Dictation history is on by default: every completed dictation (what you said, what was typed, the app and timings) is kept unencrypted on this Mac, never synced, until you turn history off, limit how long it is kept or clear it in Settings › History. Where each file lives, and how to remove everything: docs/privacy.md.
- Two pipelines, one set of models. The live transcript runs microphone → Silero voice activity detection → Qwen3-ASR speech-to-text → Qwen3-1.7B cleanup at the chosen level → window and JSONL file. Dictation runs shortcut → recording → Qwen3-ASR → placeholders for snippets, spoken commands and list markers, and vocabulary → filler rule, letter frame and Qwen3-1.7B cleanup, checked by OutputGuard → line breaks and layout → snippets, emoji and addresses restored → text at the cursor. One Qwen3-ASR and one Qwen3-1.7B instance serve both.
- A menu bar app. Dictation has to be available in every app, so Live Transcribe lives in
the menu bar (
LSUIElement) and becomes a regular app with a Dock icon only while one of its windows (transcript, history, Settings, setup) is open.
App/ menu bar app: menu, windows, composition root, app icon
LiveTranscribe.xcodeproj app project (ad-hoc signed, hardened runtime, no App Sandbox)
CHANGELOG.md what changed in each release, written by make changelog
design/ the app icon, drawn as SVG
docs/ the guides indexed above, design notes and dictation's design
Makefile building, tests, the bench, releases and upkeep (make lists them)
scripts/ releases, the changelog, licence notices, test audio and icons
site/ the website, published to GitHub Pages
Packages/LiveTranscribeKit/ all feature code, as vertical slices
Sources/
Shared/ value types, AppSettings, logging, deadline, edit distance, atomic file writes
Capture/ AVCaptureSession microphone capture → 16 kHz mono; microphone list and choice
Segmentation/ Silero VAD + segmentation state machine (pre-roll, hysteresis, max length)
Transcription/ Qwen3-ASR via mlx-audio-swift
Cleanup/ Qwen3 via mlx-swift-lm, prompt, OutputGuard fallbacks, fine-tuned adapter
Persistence/ JSONL session files and dictation history
Session/ SessionCoordinator (lifecycle) + SessionPipeline (3 concurrent stages)
TranscriptUI/ live transcript view model and views
Hotkey/ global shortcut monitor (event tap), hold/double-tap gestures, bindings
Permissions/ Accessibility and microphone permission, System Settings links
Insertion/ typing at the cursor: Accessibility, paste with clipboard restore, per-app settings
Styles/ rule-based filler removal and layout: lists and letters
SpokenCommands/ emoji, punctuation, line breaks and addresses said aloud
Snippets/ trigger phrases and the text they insert
Vocabulary/ names and jargon, with how they are spoken
Dictation/ DictationController: hotkey → record → transcribe → clean up → insert
DictationUI/ menu bar menu, floating panel, setup, Settings tabs, history window
MLXSupport/ MLX runtime configuration (GPU cache limit)
Bench/ command-line tool: WER and latency over test clips, live transcript or dictation
CleanupTraining/ dataset, LoRA training and evaluation for the cleanup adapter
Train/ command-line tool: generate, validate, train and evaluate the adapter
Tests/ Swift Testing; tests that need the models run only when enabled
Training/ the adapter's dataset, and how it is trained (Training/README.md)
App/AppComposition.swift is the app's composition root: it constructs every concrete slice
implementation (the bench and the tests wire their own). The Settings window is the exception: it
reads and writes the settings in UserDefaults directly. Everything else depends on protocols
(AudioSource, SpeechSegmenter, Transcriber, Cleaner, SessionSink,
MicrophonePermissionProviding, for dictation HotkeyMonitor, FocusedTargetProvider,
TextDelivery, DictationHistory and AccessibilityPermissionProviding, and in the UI
SessionControlling and InputDeviceSelecting), which the unit tests replace with fakes or, for
SessionSink, the in-memory MemorySessionSink. Dictation and the live transcript share one
instance of each model; they never run at the same time.
Why it is built this way: Design notes and Dictation design.
The app downloads the models from Hugging Face. They are not part of this repository and not covered by its licence. The cleanup adapter, a 10 MB LoRA adapter for Qwen3-1.7B, is part of this repository.
| Role | Model used | Original model | Licence |
|---|---|---|---|
| Speech-to-text | mlx-community/Qwen3-ASR-0.6B-8bit | Qwen3-ASR-0.6B by the Qwen team, Alibaba Cloud | Apache-2.0 |
| Cleanup | mlx-community/Qwen3-1.7B-4bit | Qwen3-1.7B by the Qwen team, Alibaba Cloud | Apache-2.0 |
| Self-correction adapter | bundled (Sources/Cleanup/Adapter) |
trained on synthetic data in this repository (Training/) |
MIT |
| Voice activity detection | mlx-community/silero-vad | Silero VAD by the Silero team | MIT |
Other models can be tried in Settings › Advanced (a Hugging Face repository ID for each role; it is downloaded on the next launch). They must be models mlx-audio-swift or mlx-swift-lm can load, and the self-correction adapter is used only with mlx-community/Qwen3-1.7B-4bit.
Built with mlx-swift,
mlx-swift-lm,
mlx-audio-swift,
swift-huggingface and
swift-transformers. Every package
dependency, including indirect ones, is MIT or Apache-2.0 licensed. Some bundle third-party code
under other permissive licences (MLX includes the BSD-licensed PocketFFT, for example), so a
redistributed build must carry those notices too. The app does: About Live Transcribe in the
menu bar shows every package's licence, collected from Package.resolved by
scripts/generate-acknowledgements.sh.
MIT © 2026 Nerdstorm. The licence covers this repository's code only. The models (see Models and credits) and the Swift package dependencies have their own licences.
