A fully private, local voice-to-text app for Android. Unlike alternatives that send your screen contents and keystrokes to remote servers, Flo only streams audio to a Whisper server you control on your own network. Nothing leaves your device except the audio you explicitly record.
Uses a floating bubble overlay — hold the bubble, speak, release — your speech is transcribed and pasted into the active text field.
Powered by Wyoming Whisper for speech-to-text, running on your own hardware.
The purple mic bubble appears on top of all apps when you tap into a text field. Tap and hold to record, release to transcribe and paste.
- An accessibility service detects when you focus a text field and shows a floating mic bubble
- Press and hold the bubble to stream audio to your Wyoming Whisper server over TCP
- Release to get the transcription back and paste it at your cursor position
Run Wyoming Whisper via Docker:
docker run -d \
-p 10300:10300 \
rhasspy/wyoming-whisper \
--model small --language enI run this on a server with a GPU over Tailscale, and use whisper v3 large with great results.
- Build and install the APK (or download from releases)
- Open Flo and enter your Wyoming Whisper server IP and port (default
10300) - Grant microphone and overlay permissions
- Enable the Flo accessibility service
- Open any app, tap a text field — the purple mic bubble appears on the right edge
Requires Android SDK with platform 35 and Java 17.
./gradlew assembleDebugThe APK will be at app/build/outputs/apk/debug/app-debug.apk.
app/src/main/java/com/flo/whisper/
├── ui/MainActivity.kt — Settings (host, port, language, permissions)
├── service/FloAccessibilityService.kt — Text field detection, bubble, recording, paste
├── overlay/BubbleView.kt — Custom bubble with recording/processing states
└── wyoming/WyomingClient.kt — Wyoming protocol TCP client
