Integrări — VirtualMeetings & Ecosistem TM

Ce există, ce e posibil, ce e planificat. Sursă completă: docs/PLATFORM_TM_FEASIBILITY.md Last updated: 2026-05-16


1. Integrarea curentă cu Zoom (Faza 1 — livrat)

Core Audio Process Tap (macOS 14.4+)

VirtualMeetings captează audio-ul Zoom local, invizibil pentru Zoom, prin API-ul Core Audio al macOS.

Zoom (running)
  └─ AudioCapture (Swift, Process Tap)
       → PCM mono 16kHz Int16 pe stdout
       → audio_consumer.py → WebSocket /ws/audio → ai-service

Avantaje: Zero permisiuni Zoom, fără cont bot, fără cloud. Dezavantaje: Mac-only (macOS 14.4+), nu funcționează cu headphones Zoom (audio engine procesează agresiv → degradare calitate).

Config câștigătoare validată: audio mic + speakers Mac active (NU Process Tap).

TextRecognizer (Vision OCR)

Screenshot periodic al galeriei Zoom → Vision framework → extrage numele vorbitorului curent.

Zoom gallery screenshot → TextRecognizer (Swift) → speaker_detector.py → set_speaker

Limitare: Funcționează doar dacă Zoom e vizibil (nu minimizat). La Zoom hibrid, alternativa e n <name> manual în CLI.


2. Zoom Integration Options — evaluare

Cercetare completă realizată 2026-05-16. Verdict per opțiune:

Opțiune Ce permite Verdict Risk
Audio Tap (azi) PCM local, invizibil Zoom ✅ Funcțional Low — Apple API stabil
Zoom Apps SDK Sidebar iframe în Zoom client, participants list, events 🟡 Promițător (timer, agenda) Mediu — CSP restricții, review process
Zoom RTMS Real-time media stream per participant (cloud) 🔵 Viitor (GA jun 2025) Înalt — pricing nepublic, feature nou
Zoom REST API Post-meeting: recordings, transcripts, analytics 🟡 Util post-ședință Scăzut — API stabil
Zoom Bot (Otter-style) Headless browser join meeting ❌ NU Critic — Zoom blochează bots non-whitelist
Meeting SDK Embed Zoom în app propriu ❌ Nu rezolvă audio pe web Înalt — vendor lock-in

Zoom Apps SDK — ce am putea construi (Faza 2.D+)

Un Zoom App sidebar care: - Afișează timer Cronometror live (verde/galben/roșu) — vizibil tuturor - Citește participants list via onActiveSpeakerChange (înlocuiește OCR Vision) - Comunică cu ai-service prin postMessage

Pre-condiție: Cronometror module funcțional (Faza 2.C). POC după 2026-05-20. Documentație: docs/zoom-apps-sdk-integration.md


3. Media Layer — adapters planificate

Arhitectura propusă: media e pluggabil — același engine de roluri funcționează cu orice sursă audio.

Role Modules (Gramatician, Numărător, Cronometror...)
         │
   Media Layer Adapter
    ├── Adapter A: Zoom Audio Tap  (Core Audio, M1) ← azi
    ├── Adapter B: Microfon direct (sounddevice)    ← azi (--mic)
    ├── Adapter C: Zoom RTMS       (cloud stream)   ← 2026 Q3+
    ├── Adapter D: LiveKit room    (own platform)   ← Faza 3
    └── Adapter E: Browser MediaStream (PWA)        ← mobile

Interface propus (nu implementat, Faza 2.D):

class MediaAdapter(Protocol):
    async def start(self) -> None: ...
    async def stop(self) -> None: ...
    async def on_chunk(self, pcm: bytes) -> None: ...
    async def set_speaker(self, name: str) -> None: ...

4. LiveKit — când și dacă

Cercetare 2026-05-16: LiveKit Cloud ($50/mo ship tier) acoperă 25 useri × 2 ședințe/lună confortabil.

Pre-condiții ne-negociabile înainte de a construi: 1. 5+ role modules mature și folosite live min 3 luni 2. TM Sibiu vrea activ să iasă din Zoom 3. Cel puțin 1 alt club TM interesat (validare externă)

Efort: 110-150h dev (React + LiveKit SDK + migrate role modules).

De ce nu acum: network effects imposibile fără adopție. Zoom e gratuit pentru cluburi. Nici un club nu va migra fără funcționalități pe care Zoom nu le are.


5. Integrarea cu toolurile TM existente

Tool TM Status integrare Plan
Base Camp (Pathways) ❌ nicio integrare P3: la n <name>, tool știe path/level/proiect curent
Easy-Speak (roluri ședință) ❌ nicio integrare P2: import agenda din Easy-Speak → pre-populează role-urile în CLI
Club Central (DCP reporting) Long-term: auto-generate raport DCP goals din session data
Toastmasters App (Timer) ❌ nicio integrare Cronometror module propriu îl înlocuiește
District 95 calendar P3: notificări contest local

6. Integrarea cu VirtualMeetings — flow complet azi

Pre-ședință (10 min):
  ├── toastmasters (CLI start)
  ├── ai-service boot + Whisper warmup
  ├── rol num Pavel / rol gr Pavel
  └── cuv <wod> <pos>

Live (90 min):
  ├── n <speaker> → batch grammar trigger + sprint recorder
  ├── Browser UI col 1-3 (live transcript + issues + fillers)
  ├── Browser UI col 4 (notițe Pavel timestamped → prompt Claude)
  ├── audio restart (dacă pipeline cade)
  └── num / fillers / gramatica (comenzi status)

Post-ședință:
  ├── salveaza → fisa_gramatician.html + fisa_numarator.html
  ├── timeline_corelat.html (TOOL × PAVEL × AMBELE)
  └── iesi → session.json + pavel_notes.jsonl