Tovább a tartalomhoz

Megbeszélések és átírás

A Control Center fel tud venni egy hívást, és cserébe rendezett leiratot ad vissza — összefoglalót, teendőket és döntéseket —, miközben a beszédfelismerés és a beszélőszétválasztás az Ön saját hardverén fut. Képzelje el a Granolát, csak saját üzemeltetésben, és bekötve ugyanabba a munkaterületbe, amelyben az ügynökei élnek.

A megbeszélés egy rögzített, átírt munkamenet. Nem ugyanaz, mint egy naptáresemény: az esemény egy Google-ból szinkronizált, ütemezett kötelezettség, a megbeszélés pedig valami, amit ténylegesen felvett. A kettő összekapcsolható, hiszen egy eseményből is indíthat felvételt, de külön rekordok maradnak.

Minden megbeszélés munkaterület-hatókörű, mint a Control Centerben minden más. Az egyik munkaterületen rögzített megbeszélések soha nem bukkannak fel egy másikban.

Az „eszközön” jó megérzés, de rossz főnév. A kliens rögzíti a hangot, és 16 kHz-es PCM16-kereteket streamel a cc_server-t futtató gépre. A többit mindent az a gazdagép végez: a csatornánkénti WAV-fájlokat a <dataDir>/meetings/<meetingId>/ alá írja, egy worker-izolátumban átír, visszhangot szűr, és utólag diarizál. Önálló asztali telepítésen ez a gazdagép ugyanaz a gép. Távoli szerverre mutatva viszont nem — így a „semmi sem hagyja el a laptopomat” csak akkor igaz, ha a szerver az Ön laptopja.

Van még egy kivétel, és épp ez a fontos.

Az összefoglaló előtti minden lépés — rögzítés, átírás, visszhangszűrés, diarizálás, hanglenyomat-egyeztetés — hálózati hívás nélkül, a szerveren fut.

Az embedding-, a diarizációs és a beszéd- (ASR-) modellek az első indításkor erőltetetten telepítődnek (demóban kimaradnak), így a beszélőszétválasztás és a felvétel a beállítások megnyitása nélkül is elérhető. Az ASR továbbra is választható — több száz megabájt, és négy build van a választóban. A beszédhez az első letöltés után még egy újraindítás kell, mert az átíró a letöltés befejeződése előtt feloldja a modelljét.

A választó négy eleme méretben, nyelvi lefedettségben és pontosságban tér el:

  • Parakeet TDT 0.6B v3 — többnyelvű, az ajánlott alapértelmezés (~600 MB)
  • Parakeet TDT 0.6B v2 — angol (~480 MB)
  • Whisper large-v3-turbo — többnyelvű (~626 MB)
  • Whisper base.en — csak angol, a kicsi, történelmi alapértelmezés (~198 MB)

A szerver futásidőben kizárólag modelleket tölt le; minden natív könyvtár a csomagban érkezik.

Egy megbeszélés egyszerre két hangcsatornát rögzít:

  • Ön („me”): az Ön mikrofonja.
  • A többiek („them”): a megbeszélés hangkimenete, amelyet illesztőprogram nélküli loopback rögzít — macOS-en Core Audio folyamat- és eszköztapok, Windows alatt WASAPI loopback, Linuxon PipeWire / PulseAudio monitor.

Mivel a két csatorna külön rögzül, az átirat már az elejétől beszélőhöz rendelt: az Ön szavai a me, a hívásban mindenki más a them címkét kapja.

Az Ön saját hangja a rendszerkimenetből visszaszivárog a mikrofonba, és enélkül kétszer átíródna. Két szűrő akadályozza ezt meg. A jel szintjén az AEC3 minden távoli módú felvételen fut, és kötelező — ha a natív AEC-könyvtár nem tölthető be, a felvétel nem indul el, ahelyett hogy csendben visszhangtól szennyezett mikrofont streamelne. (A személyes jelenléti módban nincs távoli végponti referencia, amelyhez képest törölni lehetne, így ott az AEC azonosságként engedi át a jelet.) Ezen felül minden platformon fut egy gazdagépoldali, szövegszintű visszhangszűrő.

Minden operációsrendszer-szintű mikrofonfeldolgozás szándékosan le van tiltva. Ha macOS-en bekapcsolja a platform saját visszhangszűrését vagy automatikus erősítését, a mikrofon Voice Processing I/O módra vált, ami ebben a buildben mind a mikrofont, mind a rendszerhang rögzítését tönkretette.

Felvétel közben a hang gördülő ablakokban dekódolódik — rövid záró csendnél vagy egy maximális ablakhossznál elvágva —, a felületi száltól függetlenül. Minden ablak egy beszélővel címkézett átiratszegmens lesz, ezredmásodperces eltolásokkal.

Azok az ablakok, amelyek soha nem emelkedtek egy RMS-küszöb fölé, dekódolás nélkül kimaradnak, mert a beszédmodell a csendet hallucinált, nem beszédhangú tokenekként jeleníti meg, a dekódolás pedig elpazarolt CPU. Ennek gyakorlati következménye: egy tartósan nagyon halk beszélőnek nem lesz átirata. Ha valaki üresen jön vissza, előbb a bemeneti szintjét ellenőrizze, mielőtt a modellt hibáztatná.

Miután leállítja, a diarizálás offline fut a felvételen, és a távoli csatornát külön beszélőkre bontja (Person 1, Person 2, …), akiket átnevezhet. A beszélők számát egy klaszterezési küszöb alapján becsüli, nem az Ön által beállított darabszámból — így ez küszöbhatás, és egy halk vagy átfedő beszélő beleolvadhat a szomszédjába. Az átirat [mm:ss] SPEAKER: text sorokként jelenik meg.

Egy beszélő átnevezése többet tesz, mint hogy megcímkéz egy átiratot. A Control Center a beszélő hanglenyomatát hangprofilként mentheti, így a jövőbeli megbeszéléseken automatikusan felismeri őt. Amikor elnevez egy diarizált beszélőt, a program megkérdezi, mentse-e a hanglenyomatot; ha igen, az beleolvad az adott névhez tartozó futó centroidba, és az új beszélőket koszinusz-hasonlósággal veti össze velük, így ugyanaz a személy a következő alkalommal a nevével jelenik meg, anélkül hogy Önnek újra címkéznie kellene.

A hangprofilok munkaterület-hatókörűek, és soha nem lépik át a határt. A Beállítások → Munkaterület → Megbeszélések helyen kezelheti őket. Egy korábban mentett beszélő átnevezése kiveszi a regisztrációból a régi nevet, és felajánlja az új beregisztrálását; egy profil törlése eltávolítja a tárolt hanglenyomatot, de a korábbi megbeszéléseken már alkalmazott neveket érintetlenül hagyja.

Amikor egy felvétel leáll, a szerver közzétesz egy MeetingRecordingStopped domaineseményt. A beépített meeting_summary pipeline-sablont ez az esemény indítja el. A felvevő nem vár rá; a megbeszélés egyszerűen végighalad az állapotai életciklusán:

recording → processing → done

Az összegző ügynök megkapja a címet, az élőben készített nyers jegyzeteit és az átiratot, és strukturált JSON-t ad vissza. Hogy mely szakaszokat írja meg, azt a munkaterület aktív megbeszélésjegyzet-sablonja alakítja (Beállítások → Munkaterület → Megbeszélések); az aktív sablon az új és az újrafuttatott összefoglalókra érvényes. A pipeline mentési lépései ezután ezt a JSON-t különálló sorokba írják:

  • enhancedNotes és summary → a megbeszélés jegyzetei
  • minden teendő → egy MeetingActionItem sor (tartalom, felelős, opcionális jegylink)
  • minden döntés → egy MeetingDecision sor

A teendőket és a döntéseket soha nem szabad formátumú markdownból bontja ki, hanem kizárólag az ügynök strukturált tömbjeiből. Ha egy futtatás nem ad strukturált kimenetet, a mentési lépések kimaradnak, és a nyers átirat marad meg tartalékként, így soha nem veszíti el a feljegyzést. A pipeline-ban semmi nem jelöli done állapotúra a megbeszélést — ezt egyetlen reconciler teszi meg a futtatás lezáró eseményéből, így egy testvérlépés hibája nem hagyhat félig megírt, de már késznek látszó megbeszélést.

Felület Mit mutat
/meetings A megbeszélések listája, teendő- és döntésszámmal
/meetings/record Az élő felvétel HUD-ja: az egyik oldalon a jegyzetei, a másikon a folyamatosan érkező átirat
/meetings/:meetingId Egy megbeszélés részletei: Jegyzetek, Átirat, Teendők és Döntések fülek
Beállítások → Munkaterület → Megbeszélések Jegyzetsablonok és mentett hangprofilok ehhez a munkaterülethez

A rögzítés mindhárom asztali platformon illesztőprogram nélküli (Core Audio tapok macOS-en, WASAPI Windows alatt, PipeWire Linuxon).

A webes kliens is rögzít, amit az oldal többi, asztali szemléletű része elfedhet: a böngésző a getUserMedia-mel veszi át a mikrofont, a megbeszélés hangját pedig a getDisplayMedia-vel (képernyőmegosztás), 16 kHz-es PCM16-ra mintavételezi le, és ugyanarra a gazdagépre streamel. Ott három megkötés érvényes:

  • A megosztott felületnek feltétlenül tartalmaznia kell hangsávot. A Safari, a Firefox és a macOS teljes képernyős megosztása nem ad ilyet, és a felvétel nem indul el.
  • Nincs natív AEC3. A böngésző saját visszhangszűrését kéri a program a mikrofonra; a gazdagépoldali szöveges visszhangszűrő továbbra is fut. A HUD egy, a mikrofon PCM-jéből vezérelt bemenetszint-mérőt mutat.
  • Az összefoglaló újrafuttatása és a feldolgozás leállítása csak asztali gépen érhető el.

A naptár Felvétel indítása és összekapcsolás művelete csak asztali gépen érhető el, és a weben ezt egyértelműen jelzi is, pedig a megbeszélések képernyő saját rögzítési folyamata ott is működik.