Pantheon · Meeting Engine · Track D — Gate G1

Live, speaker-labeled meeting transcription — the Whisper/skynet + GPU build

What it is, why we landed on it, what it costs, and exactly what it takes to build and run. The self-hosted ASR half of the transcription engine that sits behind our own Jitsi.

metis #110 Track D Phase-1 infra: metis #41 G0 jitsi — ready to deploy G1 skynet+GPU — this doc Author: proteus · 2026-07-08

TL;DR. Today meet.boas.dev already hosts meetings — but on 8x8's hosted Jitsi (JaaS), which structurally cannot give us live, speaker-attributed transcription. The engine we want plugs a bot (jigasi) into our own Jitsi, splits each speaker's audio, and streams it to a self-hosted Whisper service (skynet) on a GPU box. That GPU box is the one piece that doesn't exist yet. This guide is how we stand it up.

The honest scope line: G0 (our Jitsi) is just a meeting server — no better than meet.boas.dev until this (G1) lands. G1 is where the value actually appears: transcription that knows who said what, in Icelandic and English, without sending a syllable to Google.

01The value proposition

Why build this at all when meetings already work?

Meetings working ≠ transcription working. The operator's ask was never "host a call" — it was "something we can plug into a meeting for live transcription with automatic speakers, that slots into the pipeline." That is a fundamentally different capability, and it is what G1 delivers:

What you get

  • Who said what, live — every line tagged with the real participant, not an acoustic guess.
  • Bilingual IS/EN — Icelandic and English speakers on the same call, each transcribed in their language.
  • Fully self-hosted — audio never leaves our infra; no Google Cloud, no third-party STT.
  • Pipeline-native/summarize + /action-items write straight back to meetings, crm_deals, metis_tasks.

Why it beats the alternatives

  • Beats acoustic diarization — jigasi reads speaker identity from the meeting roster before ASR. No "Speaker 1 / Speaker 2" guessing, no pyannote confusion.
  • Beats JaaS-native — 8x8 can transcribe, but only via Google Cloud STT. Disqualified by the self-host mandate.
  • Beats meetily — meetily grabs mixed OS audio with no speaker split and doesn't slot into the pipeline. It's the stopgap, not the target.

02The architecture — one glance

Meeting IS + EN speakers Self-host Jitsi Prosody · Jicofo JVB (SFU) G0 · done-ready jigasi per-speaker RTP tags speaker_id|lang the "who said it" skynet Whisper large-v3 streaming ASR GPU · G1 LLM + write-back summarize → crm_deals ↑ the only GPU-bound component media = UDP 10000, direct jigasi→skynet = network WS hop (so jitsi + GPU can be separate boxes)

Key structural fact: only skynet needs a GPU. jigasi talks to it over a WebSocket, so the Jitsi box and the GPU box can be entirely separate machines — which is why G0 (jitsi) is not blocked on GPU procurement, and why the GPU is a G1-only cost.

03The research arc — how we got here

This is not a fresh guess. The stack was chosen in May 2026, ratified by Athena, PRD'd by Metis (#110), and then adversarially re-verified in a 7-week freshness pass (hermes, 2026-07-07, decision-grade / T-deep).

WhenWhat happenedOutcome
May 2026Landscape research across meeting-bot + ASR options; stack chosen: jitsi/skynet + jitsi/jigasi + IS-Whisper + local LLMAthena-ratified, Metis PRD #110
Jul 20267-week freshness re-scan — did anything newer displace it? Meeting-bot vendors (Recall.ai, Vexa, Attendee, MeetingBaas), streaming ASR (NVIDIA Nemotron/Parakeet), diarizers (pyannote 4.0)Nothing displaces it. None of the vendors support Jitsi at all deep-read
Jul 2026Speaker-attribution claim re-checked against jigasi source code (not blog posts)Confirmed at code level — per-SSRC roster mapping, no mixing code-verified
Jul 2026Operator ruled out all Google Cloud; asked for a deliberate in-meeting language toggle (not mid-sentence)JaaS-native path killed; toggle confirmed buildable (small skynet patch) deep-read
Jul 2026G0 fleet sweep (proteus) — is jitsi already self-hosted anywhere?No. Greenfield. meet.boas.dev = 8x8 JaaS, now recorded in fleet_services

Source discipline: the architecture + attribution + licensing claims below are deep-read from the hermes T-deep refresh (primary sources: jigasi/skynet source, 8x8 dev portal, HF model cards). Live GPU pricing is estimate — verify at purchase. Streaming-ASR competitor dates are snippet-tier — re-verify before any build reliance.

04Why we landed here — the decision logic

Four hard constraints collapse the option space to exactly one path:

ConstraintKills…Leaves…
Self-host mandatory (privacy; no client audio to third parties)JaaS-native transcription (Google STT), Recall.ai & all hosted meeting botsSelf-operated stack only
Speaker attribution must be reliableAcoustic diarization as the primary path (guesses, confuses on overlap)Roster-based tagging → needs jigasi inside the conference
jigasi needs XMPP-server accessAttaching to 8x8/JaaS (closed; won't expose Prosody/Jicofo config)Our own Jitsi (G0) — the whole reason to self-host
Bilingual IS/EN, no GoogleCloud STT, and IS-less models (Canary, Voxtral, Parakeet)Whisper large-v3 (only confirmed IS+EN, streaming, permissive) on our GPU = skynet

Every arrow points to the same place: self-hosted Jitsi + jigasi + skynet(Whisper) on a GPU box. It is not a preference — it is what survives the constraints.

05The component stack

ComponentRoleGPU?License / note
Jitsi (Prosody/Jicofo/JVB/web)The conference. JVB is an SFU — one clean audio stream per speakerNoApache-2.0 · G0 ready
jigasiJoins server-side, maps each RTP stream → roster identity, tags speaker_id|lang, ships to skynetNoApache-2.0 · the attribution engine
skynet streaming_whisperReceives tagged audio chunks, runs Whisper, returns text with the tag echoed backYesJitsi/8x8 OSS · needs per-stream lang hint
Whisper large-v3 (+ IS fine-tune)The ASR model. Stock v3 for EN; an IS fine-tune/LoRA for Icelandic speakersYesMIT (base) · LoRA jonasaise preferred
Local LLM/summarize, /action-items → structured write-backYesRuns on the same GPU box
pyannote community-1Fallback diarizer (retro transcripts / safety net)Yes (batch)CC-BY-4.0 · v4.0, 2026-07-07

06Build steps

G0

Self-host Jitsi ready

docker-jitsi-meet on srv908592 (co-host), jigasi transcriber prereqs, DNS + resource caps. Runbook written; hades supplied traefik wiring; deploy is a go the day transcription is wanted. Not deployed today — see §9.

1

Provision the GPU host (metis-051)

A box with a 24 GB-class GPU (see §7). Install NVIDIA driver + CUDA + container toolkit. This is the gating dependency for everything below.

2

Deploy skynet + Whisper

Run streaming_whisper in Docker on the GPU. Load stock whisper-large-v3(-turbo) for EN + the IS fine-tune. Expose the WebSocket endpoint for jigasi.

3

Attach jigasi to Jitsi

The historically fiddly step: Prosody transcriber VirtualHost, brewery-room MUC, Jicofo BREWERY. Point jigasi's transcription websocket at skynet. Budget iteration time here — forum pain is almost all setup, not runtime.

4

Per-participant language routing

Config, not code: EN speakers → stock v3; IS speakers → IS fine-tune. skynet selects model per stream from the roster language.

5

The in-meeting language toggle (D7)

Small scoped patch to skynet (state.py, meeting_connection.py): re-read a participant's language mid-call instead of latching it at first chunk. jigasi already does the live half for free. ~2–3 files, no model reload.

6

Close the EN-WER gap (before locking the IS model)

Run a few hundred English utterances through each IS checkpoint and measure the English error delta vs stock v3. Cheap; prevents a fine-tune that silently degrades English.

7

Consent flow (D5) — HARD GATE

Recording/transcription consent is a production gate, not optional. Must be in place before any real client call is transcribed.

8

Wire the write-backs + instrumentation

/summarize + /action-itemsmeetings/crm_deals/metis_tasks. Add dropped/unmapped-SSRC logging (see Don'ts) and a diarization fallback path.

07Costs

Owned GPU box estimate

~$2,000–3,500 one-time

RTX 4090 / 3090 (24 GB) mini-tower or workstation. Amortizes vs cloud in 2–4 months at always-on. Fits the fleet's owned-hardware pattern (N5). Ongoing: power + our own ops.

Rented cloud GPU estimate

~$500–1,000 /mo always-on

L4 / A10 (24 GB) at ~$0.7–1.5/hr on-demand. Cheaper on spot or if you only spin it up per-meeting. Better if usage is bursty; worse if always-on.

💡
The call: at 1–3 low-frequency meetings, an owned box (metis-051) is the cheaper, simpler answer — it pays for itself in a quarter and keeps audio fully in-house. Rent only if you need it instantly or usage is spiky. VRAM target: 24 GB comfortably holds Whisper-large-v3 + a small summarization LLM together. (Whisper alone: ~10 GB; turbo ~6–8 GB.)

Software cost is $0 — every component is OSS (Apache-2.0 / MIT / CC-BY). The GPU is the whole line item. No per-minute STT fees (that's the entire point of leaving JaaS/Google).

08Do's and don'ts

✓ Do

  • Instrument for dropped segments. jigasi silently drops audio that arrives before it maps the speaker (open issue #91). Log unmapped-SSRC events from day one.
  • Keep a diarization fallback (pyannote community-1) for retro transcripts and as a safety net.
  • Measure EN-WER before locking the IS model. Cheap eval, prevents a silent English regression.
  • Prefer the LoRA adapter (jonasaise) — frozen base structurally preserves English.
  • Own the GPU box's process/daemon layer (proteus domain) — treat skynet + jigasi as monitored fleet services in fleet_services.

✕ Don't

  • Don't trust roster attribution as bulletproof. It's PARTIAL, not proven — no independent accuracy study exists. Instrument, don't assume.
  • Don't use full fine-tunes blindly — they carry a literature-backed English-forgetting risk. Measure first.
  • Don't reach for SeamlessStreaming — it's CC-BY-NC (non-commercial). License blocker for a business product.
  • Don't promise intra-sentence code-switching. No clean solution exists; the operator only needs a deliberate toggle anyway.
  • Don't co-host skynet on the n8n prod box. GPU + n8n-prod is a blast-radius and a driver mess. Separate box.

09Engineering overhead & honest risks

ItemEffortNote
skynet + Whisper deployModerateDocker + GPU drivers/CUDA; standard once the box exists
jigasi attach (brewery/XMPP)Moderate–fiddlyThe historically painful step; budget iteration
Language-toggle patch (D7)Small2–3 python files, scoped, no model reload
EN-WER evalSmallA few hundred utterances per candidate
Consent flow (D5)ModerateHARD GATE — legal/privacy, blocks production
Write-backs + instrumentationModerateIntegration into meetings/crm_deals/tasks
Ongoing GPU opsContinuousproteus daemon/process domain; monitoring, dropped-segment alerts

The load-bearing open risks

Where G0 stands: the Jitsi foundation is engineered and ready — DNS set, traefik wiring captured, resource-capped compose designed. It is deliberately not deployed yet, because on its own it only duplicates meet.boas.dev. It gets deployed in lockstep with G1, when the transcription that justifies it is close.

Sources & provenance. Architecture, attribution mechanism, licensing, and model claims: hermes T-deep refresh constellation-hermes/research/meeting-transcription-refresh-2026-07-07/ (primary: jigasi/skynet source, 8x8 dev portal, HF model cards) + the ratified May-2026 landscape arc. Infra/host/DNS facts: proteus G0 sweep (Task 064/065), fleet_services, live srv908592 inspection. GPU pricing = estimate, verify at purchase. Board: metis #110 (Track D), #41 (Phase-1 infra).

Prepared by proteus · Pantheon infrastructure · 2026-07-08 · for operator review ahead of GPU procurement.