繁體中文 | English
Too late to type — just speak.
Tap the mic, speak naturally, and your voice becomes polished text — right inside any app.
- IME Keyboard — A custom input method that commits transcription directly into any text field
- Floating Overlay — A draggable mic button that works across any app, auto-pastes via accessibility
- Dashboard App — Usage stats, transcription history, custom dictionary, and settings
- Groq Whisper API speech recognition (Large v3 / Turbo)
- LLM text enhancement — auto-corrects typos, removes filler words, adds punctuation
- Hallucination filter — 4-layer detection (speed, blocklist, repetition, low-energy) prevents garbage output
- Custom dictionary to improve proper noun recognition
- Google Drive sync — bidirectional vocabulary sync across devices
- Usage analytics with daily trend charts
- Material 3 dynamic color theming
Your API key goes directly to Groq — voice data never passes through our servers. All transcriptions are stored locally on your device.
- Build and install the app (see Development below).
- Enable TypeLate as an input method in Android Settings → Keyboard.
- Open the app and enter your Groq API Key (free to obtain).
- Switch to TypeLate keyboard in any app, tap the mic, speak, and the transcription fills in automatically.
User taps mic → VoiceRecorder → MediaRecorder → audio file
User taps stop → VoiceRecorder.stopAndTranscribe()
→ Groq Whisper API (OkHttp multipart POST)
→ HallucinationFilter (4-layer check)
→ TextEnhancer (optional LLM polish)
→ TextOutputHandler:
IME: InputConnection.commitText()
Overlay: AccessibilityService.pasteText()
→ AppDatabase.insertTranscription()
app/src/main/kotlin/com/typelate/android/
├── ime/ # IME service, keyboard UI, recorder, state machine
├── overlay/ # Floating overlay foreground service, animations
├── accessibility/ # Accessibility service (auto-paste)
├── data/ # SettingsRepository, SQLite database
├── sync/ # Google Drive vocabulary sync
├── ui/screens/ # Dashboard, History, Dictionary, Settings
└── ui/theme/ # Material 3 theme
| Component | Technology |
|---|---|
| Language | Kotlin 2.3.20 |
| UI Framework | Jetpack Compose (BOM 2026.03.00) |
| Build System | AGP 9.1.0 |
| HTTP Client | OkHttp 5.3.2 |
| Serialization | kotlinx-serialization 1.10.0 |
| Settings | DataStore 1.2.1 |
| Auth | Credential Manager 1.5.0 |
| AI / Speech | Groq API (Whisper STT + LLM enhancement) |
| Min SDK / Target SDK | 26 (Android 8.0) / 36 |
- Android SDK (
ANDROID_HOMEenv var orsdk.dirinlocal.properties) - just command runner (
brew install just) - Groq API Key (entered in app settings)
git clone https://github.com/bobo52310/TypeLate-android.git
cd TypeLate-android
# List all available commands
just
# Launch emulator
just emulator
# Build + install + launch
just run
# Or all-in-one (emulator + install + launch)
just full| Command | Description |
|---|---|
just build |
Build debug APK |
just release |
Build release APK (with ProGuard) |
just install |
Install to device |
just run |
Build + install + launch |
just dev |
Build + install + launch + logcat |
just emulator |
Launch emulator and wait for boot |
just screenshot |
Capture screenshot and open |
just logcat |
Filtered app log output |
just clear |
Clear app data on device |
just check |
Full build + lint check |
./gradlew assembleDebug # Build debug APK
./gradlew assembleRelease # Build release APK (ProGuard enabled)
./gradlew installDebug # Build and install to connected device
./gradlew build # Full build (compile + lint)- Enable IME Keyboard — Settings → System Keyboard Settings → Enable TypeLate
- Enable Accessibility — Settings → Accessibility → Enable TypeLate (for overlay auto-paste)
- Grant Overlay Permission — Settings → Grant floating window permission
- Enter API Key — Settings → Enter Groq API Key → Save
- Google Drive Sync (optional) — Settings → Google Drive Sync → Sign in
- TypeLate — macOS / Windows desktop app (Tauri + React + Rust)