A full-stack studio for producing audiobooks with ElevenLabs TTS. Upload a manuscript, split it into chapters and chunks, normalize the text for speech, generate audio takes, review and re-record, then export stitched chapter audio.
Built as a personal project to explore the end-to-end pipeline of professional audiobook production.
- Ingest — Upload EPUB, PDF, DOCX, or plain text; auto-detect chapter structure
- Text normalization — Estonian-language NLP pipeline (estnltk) handles dates, abbreviations, ordinals, and morphological forms before TTS
- Pronunciation dictionary — Per-project rules for proper nouns, foreign words, and edge cases
- TTS generation — Sends normalized chunks to ElevenLabs API; stores multiple takes per chunk
- Studio editor — Tiptap-based editor with inline waveform; mark takes, re-generate individual chunks
- Audio export — Stitch approved takes into chapter-level audio files
- Transcript viewer — Sync transcript display with playback position
/apps
/web — Next.js 16 frontend + API routes (React 19, Tailwind, Supabase Auth)
/nlp-service — FastAPI microservice for Estonian text normalization (estnltk, whisperx)
/desktop — Electron shell (optional local mode)
/packages
/elevenlabs-client — Typed ElevenLabs API wrapper + voice cache
/text-pipeline — Chapter chunking logic (paragraph-aware, 2500 char target)
/editor-sync — Tiptap extension: chunk nodes, QA flags, studio context
/renderer — Shared UI components (audio player, scrub bar, transcript viewer)
/db — Supabase migrations + typed client
/api-client — Internal service client
Data store: Supabase (PostgreSQL + Storage + Auth + RLS) Deployment: Railway (web + NLP service as separate services) Monorepo: Turborepo + pnpm workspaces
| Layer | Tech |
|---|---|
| Frontend | Next.js 16, React 19, TypeScript, Tailwind CSS 4 |
| Editor | Tiptap 3 with custom chunk node extension |
| Audio UI | wavesurfer.js |
| Backend | Next.js API routes, FastAPI (Python) |
| NLP | estnltk, morphological synthesis via vabamorf |
| TTS | ElevenLabs API (@elevenlabs/elevenlabs-js) |
| Database | Supabase (PostgreSQL, RLS, Storage) |
| Auth | Supabase Auth (SSR) |
| Monorepo | Turborepo, pnpm workspaces |
| Deployment | Railway, Nixpacks |
Prerequisites: Node 20+, pnpm, Python 3.11+, ffmpeg
# Install dependencies
pnpm install
# Copy and fill env vars
cp .env.example .env.local
# Required: ELEVENLABS_API_KEY, NEXT_PUBLIC_SUPABASE_URL,
# NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY,
# NLP_SERVICE_URL, NLP_SERVICE_SECRET
# Run NLP service (separate terminal)
cd apps/nlp-service
pip install -r requirements.txt
uvicorn main:app --port 8000
# Run web app
pnpm turbo dev --filter=@digiread/webApply DB migrations via the Supabase dashboard or CLI using files in packages/db/migrations/.
Personal project / prototype. Not production-hardened. Built to explore the audiobook production pipeline and ElevenLabs API surface.