{"slug": "yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt", "title": "Yap – free offline voice dictation for Mac/Windows/Linux (Wispr Flow alt)", "summary": "Yap, a free and open-source offline voice dictation tool for Mac, Windows, and Linux, has been released as an alternative to Wispr Flow and SuperWhisper. It runs locally using Whisper for transcription, requires no account or subscription, and does not send audio or screenshots to the cloud unless the user opts in. The tool is MIT-licensed and supports custom endpoints for cloud engines and LLM cleanup.", "body_md": "Hold a key, talk, and what you said lands at the cursor: your editor, browser, a chat box, the terminal, wherever you're typing. It's a free, open-source alternative to Wispr Flow and SuperWhisper, and it runs offline by default.\n\nWhat you get:\n\n**It stays private.** Transcription runs locally with Whisper, so there's no account, no cloud, no telemetry, and nothing screenshots your screen. Audio only leaves your machine if you deliberately switch to a cloud engine.**No word caps, no subscription.** Wispr's free tier stops at 2,000 words a week and then runs $12–15/mo. yap is MIT-licensed, with no meter and nothing to upsell.**Same on every OS.** macOS, Windows and Linux share one config file.**Quick.** Faster than real time on CPU with the`base`\n\nmodel, near-instant with a GPU or a cloud key.**Your keys, your endpoints.** Point it at OpenAI, Groq, or a Whisper server you host yourself. There's an optional LLM cleanup pass too, against any OpenAI-compatible API.\n\n```\n  you: (hold Right Option ⌥)  \"send him the q3 numbers by friday\"\n  yap: Send him the Q3 numbers by Friday.        ← typed at your cursor\n```\n\nGrab it, unzip, open. That's the whole thing:\n\n|\n|---|\n\n[⬇ Windows](https://github.com/AkuchiS/yap/releases/latest/download/yap-Windows.zip)\n\n[⬇ Linux](https://github.com/AkuchiS/yap/releases/latest/download/yap-Linux.tar.gz)\n\nmacOS:not Apple-signed yet, so the first timeright-click the app → Open(not double-click), then grant Microphone + Accessibility once. Comfortable with a terminal? See[Install]below.\n\n| Wispr Flow | yap |\n|\n|---|---|---|\n| Price | $12–15/mo (free tier: 2k words/wk) | Free, unlimited |\n| Offline mode | ❌ cloud only | ✅ local Whisper by default |\n| Sends audio to a server | Always | Only if you opt into a cloud engine |\n| Screenshots active window | Yes (for \"context\") | Never |\n| Open source | ❌ | ✅ MIT |\n| Platforms | Mac/Win/iOS/Android | Mac/Win/Linux |\n\nRequires **Python 3.9–3.13** (3.14 is too new — some native deps don't have\nwheels for it yet). The local engine downloads a small Whisper model on first use. Clone, run the installer, go:\n\n```\ngit clone https://github.com/AkuchiS/yap.git\ncd yap\n./install.sh\nyap run\n```\n\n`./install.sh`\n\nsets up an isolated [pipx](https://pipx.pypa.io) environment so\nnothing pollutes your system Python. Then hold **Right Option**, speak, and let\ngo; your words land at the cursor.\n\nPrefer a one-liner?\n\n`pipx install \"yap-dictation[full] @ git+https://github.com/AkuchiS/yap\"`\n\ndoes the same thing. The`[full]`\n\nextra pulls in the macOS menu-bar bits (`rumps`\n\n); plain`git+…`\n\ninstalls the core CLI only, so`yap app`\n\nwon't start without it.\n\n**macOS**— grant your terminal** Accessibility**and** Microphone**permission:*System Settings → Privacy & Security → Accessibility / Microphone*. Without Accessibility, the paste keystroke is silently ignored.**Linux (X11)**— works out of the box. For clipboard fallback install one of`xclip`\n\n/`xsel`\n\n. On**Wayland**, install`wl-clipboard`\n\n; some compositors restrict synthetic keystrokes — use`--engine local`\n\nwith`inject.method = \"type\"`\n\nif paste doesn't land.**Windows**— no extra steps; run from a normal terminal.\n\n```\nyap run                       # start the daemon; hold your hotkey and talk\nyap app                       # tray app: menu-bar (macOS) / system tray (Win/Linux)\nyap transcribe meeting.m4a    # one-shot: transcribe a file, print the text\nyap vocab add PostgreSQL      # teach it your words (see below)\nyap hardware                  # show your specs + the model it'll auto-pick\nyap doctor                    # diagnose permissions / hotkey / mic / clipboard\nyap devices                   # list microphones\nyap config show               # print effective config\nyap license                   # show your install date + early-adopter code\nyap update                    # check GitHub for a newer release\n```\n\nThe default model is `\"auto\"`\n\n— yap detects your CPU/RAM/chip and picks a size\nthat stays responsive: `tiny.en`\n\non very old/light machines, `base.en`\n\non a\n2019-era laptop, `small.en`\n\non modern hardware, GPU-accelerated if you have\nCUDA. Run `yap hardware`\n\nto see the pick, or pin one with\n`yap config set local.model '\"small\"'`\n\n.\n\nyap uses your system default mic, which is usually fine. Where it bites is docking\na laptop to a monitor. Plenty of monitors, USB-C docks and webcams have their own\nmic built in, and the OS tends to make *that* the default the moment you plug in,\nso you end up recording from a mic across the room (or one that doesn't really\nwork). It's not a mac quirk; Windows and Linux docks do the same thing.\n\nThe fix is to pin the mic you actually want:\n\n```\nyap devices                                       # list mics, and show which one yap picks\nyap config set audio.device '\"Studio Display\"'    # match by name (substring, case-insensitive)\n```\n\nIf you dock and undock a lot, give it a list instead of one name. yap re-checks on every keypress and uses the first one that's actually plugged in, so closing the lid (built-in mic gone) just falls through to the next:\n\n```\nyap config set audio.device '[\"MacBook Pro Microphone\", \"Studio Display\"]'\nyap config set audio.device '[\"Built-in\", \"Dell Monitor\", \"USB\"]'   # Windows/Linux style\n```\n\n`yap devices`\n\nprints a `yap will use: …`\n\nline so you can see what it picked.\n\nSome external mics only run at 48 kHz. yap records at whatever rate the mic offers\nand resamples to 16 kHz itself, so those are fine. If the recording light comes on\nbut nothing gets typed, run `yap run --debug`\n\nin a terminal and it'll say why: it\ncouldn't open the mic, no audio arrived, or what it heard was silent.\n\nyap only holds the mic *while you hold the hotkey*, so it doesn't fight your\nother tools. If you run your own always-listening assistant, point the\nintegration hooks at it so it pauses while you dictate and resumes after:\n\n```\nyap config set integration.on_record_start '\"myassistant pause\"'\nyap config set integration.on_record_stop  '\"myassistant resume\"'\n```\n\nEach hook runs with **context** in its environment, so the handoff can be smart\nabout the OS and *which app you're dictating into*:\n\n| var | value |\n|---|---|\n`YAP_EVENT` |\n`start` or `stop` |\n`YAP_OS` |\n`darwin` / `win32` / `linux` |\n`YAP_ACTIVE_APP` |\nthe frontmost app (e.g. `Slack` , `Code` , `Terminal` ) |\n\nFor example, *don't* pause your assistant when you're dictating **into** it:\n\n```\nyap config set integration.on_record_start \\\n  '\"[ \\\"$YAP_ACTIVE_APP\\\" = \\\"MyAssistant\\\" ] || myassistant pause\"'\nyap config set integration.on_record_stop \\\n  '\"[ \\\"$YAP_ACTIVE_APP\\\" = \\\"MyAssistant\\\" ] || myassistant resume\"'\n```\n\nSame context is written to `integration.state_file`\n\nas\n`{\"active\": bool, \"os\": \"...\", \"active_app\": \"...\"}`\n\nif you'd rather poll.\n\nBy default yap is **push-to-talk on a single key** (like Wispr's \"hold to\ndictate\"): **hold Right Option ⌥** on macOS (Right Ctrl elsewhere), speak, and\nrelease to transcribe.\n\nDictating into different apps? Give each one its own settings. yap merges the\nmatching app's overrides over your base config **for that utterance**, matched by\nthe frontmost app's name — perfect for app-specific jargon, or turning the LLM\ncleanup on in chat but off in your terminal:\n\n```\nyap config set 'app_profiles.Slack.cleanup.enabled' true\nyap config set 'app_profiles.Terminal.vocabulary' '[\"kubectl\",\"stderr\",\"grep\"]'\nyap config set 'app_profiles.Code.local.language' '\"en\"'\n```\n\nMatching is exact first, then a case-insensitive substring (so `Slack`\n\nalso matches\nan app reported as `Slack — chat`\n\n). Anything you don't override falls back to base.\n\n```\nyap config set hotkey.combo '\"<alt_r>\"'    # Right Option ⌥ (macOS default)\nyap config set hotkey.combo '\"<cmd_r>\"'    # Right Command\nyap config set hotkey.combo '\"<f9>\"'       # a function key\nyap config set hotkey.combo '\"<ctrl>+<alt>\"'   # a two-key combo\nyap config set hotkey.mode  '\"toggle\"'     # press to start, press to stop\n```\n\nWhy not the Fn / 🌐 key?It's the obvious one-finger choice, but on macOS the Fn key emits no real keypress — only a hidden hardware flag — so the cross-platform input library can't see it. Right Option gives you the same one-key feel and works reliably. (A native Fn backend is on the roadmap.)\n\nLike Wispr, yap can learn the names and jargon you use so they come out right instead of being guessed at (\"PostgreSQL\", not \"post grey sequel\"):\n\n```\nyap vocab add PostgreSQL Anthropic Kubernetes # bias recognition toward these\nyap vocab fix \"github\" \"GitHub\"               # always rewrite a misheard word\nyap vocab list\n```\n\n`vocab add`\n\nfeeds Whisper a glossary hint (helps it *spell* unfamiliar words);\n`vocab fix`\n\nis a guaranteed find/replace for words it *consistently* mangles.\n\nBy default yap **watches what you dictate** and learns the proper nouns, jargon,\nand acronyms you use repeatedly — adding them to your glossary automatically\n(capped, persisted, and never one-offs). So names like `PostgreSQL`\n\nor `Kubernetes`\n\nstart coming out right after you've used them a few times, with no effort.\n\n```\nyap vocab learned          # see what it's picked up\nyap vocab forget Foo       # drop something it learned by mistake\n```\n\nTune or disable it in config under `learning`\n\n(`enabled`\n\n, `min_count`\n\n,\n`max_words`\n\n). It only ever learns repeated words and is capped, so it can't run\naway or hurt accuracy.\n\nBy default yap prints just `● listening…`\n\nand the final `✓ \"transcript\"`\n\n.\nWant silence (e.g. running it as a background app)? `yap run --quiet`\n\n.\nDebugging? `yap run --debug`\n\nnarrates every stage.\n\nConfig is a JSON file (`yap config path`\n\nto find it). Secrets are **never**\nstored here — API keys are read from environment variables. Common tweaks:\n\n```\n# Use a cloud engine for speed (bring your own key):\nexport YAP_API_KEY=gsk_...                 # e.g. a Groq key\nyap config set engine '\"cloud\"'\n\n# Turn on the optional LLM cleanup pass (punctuation, filler removal):\nexport OPENROUTER_API_KEY=sk-or-...\nyap config set cleanup.enabled true\n\n# Choose a specific microphone (index from `yap devices`):\nyap config set audio.device 3\n\n# Paste vs. direct typing:\nyap config set inject.method '\"type\"'      # if clipboard paste misbehaves\n```\n\nEngines:\n\n`engine` |\nWhat runs | Cost | Privacy |\n|---|---|---|---|\n`local` (default) |\nfaster-whisper on your CPU/GPU | free | audio never leaves the machine |\n`cloud` |\nany OpenAI-compatible `/audio/transcriptions` |\nyour key | audio sent to that endpoint |\n\nLocal model sizes (set `local.model`\n\n): `auto`\n\n*(default — adapts to your\nmachine)*, `tiny.en`\n\n, `base.en`\n\n, `small`\n\n, `medium`\n\n, `large-v3`\n\n. Bigger = more\naccurate, slower, more RAM.\n\nFor a proper app that shows **yap + your icon** in macOS permission dialogs (not\n\"Python\") and needs no separate Python install, freeze it with PyInstaller. The\napp bundles its own interpreter + the Whisper stack.\n\n```\nyap icon ~/Downloads/yap-icon.png        # (optional) your icon first\n\n# macOS  → ~/Applications/yap.app\n./packaging/build_macos.sh\n\n# Linux  → dist/yap/  (sudo apt install libportaudio2 for the mic)\n./packaging/build_linux.sh\n\n# Windows → dist\\yap\\yap.exe\npowershell -ExecutionPolicy Bypass -File .\\packaging\\build_windows.ps1\n```\n\nTips: set `YAP_BUILD_PY=python3.12`\n\nto freeze with a specific (mature) Python;\n`YAP_MENUBAR_ONLY=1`\n\nhides the macOS Dock icon. After building on macOS, open the\napp and grant **yap** Microphone + Accessibility + Input Monitoring — now shown\nunder the yap name and icon. Verify any build with `yap selftest`\n\n.\n\nIf you just want a Dock launcher fast and don't mind that permissions show under\n\"Python\", `yap bundle --login`\n\nmakes a lightweight `~/Applications/yap.app`\n\nthat\ncalls your installed yap. Good for personal use; the frozen build above is the\none to ship.\n\n**Linux**—`install/yap.service`\n\n(a user systemd unit), or add`yap run`\n\nto your desktop's autostart.**Windows**— a shortcut to`yap run`\n\nin the Startup folder.\n\nSee [ install/](/AkuchiS/yap/blob/main/install) for ready-made helpers.\n\nyap needs two macOS permissions: **Input Monitoring** (to see your hotkey) and\n**Accessibility** (to type at your cursor). macOS doesn't always prompt — so the\nreliable way is to add yap **by hand**:\n\n- System Settings → Privacy & Security →\n**Input Monitoring**→ click→ press`+`\n\n**⌘⇧G**, enter`/Applications/Yap.app`\n\n,**Add**, toggle it** on**. - Do the same under\n**Accessibility**. **Quit yap fully and reopen it**— grants only take effect on relaunch.\n\nRunning the CLI (`yap run`\n\n) from a terminal instead of the app? Grant **your\nterminal app** those two permissions rather than Yap.app.\n\n**Rebuilt the app and it stopped working?** An unsigned app's identity changes\nevery build, so old grants go stale and show \"on\" but don't apply. Reset and\nre-add: `tccutil reset All com.yap.dictation`\n\n, then repeat the steps above. (A\nsingle downloaded build doesn't have this problem — it's only an issue when you\nrebuild repeatedly.)\n\nWith the default `local`\n\nengine, yap is **100% offline** — disconnect your\nnetwork and it still works. It records audio only while you hold/toggle the\nhotkey, keeps nothing on disk, and phones no one home. Cloud engines and the\noptional cleanup pass are strictly opt-in and only ever talk to the endpoint\n*you* configure.\n\nyap stamps the date of its first run on your machine — a tiny local\n`install.json`\n\n, kept on-device and never uploaded. There's no paywall today. But\nif a paid tier ever appears, everyone who installed *before* that day keeps the\nfree version: run `yap license`\n\nto see your install date and a portable code that\nproves it.\n\nyap is free and open source — built by a retired veteran, in his spare time,\nbecause dictation shouldn't be locked behind a subscription. If it saves you\ntime, a small donation helps cover real costs (like Apple's $99/yr signing fee\nfor warning-free Mac builds) and keeps it moving. Totally optional. yap is free\ntoday — and **early adopters stay free for good**: if a paid tier ever arrives,\neveryone who installed before it keeps the free version (see\n[Early adopters](#early-adopters)).\n\nMIT — see [LICENSE](/AkuchiS/yap/blob/main/LICENSE). Built on\n[faster-whisper](https://github.com/SYSTRAN/faster-whisper) /\n[OpenAI Whisper](https://github.com/openai/whisper).", "url": "https://wpnews.pro/news/yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt", "canonical_source": "https://github.com/AkuchiS/yap", "published_at": "2026-06-28 02:41:06+00:00", "updated_at": "2026-06-28 03:04:40.337781+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "natural-language-processing"], "entities": ["Yap", "Wispr Flow", "SuperWhisper", "OpenAI", "Groq", "Whisper", "MIT", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt", "markdown": "https://wpnews.pro/news/yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt.md", "text": "https://wpnews.pro/news/yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt.txt", "jsonld": "https://wpnews.pro/news/yap-free-offline-voice-dictation-for-mac-windows-linux-wispr-flow-alt.jsonld"}}