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