On-device dictation for the Mac, written in Rust.
Tamka types what you say into any app on your Mac. Press a shortcut, speak, then press the shortcut again, and the text appears at your cursor. Speech recognition runs on the Neural Engine with NVIDIA's Parakeet models, and your audio never leaves the Mac. On a MacBook Pro with an M5 Max, the text arrives about 0.2 seconds after you stop, even after 50 seconds of speech.
Before typing, Tamka removes "um" and "uh", collapses stutters, and turns spoken commands such as "comma", "new line" or "open paren" into the characters they name. With Parakeet Ultra loaded, it uses about 0.5 GB of memory, most of it model weights held by the Neural Engine.
Tamka (TAHM-kah) is Swahili for "to pronounce" or "to utter".
- Dictating
- Transcribing files
- Features
- Privacy
- Accuracy and speed
- Install · Uninstall
- Troubleshooting
- Development
- Credits · License
- Click where the text should go: an email, a chat, a code editor or a search box.
- Press ⌃V and speak. An indicator with a timer shows that Tamka is listening.
- Press ⌃V again. Tamka types what you said at the cursor and keeps a copy on the clipboard.
Press Esc while Tamka is listening to throw the recording away.
⌃V is the default shortcut. You can pick any combination that includes ⌘, ⌃ or ⌥ in Settings › General.
Choose Transcribe Files… from the menu to turn recordings into text. The window stays above other apps' windows, which makes dragging files onto it from Finder easy.
- Drop audio or video files on the window, or click Choose Files…. Dropping a folder adds the audio and video files inside it.
- Tamka transcribes them on your Mac in turn, with the model you've chosen.
- Each file's text appears in its own row. Click Copy to put it on the clipboard or Export… to save it as a text file.
- Separate shows a row per file. Combined shows all the text together, each file under its name, with a shared Copy and Export…. Switching between them doesn't transcribe anything again.
- Export All… saves each transcript as a text file named after its recording, in a folder you choose. Existing files are kept: a second
Interview.txtbecomesInterview 2.txt. - Tamka reads the sound from audio files such as M4A (Voice Memos), MP3, WAV, AIFF and FLAC, and from videos such as MOV and MP4. A file without sound is listed with the reason.
- Stop ends the file in progress and skips the files still waiting.
- Filler words and stutters are removed as your Settings › Text choices say. Spoken commands aren't applied, because in a recording "comma" is usually a word someone said.
- The dictation shortcut keeps working while files are transcribed. If a file is in progress, your dictation is transcribed right after that file.
- A 30-minute recording takes about 4 seconds with Parakeet Ultra on an M5 Max.
- The text stays in the window until you click Clear or quit Tamka.
The indicator never takes focus from the app you're typing in. Drag it anywhere, including onto another display, and it appears there for later dictations. If that display is disconnected, the indicator goes back to the bottom centre of the screen with the pointer. To put it there yourself, click Reset Position in Settings › General.
The menu bar menu shows your last five dictations. Click a dictation to copy it again.
- Start Dictation becomes Stop and Paste while you're speaking.
- Transcribe Files… opens the file window.
- Transcribe Last Recording Again runs your last recording through the current model, which is useful after switching models.
- Microphone names the mic the next dictation uses. Choose a mic there, or in Settings › General, and Tamka stays on it whenever it's connected and uses the system default when it isn't. A mic with several channels, such as a DJI Mic receiver in stereo, is mixed down, so both transmitters are heard.
- Check for Updates… looks for a new version. When a new version is out, the item becomes Update to Tamka X.Y.Z….
- Problems such as a missing permission or a model that hasn't been downloaded appear as menu items that open the fix.
- The menu bar icon turns red while Tamka is listening.
Recent dictations are kept in memory only and are gone when Tamka quits.
The app doesn't include a speech model. On first launch, Settings › Models opens with Parakeet Ultra marked Recommended. Models work offline after the download, and removing a model moves it to the Trash.
| Model | Size | Speed | Accuracy | Best for |
|---|---|---|---|---|
| Parakeet Ultra (recommended) | B | A | A | Everyday dictation, with the best punctuation |
| Parakeet Phonon-2 | A | A | A− | Casual, unscripted speech |
| Parakeet v3 | A | A | A− | Speaking any of 25 European languages |
| Parakeet v2 | A | A+ | B+ | The fastest results |
| Apple Speech | A+ | B | B | No separate model download; macOS may fetch its language files first |
Size covers the download and the memory the model uses while loaded. Speed is how soon text appears after you stop speaking. Accuracy is the word error rate on everyday speech, measured on the benchmark's clips without its meeting recordings. Hover over a grade in the app to see the measurements behind it.
- Add Model from Hugging Face… in Settings › Models takes a model's link, such as
huggingface.co/FluidInference/parakeet-redux-coreml. Tamka reads the model's file list first and downloads the model if it can run it: a Core ML Parakeet model built like v2 or v3, in the layout FluidInference uses. That covers many community models, such as versions tuned for other languages. If Tamka can't run a model, it says why. - Tamka looks for new Parakeet models from FluidInference once a day. Ones it can run appear under New from FluidInference in Settings › Models, with a Download button. Check Now looks straight away, and you can turn the daily look off.
- Added models are listed with your other models and show – for their grades, because Tamka hasn't measured them. Removing an added model moves its files to the Trash.
Say a command and Tamka types the symbol with the spacing fixed: "call foo open paren bar close paren" becomes call foo (bar).
| Say | Get | Say | Get |
|---|---|---|---|
| "comma" | , | "new line" | a line break |
| "question mark" | ? | "new paragraph" | a blank line |
| "open quote" … "close quote" | " … " | "open paren" … "close paren" | ( … ) |
| "at sign" | @ | "em dash" | — |
| "percent sign" | % | "smiley face" | :) |
The table shows 10 of the 112 default commands.
In Settings › Text you can turn filler removal and stutter cleanup on or off, write numbers, prices and dates as digits (experimental), and search, add, edit or remove commands. ⌘Z undoes changes, and Restore Defaults… brings back the original list.
Settings › General holds the shortcut, the microphone, a recording time limit, the start and stop sounds, the indicator position, whether Tamka pastes the text and keeps it on the clipboard, launch at login, the daily update check, the microphone and Accessibility permissions, and the activity log. Changes apply immediately.
Choose Check for Updates… in the menu to look for a new version. Tamka also checks about a minute after launch if the last check was more than a day ago, then daily while it runs. To stop these checks, turn off Check for updates automatically in Settings › General.
When a new version is out, a notification says so and the menu shows Update to Tamka X.Y.Z…. The first time this happens, macOS asks whether Tamka may show notifications. Choose the menu item or click the notification to read the release notes, then click Install and Relaunch.
Tamka downloads the release from GitHub and installs it only if the download matches the checksum GitHub lists for it and the app inside is signed by Tamka's developer and notarized by Apple. The old copy goes to the Trash and the new version opens in its place. If you're dictating, the install waits until you finish. If your account can't make changes in the folder Tamka is in, Tamka opens the release page in your browser instead.
- Speech recognition runs entirely on your Mac. Models download once: Parakeet models from Hugging Face, and Apple Speech's language files from Apple.
- Tamka checks GitHub once a day for a new version. You can turn this off in Settings › General.
- Tamka asks Hugging Face once a day for FluidInference's list of Parakeet models. The request sends no audio or text. You can turn this off in Settings › Models.
- Transcribe Files reads your files on your Mac. While a file is being transcribed, its sound is kept in
~/Library/Caches/Tamka/filesand deleted when it's done. Transcripts stay in memory until you clear them or quit Tamka. - The microphone is on only while you're dictating.
- Tamka keeps your last recording at
~/Library/Caches/Tamka/last.wavfor Transcribe Last Recording Again. Each new dictation replaces it. - The log at
~/Library/Logs/Tamka.logrecords events and timings, never your words.
Parakeet Ultra was tested against Whisper large-v3-turbo on 117 public recordings (32 minutes) of read speech, meetings and earnings calls with human-checked transcripts, on a MacBook Pro with an M5 Max:
| Whisper large-v3-turbo | Tamka with Parakeet Ultra | |
|---|---|---|
| Words wrong, all recordings | 9.9% | 7.7% |
| Words wrong, without meeting recordings | 6.9% | 6.2% |
| Memory | 1.2–1.6 GB | about 0.5 GB |
| Wait after a 50-second dictation | 471 ms | 170 ms |
Without the meeting recordings, the difference in accuracy is within the margin of error. The full benchmark compares 11 model configurations. To compare models on your own voice and vocabulary, see eval/README.md.
Download Tamka-macOS-arm64.dmg from the latest release. It needs a Mac with Apple silicon and macOS 26 or later. (The Apple Speech engine uses SpeechAnalyzer, which is new in macOS 26.) Open it, drag Tamka onto the Applications folder in its window, and open Tamka from Applications. Tamka is signed and notarized by Apple.
You need:
- a Mac with Apple silicon and macOS 26 or later;
- Xcode 26 or later;
- a current stable Rust toolchain from rustup.
git clone https://github.com/piedol/tamka.gitcd tamka && scripts/bundle.sh --installThe script builds the app and its speech engine, signs both, copies Tamka.app to /Applications and opens it. It signs with TAMKA_SIGN_IDENTITY if that's set, or else with the first Developer ID Application certificate in your keychain. Without either, it uses an ad-hoc signature, and macOS asks for permissions again after every build.
When Tamka first opens:
- Settings › Models opens. Click Download next to Parakeet Ultra (632 MB).
- Allow Accessibility so Tamka can paste the text. Without it, Tamka copies the text and you paste it yourself.
- Allow the microphone the first time you dictate.
Tamka has no Dock icon. To start it when you log in, turn on Launch Tamka at login in Settings › General.
- Turn off Launch Tamka at login in Settings › General, then choose Quit Tamka from the menu.
- Move
/Applications/Tamka.appto the Trash. - Move these to the Trash:
~/Library/Application Support/Tamka(which also holds models added from Hugging Face),~/Library/Caches/Tamkaand~/Library/Logs/Tamka.log. - Downloaded models are in
~/Library/Application Support/FluidAudio/Models(about 0.4–0.6 GB each). Other apps built on FluidAudio may share that folder, so remove only the models you no longer want. - Remove Tamka from System Settings › Privacy & Security › Accessibility and Microphone.
| Problem | Fix |
|---|---|
| The text is copied but not pasted | Accessibility is off. Click Allow… next to it in Settings › General. |
| Nothing happens when you press the shortcut | Another app may use the same keys. Choose a different shortcut in Settings › General. |
| The indicator covers what you're typing | Drag it somewhere else. It stays where you put it. |
| Tamka moved to a mic you plugged in | macOS makes a new mic the system default. Choose the mic you want under Microphone in the menu, and Tamka stays on it. |
| The menu says no model is downloaded | Choose Download a Speech Model… in the menu. |
| Transcribe Files says it can't open a file | Tamka reads files that macOS can play. Convert the file to M4A or MP3 and try again. |
| Tamka can't use a model from Hugging Face | Tamka runs Core ML Parakeet models built like v2 or v3. Models in other formats, such as ONNX, or other designs, such as the 110M and Unified models, don't load. |
| An update opens the release page instead of installing | Your account can't make changes in the folder Tamka is in. Download the disk image from that page and drag Tamka onto Applications. |
| Something else goes wrong | Open the activity log from Settings › General. It shows events and timings, never your words. |
Tamka.app
├── Contents/MacOS/Tamka Rust: menu bar, shortcut, microphone, text cleanup, paste, Settings
└── Contents/Helpers/tamka-engine Swift: FluidAudio running the speech model on the Neural Engine
The menu bar app is written in Rust against AppKit through objc2. The speech engine is a Swift helper that keeps the model loaded and talks to the app over stdin and stdout in JSON lines. If the helper stops, Tamka restarts it on the next dictation.
| Path | What it does |
|---|---|
src/app.rs |
The menu bar and the dictation flow: idle, listening, transcribing, paste |
src/hud.rs |
The draggable indicator and notifications |
src/audio.rs |
Microphone capture through Core Audio's input unit, only while listening |
src/engine.rs |
Starts and supervises the speech helper; dictations go ahead of waiting files |
src/files.rs |
The Transcribe Files window and its queue |
src/models.rs |
The model catalog and grades; download, removal and status; models from Hugging Face |
src/text.rs |
Filler removal, stutter cleanup, spoken commands and spacing |
src/paste.rs |
The clipboard, then ⌘V once your modifier keys are released |
src/settings.rs |
Preferences, saved to ~/Library/Application Support/Tamka/settings.json |
src/settings_window.rs |
The Settings window |
src/update/ |
Update checks against GitHub releases: download, checksum, signature and notarization checks, replacing the app and reopening it |
src/update_ui.rs |
The update menu item, setting, notification and window |
engine/ |
The Swift speech helper |
eval/ |
The benchmark harness |
scripts/ |
Build, sign, icon and README image scripts |
cargo test --release # unit tests
scripts/bundle.sh # build and sign dist/Tamka.app
scripts/bundle.sh --notarize # release: notarize, zip for updates, make the .dmg for new installs
target/release/Tamka --transcribe clip.wav # transcribe a file without the microphone
open "tamka://settings-models" # open Settings on a tab: settings, settings-models, settings-text
open "tamka://files" # open Transcribe Files
target/debug/Tamka --files a.m4a b.mov # debug builds: open Transcribe Files with these files
open "tamka://hud-demo" # show the indicator's states
TAMKA_UPDATE_TEST=install dist/Tamka.app/Contents/MacOS/Tamka # check now and install a newer release without asking
swift scripts/make-showcase.swift # redraw docs/images/showcase.png from the screenshotsA release has Tamka-macOS-arm64.zip, which installed copies update from, and Tamka-macOS-arm64.dmg, which opens to a window with Tamka, an arrow and the Applications folder. The disk image needs dmgbuild, installed once with python3 -m venv ~/.local/share/dmgbuild-venv && ~/.local/share/dmgbuild-venv/bin/pip install dmgbuild. scripts/make-dmg.sh and its two helper scripts are shared with piedol's other Mac apps and kept the same in each.
Bug reports and pull requests are welcome. Before opening a pull request, run cargo clippy --all-targets -- -D warnings and cargo test --release.
- Speech runtime: FluidAudio (Apache-2.0).
- Models: NVIDIA Parakeet (CC-BY-4.0); Parakeet Ultra by Moondream; Phonon-2 by Fermion Research. Each model's authors set its license, so check its page before redistributing it.
- Benchmark recordings: LibriSpeech, FLEURS and AMI (CC-BY-4.0), and Earnings-22 (CC-BY-SA-4.0).
Copyright 2026 piedol.
Tamka is free software under the GNU General Public License v3.0 or later. You can use, study, share and change it, including at work. If you distribute a modified version, you must release its source under the same license.







