Sep 26, 2026

Hawking

tts ai full stack kororo voice-model

Overview & Goals

Hawking is a text-to-speech reading app. It allows users to upload PDF, DOCX, EPUB, and other document formats, reads them aloud with word/sentence highlighting synced to the audio, and offers voice cloning and library organization features.

Architecture

The application follows a decoupled client-server architecture:

  • Frontend: Single Page Application (SPA) built with React and Vite. It handles document upload, displays the document library, renders parsed chunk text, and manages per-block audio generation, polling, and playback.
  • Block text rendering: ReaderBlockText is the single shared component for parsed block text everywhere Document Detail shows readable text — Text View, Original view (TXT blocks), and the PDF read-along panel. It layers playback word highlights (outer span + bg-brand background) and optional bionic bold segments (renderBionicInline inside each word). Word/timestamp pairing lives in textHighlight.ts (assignWordTimestamps with search-ahead + number-word equivalence).
  • Backend: REST API built with FastAPI. It handles multi-format document parsing and delegates TTS synthesis to a sequential in-process job queue (backend/tts/job_queue.py).
  • TTS Layer: Kokoro TTS model is loaded into memory exactly once as a Singleton. Audio generation runs through TTSJobQueue, which processes one job at a time on a background worker thread (document Kokoro jobs and Voice Clone Studio Chatterbox jobs share the same queue). Additional requests are queued (not dropped, not run in parallel).
  • Database: SQLite via SQLAlchemy. Contains documents and document_blocks.
    • Data Modeling: The text is parsed into a document_blocks table storing ordered chunks.
  • File Storage: Generated audio files are stored in a persistent local directory (backend/data/audio) and served via API endpoints.

This build was uploaded as a hackathon project

Hackathon

Hack-e-Awadh

View All Projects
Give a star to encourage!Discussion
Start a new conversation!
Login to join the discussion