Skip to content

Repository files navigation

Yoice

A Wispr Flow-style floating-bubble voice dictation app for Android — but 100% on-device: speech recognition runs locally via NVIDIA Parakeet TDT v3 (through sherpa-onnx), with no server, no cloud API, and no network dependency beyond the one-time ~600 MB model download.

Tap the floating bubble to start dictating anywhere text can be entered; the transcribed text is injected directly at the cursor via Android's Accessibility API, the same way Wispr Flow or similar tools do it.

The app's own UI is in French (built for personal daily use); this README and the source comments are in English.

Features

  • Floating draggable bubble, visible only when a text field is focused
  • Push-to-talk or start/stop recording modes
  • Animated equalizer + rotating ring while recording, auto-shrinks after a few seconds of inactivity
  • Automatic injection at the cursor the moment transcription finishes — no manual confirmation step
  • Cancel button while recording (discard without transcribing)
  • Word count and dictation history, stored locally (history.jsonl in app-private storage, never transmitted), with per-entry copy/delete
  • Black & white design, no telemetry, no accounts

How it works

  1. RECORD_AUDIO + SYSTEM_ALERT_WINDOW (floating bubble) + FOREGROUND_SERVICE_MICROPHONE capture audio while the bubble is recording.
  2. On stop, the raw PCM samples are decoded in one batch pass by ParakeetRecognizer (OfflineRecognizer, greedy decoding — this is what makes it fast even on a phone CPU; there is no real-time streaming, the whole utterance is transcribed after you stop talking).
  3. DictationAccessibilityService locates the currently focused text field and inserts the transcribed text at the cursor.
  4. INTERNET is used only the first time, to download the model files from Hugging Face; the app works fully offline afterward.

Requirements

  • Android 9 (API 28) or newer, arm64-v8a device
  • ~600 MB free storage for the Parakeet model (downloaded once, in-app)
  • Accessibility permission (for cursor text injection) and overlay permission (for the floating bubble)

Building

No Android Studio required — a Docker image builds the debug APK end to end:

docker build -t yoice-android-build .
docker run --rm \
-v "$(pwd)":/project \
-v gradle-cache:/root/.gradle \
-v android-debug-keystore:/root/.android \
yoice-android-build

Output: app/build/outputs/apk/debug/app-debug.apk. The android-debug-keystore volume keeps the debug signing key stable across builds — without it, every build gets a new random key and Android refuses to install updates over a previous install (forcing an uninstall, which loses your downloaded model and dictation history).

The first build downloads Gradle, the Android SDK, and dependencies (~1 GB); later builds reuse the gradle-cache volume.

Known limitations

  • No true streaming: transcription happens in one batch pass after you stop recording, not word-by-word while speaking.
  • No custom dictionary / hotwords yet (sherpa-onnx exposes a hotwords API, but it was designed for other model families and hasn't been validated with Parakeet TDT here).
  • On some OEM Android skins with aggressive background-process restrictions (e.g. Vivo/OriginOS), the accessibility permission can get silently revoked after a phone reboot — re-enable it manually, then reboot once more if the toggle doesn't stick.

Credits & license

Licensed under the Apache License 2.0.

ParakeetRecognizer.kt and ModelManager.kt are adapted from TranSlander (Apache 2.0). See NOTICE for full attribution.

Speech recognition uses the NVIDIA Parakeet TDT model (CC-BY-4.0), converted to ONNX by k2-fsa/sherpa-onnx (Apache 2.0). The model is downloaded on first run and is not bundled in this repository.

About

On-device voice dictation for Android (floating bubble, Parakeet TDT v3 via sherpa-onnx, no server/cloud)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages