Building VocoLiss: Text-to-Speech Reading With AI That Degrades Honestly Offline
Aug 2026 · 3 min read

I shipped VocoLiss — an AI text-to-speech and reading assistant. Anything with words (PDF, DOCX, EPUB, TXT, RTF, PPTX, images, camera OCR, clipboard, web URL) becomes spoken audio, with a reader that highlights as it goes, then optional AI study tools on top.
Design language is “aurora glass” — gradients, glass, code-drawn illustrations, micro-animations — but the engineering story is transport + trust.
Import is the product surface
People don’t start with a blank text field. They start with a file in Drive, a scan of a handout, or a URL. VocoLiss routes all of that through an import pipeline into a local document model. OCR uses ML Kit (multi-page, enhance, edit, listen). Guest session on launch — no login wall.
TTS that doesn’t race itself
Platform neural voices via flutter_tts, spoken sentence-by-sentence. Speed 0.25–4×, pitch, sleep timer, loop, listening queue, background audio (iOS audio mode).
The subtle bug class in TTS apps: pause, seek, or change voice mid-utterance and callbacks from the previous generation light up the wrong words. A generation counter invalidates stale callbacks. A TextMap splits the document into word/sentence spans with character offsets so progress events map back to highlight ranges. Tap-to-seek, auto-scroll, time estimates, focus mode, multiple fonts/themes.
Voice library groups platform voices with curated personas for browsing — still grounded in what the OS actually ships.
AI behind a proxy, fallback with rules
Cloud path: published Vocoliss Lovable /api/chat companion. LOVABLE_API_KEY stays server-side. Multi-turn chat, summaries (multiple styles), podcasts, flashcards, quizzes, translator, writing tools, mind map, timeline — free-tier gated per document.
Offline / network failure: on-device extractive engine.
Critical product rule in AiService: only use extractive “dummy” answers when the failure looks like a real outage (socket, DNS, timeout). 401 / 403 / 400 / 5xx / auth errors must not silently become offline summaries — that would hide a broken backend behind fake success.
Same honesty theme as FloorMind and SellSnap: degraded mode is allowed; lying about why is not.
Study, notes, accessibility
Pomodoro, daily goals, streaks, vocabulary, analytics. Notes include dictated voice notes via on-device speech-to-text. Biometric unlock + PIN. Dyslexia-friendly font, high contrast, large text, reduced motion (including system setting).
Persistence: JSON on device + SharedPreferences. Riverpod over an AppStore initialized before runApp.
What I’d still harden
Wire StoreKit / Play Billing for the modeled paywall plans. Optional real OAuth if cloud accounts matter. iOS simulator is unsupported on Apple Silicon for ML Kit — document that for contributors. Own the chat proxy long-term (keys, quotas, abuse).
Bet: listening apps win on transport correctness; AI wins when offline isn’t a costume for server bugs.
- flutter
- tts
- accessibility
- ai
- reading
- offline-first
- productivity