Building VocoLiss: Text-to-Speech Reading With AI That Degrades Honestly Offline

Aug 2026 · 3 min read

speech

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