← back to all projects
project no. 4

Turning hours-long spiritual discourses into searchable PDF transcripts.

Live · 25+ daily users

a team project, built by 3 of us

Transcribe screenshot
25+ people use this every day!
  • 50+
    active users
  • 200+
    lectures transcribed
  • ~1.5 h
    average lecture length
  • 90%+
    accuracy (daily eval)
  • $0.10–0.15
    cost per transcription

Why we built it

the problem, minus the buzzwords

Spiritual discourses (pravachans) are long, often 1–3 hours, and the speaker moves between Hindi, English and Sanskrit shlokas mid-sentence. Off-the-shelf transcription tools either mangle the shlokas or choke on the length, and the good ones are expensive at this volume.

People wanted something simple: upload the recording, come back later, download a clean, structured PDF they can read and search.

How it works

three services talking over redis queues
  1. Upload1

    React app on Cloudflare Pages. Pick language, upload audio, watch live status.

    #client

  2. Backend API2

    FastAPI handles auth, job records in PostgreSQL, and pushes a job to Redis.

    #api

  3. CPU worker3

    FFmpeg converts audio and splits it into 20–25 min chunks on silence.

    #cpu-bound

  4. IO worker4

    Transcribes each chunk with Gemini, aggregates into structured HTML, renders the PDF.

    #io-bound

  5. Eval5

    A daily evaluation pipeline publishes accuracy metrics to self-hosted Langfuse.

    #quality

  • +Orphan-task recovery re-queues jobs that a crashed worker left behind.
  • +If Redis goes down, the API fails over to the database so no upload is lost.
  • +Dockerised on Oracle Cloud; Cloudflare DDoS protection in front of both tiers.

Built with React, FastAPI, Redis, PostgreSQL, Gemini, FFmpeg, Langfuse, Docker, Oracle Cloud, Cloudflare.

Decisions we made

and why. mostly why.
  1. 1.Split CPU work from IO work

    FFmpeg conversion and silence detection are CPU-heavy. Gemini calls mostly wait on the network. Putting them in separate workers means a long FFmpeg job never blocks transcription, and each side can be scaled on its own.

  2. 2.Chunk on silence, not on a timer

    Cutting every N minutes can split a word or a shloka in half, and the model then garbles both sides. Splitting at natural pauses into 20–25 minute chunks keeps each chunk coherent while staying well inside the model’s limits.

  3. 3.Measure accuracy every day

    Prompt tweaks for Sanskrit and mixed-language speech can quietly make things worse. A daily eval run publishing to Langfuse tells us if accuracy drifts, instead of finding out from users.

  4. 4.Design for the cheap path

    Running on Oracle Cloud with Gemini keeps a 1.5-hour lecture at about $0.10–0.15, roughly 75% cheaper than leading alternatives. That matters for a tool used by a community, not a company.

Screens

proof it exists
Transcribe landing page
Uploading a lecture with language selection
Dashboard with transcription status and PDF downloads
Transcribe admin view
next up (you’ve come this far)
ExpenseGauge →
A money tracker that keeps working when the network doesn’t.