← back to overview

Documentation

Everything you need to drive the demo and understand what's underneath it.

Contents 1 Β· User manual & demo access 2 Β· A day in the life β€” ten-minute walkthrough 3 Β· Technical architecture 4 Β· API reference (wire protocol) 5 Β· Known limits & good demo hygiene

1 Β· User manual & demo access

Access

The live app lives at vaanimesh.ajaykongala.online/app (it forwards to the current demo session). Access is gated by a PIN:

2468 β€” demo PIN for this beta. It gates access; it is not a security boundary. Sessions run on demo credit.

Joining

  1. Open the app link. Enter a display name, pick your language (Telugu, Bangla, Marathi, Hindi, or English), type the PIN, and press Connect to mesh.
  2. Allow microphone access. Use earphones β€” translations played out loud will otherwise reach other participants' microphones.
  3. Repeat on a second device with a different language. Up to five participants can join.

Talking (manual mode β€” the default)

Speak a full sentence and pause. Your utterance appears in a pending tray with a small player β€” listen if you like, then press Send ➀ (or Discard). A few seconds later every other participant hears your sentence in their own language and sees both texts.

Automatic mode

The Automatic send toggle in βš™ settings stays locked until the relay declares the chain healthy β€” five clean deliveries with latency in budget. Once unlocked, utterances send themselves when you pause. You can always drop back to manual.

Settings (βš™)

SettingEffect
My languageSwitch your language mid-session β€” the very next utterance follows the new speak-your-language rule, everyone's roster updates, and the confirmation offers a one-tap β†Ί Retranslate recent messages that re-renders the last few messages from others in your new language (text only)
Voice preferenceThe synthesized voice others hear for your translations
VAD sensitivityHow eagerly the voice detector treats a pause as end-of-sentence
Show mesh headersExpands each received message's relay receipt (latencies, sequence, mode)

The operator dashboard

Open /dashboard on the app origin (same PIN). It is read-only: speaker cards with mic status, live loudness, audio format and round-trip time; the pipeline's rolling latencies; and a live log of every relayed message with its full header.

2 Β· A day in the life β€” ten-minute walkthrough

Meera (Hindi) runs procurement; Ravi (Telugu) supplies produce. Neither is comfortable in the other's language.

  1. 0:00 β€” Meera opens the app on her laptop, joins as Hindi, PIN from the invite. Ravi joins from his phone as Telugu. Both see each other in the roster.
  2. 0:30 β€” Ravi speaks: a sentence about this week's tomato price. It lands in his tray; he taps Send. Four seconds later Meera hears a Hindi voice say it, with the Hindi text on screen and Ravi's original Telugu underneath.
  3. 1:00 β€” Meera replies in Hindi; Ravi hears Telugu. They negotiate for ten minutes, each speaking naturally, reviewing each clip before it sends.
  4. 6:00 β€” After a handful of clean exchanges the relay unlocks automatic mode. Both flip the toggle; now the conversation flows without pressing anything β€” speak, pause, heard.
  5. 9:00 β€” Meera's colleague joins as English from another office. Nothing changes for Meera or Ravi; the newcomer simply hears English versions of both sides.
  6. On a side screen, the operator watches the dashboard: three speakers, loudness bars ticking, translations averaging a few seconds end-to-end, every message logged with its receipt.

3 Β· Technical architecture

Topology

Three wired nodes. Browser speaker consoles do capture (voice-activity detection in an audio worklet, 16 kHz WAV encoding), playback, settings, and telemetry. The relay β€” an independent FastAPI server β€” runs the entire AI chain as a Pipecat frame pipeline: speech recognition β†’ language identification β†’ per-listener translation β†’ speech synthesis β†’ header stamping β†’ routing. The dashboard is a read-only observer fed by the same server.

Pipeline stages

StageEngine (current)Notes
Recognitiongpt-4o-transcribe via OpenRouter Chosen over Whisper after a live bake-off: Whisper translated Indic speech to English instead of transcribing it
Language IDLocal script analysis The five languages span four scripts; Devanagari (Hindi/Marathi) is split by function-word markers. Zero-cost, deterministic
TranslationGrok 4.3 via OpenRouter Interpreter-prompted: meaning over phonetics, colloquial register; reasoning disabled for a ~5Γ— latency win
VoiceGemini Flash TTS via OpenRouter PCM output wrapped to WAV server-side

Every stage sits behind a provider interface; Sarvam, Bhashini, and Deepgram adapters exist, and a benchmark harness scores any configured provider on licensed reference recordings (word-error rate, translation overlap, synthesis round-trip intelligibility).

Conversation-quality guards

Shared-mic rooms

One device captures the whole room. Because each participant owns a distinct language, identifying an utterance's language identifies its speaker; a voice-fingerprint (speaker-embedding) tie-break covers low-confidence cases, seeded by a one-sentence enrollment per participant. Verified with two real recorded speakers through a single microphone.

4 Β· API reference (wire protocol)

WebSocket JSON, one connection per console: wss://…/ws/speaker. The dashboard feed is wss://…/ws/dashboard?pin=…. Health: GET /healthz.

Console β†’ relay

{"type":"join","name":"Meera","language":"hi-IN","pin":"2468","settings":{…}}
{"type":"utterance","utterance_id":"…","audio_b64":"<16kHz PCM16 WAV>",
 "sample_rate":16000,"duration_ms":3200,"mode":"manual"}
{"type":"settings","tts_voice":"Puck","vad_sensitivity":"normal"}
{"type":"telemetry","rms":0.04,"mic_on":true,"rtt_ms":23}
{"type":"mode_request","mode":"auto"}        // granted only when eligible
{"type":"ping","t":123456.7}

Relay β†’ console

{"type":"joined","speaker_id":"…","mode":"manual","auto_allowed":false,"roster":[…]}
{"type":"own_transcript","utterance_id":"…","text":"…","detected_language":"hi-IN"}
{"type":"translated",
 "mesh":{"msg_id":"…","seq":7,"hop":"relay@:8030","mode":"manual",
         "src":{"speaker":"Ravi","lang":"te-IN"},"tgt_lang":"hi-IN",
         "received_at":"…","forwarded_at":"…",
         "latency_ms":{"asr":800,"mt":950,"tts":3100,"relay_total":4900},
         "audio":{"sample_rate":16000,"bits":16,"kbps":256.0}},
 "original_text":"…","translated_text":"…","audio_b64":"…",
 "tts_failed":false,"mt_failed":false}
{"type":"mode_state","mode":"manual","auto_allowed":true,"reason":"chain healthy …"}
{"type":"error","stage":"join","message":"wrong access PIN"}

The mesh block is the relay's stamp β€” attach-only, present on every forwarded message, rendered in the consoles and the dashboard log.

5 Β· Known limits & good demo hygiene