EdiBianco/OpenWhispr

Simple voice transcription for android phones with Whisper and local models

Kotlin

0

21 commits

updated Sep 16, 2026

See the code

README

OpenWispr Logo

OpenWispr

Free, open-source, on-device push-to-talk dictation for Android — a free alternative to Wispr Flow.

Speak naturally into any app and OpenWispr turns your raw speech into clear, polished text: filler words removed, punctuation and formatting fixed automatically, then inserted straight into whatever field you're already typing in. Tap the floating button, speak, tap again — done.

It's completely free to run. Cloud transcription and cleanup use your own Groq API key, and Groq's free tier is generous enough for everyday dictation without paying anything. Prefer to keep everything on-device? Local transcription needs no API key or internet connection at all.

This is a fork of kafkasl/phone-whisper, originally built around OpenAI. This fork switches cloud transcription and cleanup to Groq and adds a round of reliability and UX work on top — see below for the full list. If you find the original project useful, consider sponsoring the original author.

It supports:

  • Local on-device transcription with sherpa-onnx — no API key, no internet required
  • Cloud transcription with Groq Whisper — free API key, fast, no local model download
  • Optional AI cleanup with Groq — removes filler words, fixes punctuation and grammar, formats emails

What's changed in this fork

  • Transcription: whisper-1 (OpenAI) → whisper-large-v3 (Groq), via https://api.groq.com/openai/v1/audio/transcriptions
  • Cleanup: gpt-4o-mini (OpenAI) → openai/gpt-oss-120b (Groq), via https://api.groq.com/openai/v1/chat/completions
  • API key: the settings screen now asks for a free Groq API key (gsk_...) instead of an OpenAI key (sk-...), with a direct link to get one
  • CI: a GitHub Actions workflow builds the debug APK on every push to main and publishes it to a version-tagged GitHub Release
  • Overlay visibility: the mic overlay shows only while a text field is focused, fading in/out, using three redundant signals (accessibility focus events, a periodic focus poll, and system keyboard visibility) so it still shows up in apps with non-standard text composers (e.g. WhatsApp, Telegram)
  • Stability: hardened against crashes and killed background services, with a toggle to pause dictation without touching the Accessibility permission
  • Battery: detects when Android might shut the background service down to save power and offers a one-tap fix, so the overlay stays available
  • Natural language cleanup: a stricter cleanup prompt that handles self-corrections and preserves your intent instead of acting on it as a command, with room to add your own custom instructions on top
  • Update check: the app checks this repo's GitHub Releases on open (plus a manual "Check for updates" row in Settings), and installs updates entirely in-app -- it downloads the .apk itself and hands it straight to the system installer, no browser involved
  • Voice commands: say "Whisper Command" at the start of a recording to switch into command mode instead of normal dictation -- see Voice commands below
  • Settings screen: reorganized into Status / Dictation / Settings tabs, with a collapsible setup checklist (Audio, Accessibility, Battery) that folds away once everything's green
  • Restricted settings help: on Android 13+, sideloaded apps have the Accessibility toggle blocked by default with no explanation -- the app now walks you through unlocking it before sending you to the system screen
  • Update notes: the update dialog shows a short "what's new" for the new version (see CHANGELOG.md), not just a version number

Local on-device transcription is untouched — it never called OpenAI in the first place.

Why I built this

  • I like SwiftKey and want to keep it as keyboard but...
  • Most keyboard dictation felt too inaccurate
  • Gemini's voice input auto submits your transcription (which is pretty bad) so you can't edit it before sending
  • Post processing yields much better results, specially adding a list of keywords and technical terms you often use
  • Inserting text into the field you're already using lets you keep editing it like any other draft.

Install

Easiest: download the APK

Grab the latest debug APK from the Releases page on this fork. A GitHub Actions workflow builds and publishes a new version-tagged release automatically on every push to main.

Open it on your phone, install it, then launch the app once to finish setup.

Build from source

Requires JDK 17 and Android SDK.

git clone https://github.com/EdiBianco/OpenWhispr.git && cd OpenWhispr
make build

APK output:

app/build/outputs/apk/debug/app-debug.apk

If you use ADB:

make adb-install

How it works

  1. A small overlay button floats on screen
  2. Tap once to start recording
  3. Tap again to stop
  4. Audio is transcribed locally or in the cloud
  5. The text is inserted into the focused text field
  6. If insertion fails, the text is copied to the clipboard

Voice commands

Say "Whisper Command" at the start of a recording, followed by one of five whitelisted operations, and OpenWispr applies it to whatever's already in the focused field (or to text you dictate right after the command, if you give it fresh content):

  • "Whisper Command, summarize this in two sentences" -- summarize, with an optional length or limit
  • "Whisper Command, enhance the flow" -- rewrite for smoother, more natural flow without changing meaning
  • "Whisper Command, translate to Italian" -- translate to the named language
  • "Whisper Command, make this more formal" -- change tone (formal, casual, professional, friendly, ...)
  • "Whisper Command, turn this into a list" -- reformat as a bulleted or numbered list

You can chain more than one in the same command, and they're applied in the order you say them -- e.g. "Whisper Command, translate to Italian and turn it into a list" translates first, then lists the result.

Anything outside these five is deliberately refused rather than attempted -- the same strict-contract approach as the default cleanup prompt, just inverted: this mode exists to act on instructions, but only these ones.

Off by default -- enable it under Voice Commands in the app, where you can also change the trigger phrase and see the same examples list.

Setup

First-time setup

  1. Open OpenWispr
  2. Grant the audio recording permission
  3. Enable the Accessibility Service
  4. Choose your transcription mode:
    • Local: download a model in the app
    • Cloud: paste your free Groq API key — the app links straight to that page when you tap to set the key
  5. When prompted, allow OpenWispr to run unrestricted by battery optimization — otherwise Android may shut the background service down and the overlay will disappear until you reopen the app

Once setup is done, the floating button is ready.

Keeping the background service alive

Android is aggressive about killing background services to save battery, and an Accessibility Service is no exception. OpenWispr does a few things to stay running:

  • Runs as a foreground service with a persistent, silent, minimum-priority notification — the standard way to keep a background service alive when the app is swiped away in the recent-apps screen
  • Prompts you to exempt the app from battery optimization (Settings → Battery optimization in the app, or the OS dialog it opens) the first time it detects the Accessibility Service is on but the exemption isn't granted
  • Defensive error handling around accessibility events and local-model loading, so a single bad event or model can't crash the whole service process and force you to clear app storage and re-grant permissions

A "Background service" switch in the app lets you pause dictation (hide the overlay, stop reacting to taps) without revoking the Accessibility permission — handy if you want to quiet it temporarily instead of walking through Android's accessibility settings.

Some phone manufacturers (Samsung, Xiaomi, OnePlus, and others) layer their own battery/app-sleep managers on top of stock Android and may still kill the service even after you grant the exemption above. If the overlay keeps disappearing, check your phone's own battery/app management settings for an "autostart" or "keep in background" option for OpenWispr.

Why does it need Accessibility?

OpenWispr uses Android Accessibility Service for one narrow reason: to insert dictated text into the currently focused text field across apps.

It does not replace your keyboard. It does not run background automation. It only acts after you explicitly tap the overlay button.

Privacy

OpenWispr supports two modes:

  • Local mode: audio stays on-device
  • Cloud mode: audio is sent directly from your device to Groq's transcription API
  • Optional cleanup: transcript text is sent directly from your device to Groq's chat API

I don't run a backend for this app. In cloud mode, requests go straight from your phone to Groq using your own API key.

Full policy: PRIVACY.md

Local models

Models are stored in app storage under:

/data/data/com.edib.openwhispr/files/models/

Current catalog:

ModelSizeNotes
Parakeet 110M100 MBBest default
Whisper Base199 MBSolid baseline
Parakeet 0.6B465 MBBest quality
Moonshine Tiny103 MBFastest

The app downloads and extracts models directly from the sherpa-onnx release archives.

Development

make build       # build debug APK
make test        # run unit tests
make adb-install # build + install via ADB
make clean       # clean build artifacts

App compatibility

OpenWispr works best in apps that use standard Android text fields. Some apps use custom text surfaces or terminal-style views, which may not support direct accessibility paste. When insertion is not possible, OpenWispr falls back to copying the transcript to the clipboard.

Termux

Termux's main terminal area is not a standard Android text field, so direct insertion may not work there.

To use OpenWispr in Termux:

  1. Focus Termux
  2. Swipe the extra keys row (ESC, CTRL, ALT, arrows, etc.) left or right
  3. Switch to Termux's native text input box
  4. Dictate there

Once text is inserted into the native input box, Termux sends it to the terminal normally.

Current limitations

  • Accessibility permission is required for cross-app insertion
  • Some apps may block paste or text injection
  • Some apps use custom input surfaces instead of standard Android text fields
  • Local models are large
  • Cloud mode requires your own Groq API key

Support the project

OpenWispr itself is free — if the underlying project it's forked from saves you time, you can sponsor the original author on GitHub:

License

Personal project. Do whatever you want with it.

Contributors

kafkasl

21 commits

EdiBianco/OpenWhispr

Simple voice transcription for android phones with Whisper and local models

Kotlin

0

21 commits

updated Sep 16, 2026

See the code

README

OpenWispr Logo

OpenWispr

Free, open-source, on-device push-to-talk dictation for Android — a free alternative to Wispr Flow.

Speak naturally into any app and OpenWispr turns your raw speech into clear, polished text: filler words removed, punctuation and formatting fixed automatically, then inserted straight into whatever field you're already typing in. Tap the floating button, speak, tap again — done.

It's completely free to run. Cloud transcription and cleanup use your own Groq API key, and Groq's free tier is generous enough for everyday dictation without paying anything. Prefer to keep everything on-device? Local transcription needs no API key or internet connection at all.

This is a fork of kafkasl/phone-whisper, originally built around OpenAI. This fork switches cloud transcription and cleanup to Groq and adds a round of reliability and UX work on top — see below for the full list. If you find the original project useful, consider sponsoring the original author.

It supports:

  • Local on-device transcription with sherpa-onnx — no API key, no internet required
  • Cloud transcription with Groq Whisper — free API key, fast, no local model download
  • Optional AI cleanup with Groq — removes filler words, fixes punctuation and grammar, formats emails

What's changed in this fork

  • Transcription: whisper-1 (OpenAI) → whisper-large-v3 (Groq), via https://api.groq.com/openai/v1/audio/transcriptions
  • Cleanup: gpt-4o-mini (OpenAI) → openai/gpt-oss-120b (Groq), via https://api.groq.com/openai/v1/chat/completions
  • API key: the settings screen now asks for a free Groq API key (gsk_...) instead of an OpenAI key (sk-...), with a direct link to get one
  • CI: a GitHub Actions workflow builds the debug APK on every push to main and publishes it to a version-tagged GitHub Release
  • Overlay visibility: the mic overlay shows only while a text field is focused, fading in/out, using three redundant signals (accessibility focus events, a periodic focus poll, and system keyboard visibility) so it still shows up in apps with non-standard text composers (e.g. WhatsApp, Telegram)
  • Stability: hardened against crashes and killed background services, with a toggle to pause dictation without touching the Accessibility permission
  • Battery: detects when Android might shut the background service down to save power and offers a one-tap fix, so the overlay stays available
  • Natural language cleanup: a stricter cleanup prompt that handles self-corrections and preserves your intent instead of acting on it as a command, with room to add your own custom instructions on top
  • Update check: the app checks this repo's GitHub Releases on open (plus a manual "Check for updates" row in Settings), and installs updates entirely in-app -- it downloads the .apk itself and hands it straight to the system installer, no browser involved
  • Voice commands: say "Whisper Command" at the start of a recording to switch into command mode instead of normal dictation -- see Voice commands below
  • Settings screen: reorganized into Status / Dictation / Settings tabs, with a collapsible setup checklist (Audio, Accessibility, Battery) that folds away once everything's green
  • Restricted settings help: on Android 13+, sideloaded apps have the Accessibility toggle blocked by default with no explanation -- the app now walks you through unlocking it before sending you to the system screen
  • Update notes: the update dialog shows a short "what's new" for the new version (see CHANGELOG.md), not just a version number

Local on-device transcription is untouched — it never called OpenAI in the first place.

Why I built this

  • I like SwiftKey and want to keep it as keyboard but...
  • Most keyboard dictation felt too inaccurate
  • Gemini's voice input auto submits your transcription (which is pretty bad) so you can't edit it before sending
  • Post processing yields much better results, specially adding a list of keywords and technical terms you often use
  • Inserting text into the field you're already using lets you keep editing it like any other draft.

Install

Easiest: download the APK

Grab the latest debug APK from the Releases page on this fork. A GitHub Actions workflow builds and publishes a new version-tagged release automatically on every push to main.

Open it on your phone, install it, then launch the app once to finish setup.

Build from source

Requires JDK 17 and Android SDK.

git clone https://github.com/EdiBianco/OpenWhispr.git && cd OpenWhispr
make build

APK output:

app/build/outputs/apk/debug/app-debug.apk

If you use ADB:

make adb-install

How it works

  1. A small overlay button floats on screen
  2. Tap once to start recording
  3. Tap again to stop
  4. Audio is transcribed locally or in the cloud
  5. The text is inserted into the focused text field
  6. If insertion fails, the text is copied to the clipboard

Voice commands

Say "Whisper Command" at the start of a recording, followed by one of five whitelisted operations, and OpenWispr applies it to whatever's already in the focused field (or to text you dictate right after the command, if you give it fresh content):

  • "Whisper Command, summarize this in two sentences" -- summarize, with an optional length or limit
  • "Whisper Command, enhance the flow" -- rewrite for smoother, more natural flow without changing meaning
  • "Whisper Command, translate to Italian" -- translate to the named language
  • "Whisper Command, make this more formal" -- change tone (formal, casual, professional, friendly, ...)
  • "Whisper Command, turn this into a list" -- reformat as a bulleted or numbered list

You can chain more than one in the same command, and they're applied in the order you say them -- e.g. "Whisper Command, translate to Italian and turn it into a list" translates first, then lists the result.

Anything outside these five is deliberately refused rather than attempted -- the same strict-contract approach as the default cleanup prompt, just inverted: this mode exists to act on instructions, but only these ones.

Off by default -- enable it under Voice Commands in the app, where you can also change the trigger phrase and see the same examples list.

Setup

First-time setup

  1. Open OpenWispr
  2. Grant the audio recording permission
  3. Enable the Accessibility Service
  4. Choose your transcription mode:
    • Local: download a model in the app
    • Cloud: paste your free Groq API key — the app links straight to that page when you tap to set the key
  5. When prompted, allow OpenWispr to run unrestricted by battery optimization — otherwise Android may shut the background service down and the overlay will disappear until you reopen the app

Once setup is done, the floating button is ready.

Keeping the background service alive

Android is aggressive about killing background services to save battery, and an Accessibility Service is no exception. OpenWispr does a few things to stay running:

  • Runs as a foreground service with a persistent, silent, minimum-priority notification — the standard way to keep a background service alive when the app is swiped away in the recent-apps screen
  • Prompts you to exempt the app from battery optimization (Settings → Battery optimization in the app, or the OS dialog it opens) the first time it detects the Accessibility Service is on but the exemption isn't granted
  • Defensive error handling around accessibility events and local-model loading, so a single bad event or model can't crash the whole service process and force you to clear app storage and re-grant permissions

A "Background service" switch in the app lets you pause dictation (hide the overlay, stop reacting to taps) without revoking the Accessibility permission — handy if you want to quiet it temporarily instead of walking through Android's accessibility settings.

Some phone manufacturers (Samsung, Xiaomi, OnePlus, and others) layer their own battery/app-sleep managers on top of stock Android and may still kill the service even after you grant the exemption above. If the overlay keeps disappearing, check your phone's own battery/app management settings for an "autostart" or "keep in background" option for OpenWispr.

Why does it need Accessibility?

OpenWispr uses Android Accessibility Service for one narrow reason: to insert dictated text into the currently focused text field across apps.

It does not replace your keyboard. It does not run background automation. It only acts after you explicitly tap the overlay button.

Privacy

OpenWispr supports two modes:

  • Local mode: audio stays on-device
  • Cloud mode: audio is sent directly from your device to Groq's transcription API
  • Optional cleanup: transcript text is sent directly from your device to Groq's chat API

I don't run a backend for this app. In cloud mode, requests go straight from your phone to Groq using your own API key.

Full policy: PRIVACY.md

Local models

Models are stored in app storage under:

/data/data/com.edib.openwhispr/files/models/

Current catalog:

ModelSizeNotes
Parakeet 110M100 MBBest default
Whisper Base199 MBSolid baseline
Parakeet 0.6B465 MBBest quality
Moonshine Tiny103 MBFastest

The app downloads and extracts models directly from the sherpa-onnx release archives.

Development

make build       # build debug APK
make test        # run unit tests
make adb-install # build + install via ADB
make clean       # clean build artifacts

App compatibility

OpenWispr works best in apps that use standard Android text fields. Some apps use custom text surfaces or terminal-style views, which may not support direct accessibility paste. When insertion is not possible, OpenWispr falls back to copying the transcript to the clipboard.

Termux

Termux's main terminal area is not a standard Android text field, so direct insertion may not work there.

To use OpenWispr in Termux:

  1. Focus Termux
  2. Swipe the extra keys row (ESC, CTRL, ALT, arrows, etc.) left or right
  3. Switch to Termux's native text input box
  4. Dictate there

Once text is inserted into the native input box, Termux sends it to the terminal normally.

Current limitations

  • Accessibility permission is required for cross-app insertion
  • Some apps may block paste or text injection
  • Some apps use custom input surfaces instead of standard Android text fields
  • Local models are large
  • Cloud mode requires your own Groq API key

Support the project

OpenWispr itself is free — if the underlying project it's forked from saves you time, you can sponsor the original author on GitHub:

License

Personal project. Do whatever you want with it.

Contributors

kafkasl

21 commits

Languages

Kotlin

99.1%