EN
Open-source simultaneous interpretation in the browser. Human interpreters or an AI pipeline, streamed to every listener's phone over WebRTC.
Floor audio from a meeting feed or the venue's mixer.
Picks a language. Gets audio, and captions where enabled.
voxbento.com/listener/ots26
v1 relayed interpreter audio through Python (aiortc), and listeners played HLS, which buffers whole segments before playing.
Publish WHIP straight to MediaMTX, play back over WHEP, and keep FastAPI for coordination only.
WebRTC plays packets as they arrive; Python stops being a bottleneck for every listener.
WebRTC needs a reachable UDP port for ICE, and each listener holds a connection to MediaMTX. HLS caches through a CDN more easily.
The migration PRs below, and the old HLS config: 1 s segments with a 3-segment buffer. Delay hasn't been benchmarked yet.
Organisers upload thousands of terms ("FOSSASIA", "pull request"). Sending all of them with every caption segment makes LLM calls slower and costlier.
Per segment and language: keep terms that appear in the text, prefer booth over room over event entries, always keep priority ≥ 90, cap at 80.
A bounded prompt keeps provider latency and token cost predictable, however large the glossary.
Exact and phrase matching can miss inflected forms. The local NLLB model ignores glossaries and persona entirely.
A test with 10,000 matching terms stays at 80 entries and keeps the event loop responsive. tests/test_ai_interpretation.py · PR #888
ffmpeg reads a channel over RTSP
Deepgram, OpenAI, ElevenLabs, NVIDIA
OpenAI, Anthropic, Gemini, Groq
Deepgram Aura
Eventyay integrates through invite tokens and subtitle WebSocket URLs (#333). OAuth apps can create events, booths and listener links through the API.
# create the event, then a booth per language POST /api/v1/events/ POST /api/v1/events/ots26/rooms/1/booths/de # a listener link for every ticket holder POST /api/v1/events/ots26/rooms/1/listener-token # we call you back when a booth goes live ← session.status_changed X-VoxBento-Signature # known gaps: transcription routes (#507), # GET /events/{slug} (#619)
Arnav Angarkar · 3rd year, IIIT Dharwad · GSoC 2026 with FOSSASIA
Apache 2.0. Anyone can run it at their event, fork it, or send the next PR. That's the whole point.
Plain ES modules on the front end. No framework, no build step for the UI.
Two interpreters live at once means listeners hear both. MediaMTX replaces the old publisher, and the booth registry decides who's active.
Going live redeems a single-use ticket. It expires in 30 seconds and only opens that booth's path, for the active interpreter. Tickets live in memory, so this assumes one portal replica. Built by Sanket Kokate (#796).
The browser never says who it is. Roles come from the server session, so a modified client can't promote itself.
No amount of frontend tuning fixes audio that takes the long way round.
Python coordinates. A media server moves the human audio; AI workers read a copy.
621 merged across FOSSASIA. Each one taught me something about the code or the people.