fossasia/voxbento

Open Source AI powered Interpretation Platform https://voxbento.com

Python

1,514

579 commits

updated Oct 15, 2026

See the code

README

Voxbento

Voxbento is a real-time interpretation platform for live events. It provides a browser-first, zero-install experience for simultaneous interpreters, allowing them to monitor the main floor video via Jitsi and broadcast translated audio to attendees with low latency.

Official Documentation: docs.voxbento.com

Interpreters stream live audio via WebRTC/WHIP → MediaMTX → WHEP (WebRTC playback). Booth coordination (who is active, relay handoff, chat) runs over WebSocket. Administrators can find hosted events in /admin/events/ by searching either the event name or slug. Search treats % and _ literally, pagination URL-encodes reserved characters, blank searches show all events, and out-of-range pages open the last filtered page.

Rooms can optionally add a listener-side audio synchronization delay for WHEP playback. The default is 0 ms, which keeps the existing low-latency HTML audio path unchanged. Organizers can set values such as 1000, 2000, 5000, or 8000 ms when a room's livestream video, captions, embedded player, or other external media is delayed and translated audio needs to line up with it. The delay is applied in the listener browser only; MediaMTX, WHIP, WHEP, and RTP packets are not changed. Within the organizer workspace, organizers can manage and search rooms by name within each event using server-side, case-insensitive filtering.

Management dashboards

  • Event owners manage event configuration at /workspace/.
  • Room coordinators use /mission-control/, which limits them to their assigned rooms.
  • System administrators use /admin/ for instance-wide administration.
  • Existing organizer bookmarks under /admin/events/... redirect to the matching /workspace/events/... URL. HTTP methods and query strings are preserved, so old forms and filtered room-list bookmarks continue to work.

The workspace and admin surfaces share the same management implementation and authorization checks. This URL separation does not change OAuth authorization, token refresh, reconnect, or disconnect behavior for Eventyay integrations.


How it works

Interpreter browser
  │  iframe → Jitsi Meet (Monitor conference floor video/audio)
  │  mic → RTCPeerConnection → WHIP POST
  ▼
MediaMTX :8889 (WHIP ingest + WHEP)   Python is never in the audio path
  │  WebRTC termination + remux
  └──► WHEP :8889 ←── attendees connect via WebRTC (sub-second latency)

Interpreter / Coordinator browser
  │  WebSocket /ws/booth/{booth_id}
  ▼
FastAPI portal :8000 (coordination, state, JWT, REST)
  │
  ├──► Background Transcription (ffmpeg → Deepgram/OpenAI/Local)
  └──► Background Translation (Groq/Anthropic/Gemini)

Floor Audio Bot (floor-bot)
  │  Headless Chromium → Joins Jitsi Meeting
  └──► ffmpeg → RTSP → MediaMTX → Transcription/Translation

Setup

Prerequisites

DependencyVersionPurpose
Python3.13+FastAPI portal
uvlatestPython package manager
MediaMTX1.xWebRTC/HLS audio server
Docker & Docker ComposelatestJitsi stack (or full Docker setup)

Option 1 — Docker Compose (everything in containers)

The portal runs code from its image; rebuild to apply changes. Production updates validate a separate candidate checkout before replacing services; see the deployment guide.

All services (portal, MediaMTX, Jitsi) start with one command:

git clone https://github.com/fossasia/voxbento.git
cd voxbento

# Configure environment
cp .env.example .env

# Required for API key encryption: set your encryption key (must be 32 characters or longer)
echo "API_KEY_ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .env

# Required for MediaMTX-to-portal publish authorization
echo "MEDIAMTX_AUTH_HOOK_SECRET=$(openssl rand -hex 32)" >> .env

# Required for Jitsi video: set the IP JVB advertises to browsers
# macOS:  ipconfig getifaddr en0
# Linux:  hostname -I | awk '{print $1}'
echo 'JVB_ADVERTISE_IPS=192.168.1.x' >> .env

docker compose up --build

Open http://localhost:8000 — all services are running.

For detailed API documentation, environment variables, and configuration, visit docs.voxbento.com. Native development setup details can also be found in CONTRIBUTING.md.


Upgrade Notes

Admin login migration

The legacy shared ADMIN_PASSWORD login has been removed. Before upgrading, ensure two active, email-verified administrator accounts can sign in with their own credentials, then remove that variable from all deployment configuration. See the operator migration guide for the rollout and break-glass recovery procedure.

Admin login requires verified email and shares the normal login limit of 10 attempts per email address per hour.

Single sign-in page

Admins, organizers and attendees all sign in at /login. The separate admin form is gone: /admin/login now redirects to /login?next=/admin/, so update bookmarks or scripts that posted to it. Entering an email that has no account continues to /register with the email filled in.

API Key Encryption & Rotation

A mandatory environment variable API_KEY_ENCRYPTION_KEY securely encrypts third-party API keys in the database.

  • You must generate a secure key (e.g., using openssl rand -hex 32) and add it to your .env file before starting the application.
  • Rotation: To rotate keys without breaking existing database entries, provide a comma-separated list of keys. Voxbento will encrypt new tokens using the first key, but will use all keys to attempt decryption.

Optional NVIDIA Transcription

NVIDIA Riva support is now an optional dependency to reduce the default installation footprint. If you intend to run NVIDIA transcription models, you must explicitly install the optional package:

uv pip install -e .[nvidia]

VoxBento Local (Desktop App)

VoxBento Local is our sovereign, 100% on-device AI meeting intelligence and interpretation desktop console available for macOS (Apple Silicon & Intel), Windows, and Linux.

  • Download: Visit /local for platform-detected desktop packages (.dmg, .exe, .deb, .AppImage).
  • Source Code & Releases: Built at github.com/ArnavBallinCode/voxa.
  • Air-Gapped & Sovereign: Whisper live transcription and Qwen 3.5 structured meeting minutes run completely on-device via Apple Metal and NVIDIA CUDA acceleration.

Meeting source

Event owners can connect a room's self-hosted Jitsi meeting from the room page: confirm the meeting URL and click Connect meeting. VoxBento runs a managed, listen-only agent, reports its lifecycle (starting, joined, receiving audio, processing, reconnecting, needs attention, stopped), restarts it within a bounded policy and starts floor captions, translation and TTS once audio arrives. It never replaces program ingest without confirmation. Apply migration 027 and rebuild the floor-bot image. See workflow, recovery, troubleshooting and rehearsal.

Program stream ingest

Event owners can add VoxBento as a second HTTPS WHIP destination alongside YouTube. Their encoder remains the production tool; no YouTube key is needed. Room-scoped tokens feed the existing floor transcription, translation and TTS pipeline without the Jitsi bot. Operator activation is required and defaults off. Revocation invalidates a room token before attempting MediaMTX cleanup, so a temporary control-plane failure cannot restore an old credential. See setup, security, synchronization and verification.

fossasia/voxbento

Open Source AI powered Interpretation Platform https://voxbento.com

Python

1,514

579 commits

updated Oct 15, 2026

See the code

README

Voxbento

Voxbento is a real-time interpretation platform for live events. It provides a browser-first, zero-install experience for simultaneous interpreters, allowing them to monitor the main floor video via Jitsi and broadcast translated audio to attendees with low latency.

Official Documentation: docs.voxbento.com

Interpreters stream live audio via WebRTC/WHIP → MediaMTX → WHEP (WebRTC playback). Booth coordination (who is active, relay handoff, chat) runs over WebSocket. Administrators can find hosted events in /admin/events/ by searching either the event name or slug. Search treats % and _ literally, pagination URL-encodes reserved characters, blank searches show all events, and out-of-range pages open the last filtered page.

Rooms can optionally add a listener-side audio synchronization delay for WHEP playback. The default is 0 ms, which keeps the existing low-latency HTML audio path unchanged. Organizers can set values such as 1000, 2000, 5000, or 8000 ms when a room's livestream video, captions, embedded player, or other external media is delayed and translated audio needs to line up with it. The delay is applied in the listener browser only; MediaMTX, WHIP, WHEP, and RTP packets are not changed. Within the organizer workspace, organizers can manage and search rooms by name within each event using server-side, case-insensitive filtering.

Management dashboards

  • Event owners manage event configuration at /workspace/.
  • Room coordinators use /mission-control/, which limits them to their assigned rooms.
  • System administrators use /admin/ for instance-wide administration.
  • Existing organizer bookmarks under /admin/events/... redirect to the matching /workspace/events/... URL. HTTP methods and query strings are preserved, so old forms and filtered room-list bookmarks continue to work.

The workspace and admin surfaces share the same management implementation and authorization checks. This URL separation does not change OAuth authorization, token refresh, reconnect, or disconnect behavior for Eventyay integrations.


How it works

Interpreter browser
  │  iframe → Jitsi Meet (Monitor conference floor video/audio)
  │  mic → RTCPeerConnection → WHIP POST
  ▼
MediaMTX :8889 (WHIP ingest + WHEP)   Python is never in the audio path
  │  WebRTC termination + remux
  └──► WHEP :8889 ←── attendees connect via WebRTC (sub-second latency)

Interpreter / Coordinator browser
  │  WebSocket /ws/booth/{booth_id}
  ▼
FastAPI portal :8000 (coordination, state, JWT, REST)
  │
  ├──► Background Transcription (ffmpeg → Deepgram/OpenAI/Local)
  └──► Background Translation (Groq/Anthropic/Gemini)

Floor Audio Bot (floor-bot)
  │  Headless Chromium → Joins Jitsi Meeting
  └──► ffmpeg → RTSP → MediaMTX → Transcription/Translation

Setup

Prerequisites

DependencyVersionPurpose
Python3.13+FastAPI portal
uvlatestPython package manager
MediaMTX1.xWebRTC/HLS audio server
Docker & Docker ComposelatestJitsi stack (or full Docker setup)

Option 1 — Docker Compose (everything in containers)

The portal runs code from its image; rebuild to apply changes. Production updates validate a separate candidate checkout before replacing services; see the deployment guide.

All services (portal, MediaMTX, Jitsi) start with one command:

git clone https://github.com/fossasia/voxbento.git
cd voxbento

# Configure environment
cp .env.example .env

# Required for API key encryption: set your encryption key (must be 32 characters or longer)
echo "API_KEY_ENCRYPTION_KEY=$(openssl rand -hex 32)" >> .env

# Required for MediaMTX-to-portal publish authorization
echo "MEDIAMTX_AUTH_HOOK_SECRET=$(openssl rand -hex 32)" >> .env

# Required for Jitsi video: set the IP JVB advertises to browsers
# macOS:  ipconfig getifaddr en0
# Linux:  hostname -I | awk '{print $1}'
echo 'JVB_ADVERTISE_IPS=192.168.1.x' >> .env

docker compose up --build

Open http://localhost:8000 — all services are running.

For detailed API documentation, environment variables, and configuration, visit docs.voxbento.com. Native development setup details can also be found in CONTRIBUTING.md.


Upgrade Notes

Admin login migration

The legacy shared ADMIN_PASSWORD login has been removed. Before upgrading, ensure two active, email-verified administrator accounts can sign in with their own credentials, then remove that variable from all deployment configuration. See the operator migration guide for the rollout and break-glass recovery procedure.

Admin login requires verified email and shares the normal login limit of 10 attempts per email address per hour.

Single sign-in page

Admins, organizers and attendees all sign in at /login. The separate admin form is gone: /admin/login now redirects to /login?next=/admin/, so update bookmarks or scripts that posted to it. Entering an email that has no account continues to /register with the email filled in.

API Key Encryption & Rotation

A mandatory environment variable API_KEY_ENCRYPTION_KEY securely encrypts third-party API keys in the database.

  • You must generate a secure key (e.g., using openssl rand -hex 32) and add it to your .env file before starting the application.
  • Rotation: To rotate keys without breaking existing database entries, provide a comma-separated list of keys. Voxbento will encrypt new tokens using the first key, but will use all keys to attempt decryption.

Optional NVIDIA Transcription

NVIDIA Riva support is now an optional dependency to reduce the default installation footprint. If you intend to run NVIDIA transcription models, you must explicitly install the optional package:

uv pip install -e .[nvidia]

VoxBento Local (Desktop App)

VoxBento Local is our sovereign, 100% on-device AI meeting intelligence and interpretation desktop console available for macOS (Apple Silicon & Intel), Windows, and Linux.

  • Download: Visit /local for platform-detected desktop packages (.dmg, .exe, .deb, .AppImage).
  • Source Code & Releases: Built at github.com/ArnavBallinCode/voxa.
  • Air-Gapped & Sovereign: Whisper live transcription and Qwen 3.5 structured meeting minutes run completely on-device via Apple Metal and NVIDIA CUDA acceleration.

Meeting source

Event owners can connect a room's self-hosted Jitsi meeting from the room page: confirm the meeting URL and click Connect meeting. VoxBento runs a managed, listen-only agent, reports its lifecycle (starting, joined, receiving audio, processing, reconnecting, needs attention, stopped), restarts it within a bounded policy and starts floor captions, translation and TTS once audio arrives. It never replaces program ingest without confirmation. Apply migration 027 and rebuild the floor-bot image. See workflow, recovery, troubleshooting and rehearsal.

Program stream ingest

Event owners can add VoxBento as a second HTTPS WHIP destination alongside YouTube. Their encoder remains the production tool; no YouTube key is needed. Room-scoped tokens feed the existing floor transcription, translation and TTS pipeline without the Jitsi bot. Operator activation is required and defaults off. Revocation invalidates a room token before attempting MediaMTX cleanup, so a temporary control-plane failure cannot restore an old credential. See setup, security, synchronization and verification.

Significant stargazers

Nikit Bhandari

298 followers · starred Dec 2017

Nupur Baghel

136 followers · starred Feb 2018

Devansh Batra

107 followers · starred Sep 2018

Paavini Nanda

108 followers · starred Feb 2018