Turning hours-long spiritual discourses into searchable PDF transcripts.
Live · 25+ daily users
a team project, built by 3 of us

- 50+active users
- 200+lectures transcribed
- ~1.5 haverage lecture length
- 90%+accuracy (daily eval)
- $0.10–0.15cost per transcription
Why we built it
the problem, minus the buzzwordsSpiritual 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- Upload1
React app on Cloudflare Pages. Pick language, upload audio, watch live status.
#client
- Backend API2
FastAPI handles auth, job records in PostgreSQL, and pushes a job to Redis.
#api
- CPU worker3
FFmpeg converts audio and splits it into 20–25 min chunks on silence.
#cpu-bound
- IO worker4
Transcribes each chunk with Gemini, aggregates into structured HTML, renders the PDF.
#io-bound
- 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.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.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.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.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.


