Inspiration
Nerdearla runs more than 30 sessions in English for a mostly Spanish-speaking audience. Like almost every conference, live captions and translation were solved with expensive commercial tools and a lot of manual operation, so most rooms simply went without. We wanted the accessibility that big-budget events buy to be available to any open source conference: pick a room, pick a language, read along on your phone.
What it does
Transcriba takes the audio of every stage and produces real-time subtitles in the original language and translated, for 5, 10 or 30 rooms in parallel. Attendees open one page, choose their room and language, and read the captions on their phone; the same viewer works as a transparent overlay for OBS or on the room screen, with a QR code per room. Operators get a panel with audio levels, engine state and one-click room creation, plus SRT/VTT/TXT exports at the end of each talk. Audio comes from wherever the room already has it: a browser on the laptop next to the mixing desk, the RTMP stream from OBS, or a capture device. Setup is a wizard (transcriba init) that produces a config file and a .env; a single latency_profile setting trades sentence completeness for speed.
How we built it
Python and asyncio: one process runs dozens of rooms, each a pipeline of audio source → engine → captions. ffmpeg normalizes any input to 16 kHz PCM. The recommended engine streams that audio to Gemini's Live API with gemini-3.5-transcribe-live (interim results in under a second, final sentences at each pause, the event glossary as custom vocabulary) and translates every final sentence with gemini-3.5-flash-lite, using the previous sentences as context and a JSON schema for the output. For events that cannot use the cloud, a fully local engine runs faster-whisper for transcription and Gemma 4 through Ollama for translation. FastAPI serves REST and WebSockets; the frontend is plain HTML/JS with no build step, including an AudioWorklet that resamples microphone audio in the browser. Captions have a stable id and a lifecycle (partial → final → translated), so any client can render them with a few lines of code. Configuration is strict pydantic, and the reference documentation is generated from the models in English and Spanish.
Challenges we ran into
- Live API sessions are capped at about ten minutes, so we rotate sessions at a natural pause of the speaker, signal end-of-stream, and drain the last sentences while audio keeps queuing.
- Final transcripts arrive in pieces. Our first cut committed sentences too early ("…ask not what your country can"), so we made commits punctuation-aware, with different waits for complete and incomplete fragments.
- Idle rooms got their sessions dropped by the server, so connections now open with the first audio chunk and close after 30 seconds of silence, which also means an empty room costs nothing.
- Rejecting a WebSocket before accepting it leaves the browser with no error reason; the ingest page went from "disconnected" to explaining exactly what to fix.
- We could not run a browser in the build environment, so the frontend was verified with jsdom against a live server.
Accomplishments that we're proud of
It works end to end with a real microphone: original text appears while you speak, the translation follows one to three seconds after the pause. The whole Nerdearla programme (30 talks, about 22 room-hours) costs roughly US$ 16 with the recommended engine, inside the US$ 25 credit. A conference can deploy it in an afternoon with three commands and run it with one volunteer watching the panel. The project ships with 37 tests, including a fake Live API for rotation, draining and reconnection, and every document exists in English and Spanish.
What we learned
Speed is not about the model. Almost all perceived latency comes from deciding when a sentence is finished, and good translation needs the whole sentence, so the real design space is how you segment, not which model. Stage audio has a stable noise floor, so a simple energy VAD beats heavier dependencies. Keeping the code comment-free and generating the reference docs from the configuration models forced the documentation to stay honest.
What's next for Transcriba
Run it for real at Nerdearla 2026 and publish the transcripts afterwards. A pure Gemma-audio engine (Gemma 4 understands audio natively) for one-model local transcription and translation. Translations of the web UI and CLI, retroactive caption corrections when the next sentence clarifies the previous one, Prometheus metrics per room, and a community of conferences sharing glossaries and operating notes.
Log in or sign up for Devpost to join the conversation.