Přeskočit na obsah

Schůzky a přepis

Control Center umí nahrát hovor a vrátit ti čistý zápis: shrnutí, akční položky a rozhodnutí. Rozpoznávání řeči i oddělení řečníků běží na tvém hardwaru. Je to jako Granola, jen na vlastním serveru a ve stejném pracovním prostoru, ve kterém žijí agenti.

Schůzka je nahraná a přepsaná relace. Není totéž co událost v kalendáři: událost je naplánovaný závazek synchronizovaný z Google, schůzka je to, co se skutečně nahrálo. Obojí jde propojit, protože nahrávání můžeš spustit z události, ale zůstávají to samostatné záznamy.

Každá schůzka patří do pracovního prostoru, jako všechno ostatní v Control Center. Schůzky nahrané v jednom pracovním prostoru se v jiném nikdy neukážou.

„Na zařízení“ je správný instinkt a špatné slovo. Klient zvuk zachytí a na stroj, kde běží cc_server, streamuje rámce 16 kHz PCM16. Hostitel udělá zbytek: WAV po kanálech zapíše do <dataDir>/meetings/<meetingId>/, přepisuje v izolátu workeru, odfiltruje ozvěnu a diarizaci spustí až dodatečně. Na samostatném desktopu je hostitel tentýž stroj. U vzdáleného serveru ne. „Z notebooku nic neodejde“ tedy platí jen tehdy, když je server tvůj notebook.

Je tu ještě jedna výjimka a právě ta je důležitá.

Všechno před shrnutím běží na serveru a bez síťového volání: záznam, přepis, potlačení ozvěny, diarizace i párování hlasových otisků.

Které modely se dodávají

Sekce “Které modely se dodávají”

Modely pro embedding, diarizaci a řeč (ASR) se při prvním startu vynuceně nainstalují (u dema se to přeskočí), takže oddělení řečníků i nahrávání jsou k dispozici bez návštěvy nastavení. ASR pořád vybíráš. Má několik set megabajtů a ve výběru jsou čtyři sestavení. Řeč po tom prvním stažení pořád potřebuje jeden restart, protože přepisovač si model vyřeší dřív, než stahování doběhne.

Čtyři položky ve výběru se liší velikostí, pokrytím jazyků a přesností:

  • Parakeet TDT 0.6B v3 — vícejazyčný, doporučený výchozí (~600 MB)
  • Parakeet TDT 0.6B v2 — angličtina (~480 MB)
  • Whisper large-v3-turbo — vícejazyčný (~626 MB)
  • Whisper base.en — jen angličtina, malý historický výchozí (~198 MB)

Modely jsou jediné artefakty, které server za běhu stahuje. Každá nativní knihovna je v balíčku.

Schůzka nahrává dva zvukové kanály najednou:

  • Vy („me“): tvůj mikrofon.
  • Ostatní („them“): zvukový výstup schůzky, zachycený loopbackem bez ovladače. Na macOS jsou to tap procesů a zařízení v Core Audio, na Windows WASAPI loopback, na Linuxu monitor PipeWire / PulseAudio.

Protože se kanály berou odděleně, přepis má řečníky od začátku: tvoje slova nesou značku me, všichni na hovoru značku them.

Vlastní hlas se ze systémového výstupu vrací do mikrofonu a jinak by se přepsal dvakrát. Zastaví to dva filtry. AEC3 na úrovni signálu běží u každého nahrávání na dálku a je povinné. Když nativní knihovna AEC nejde načíst, nahrávání se odmítne spustit, místo aby tiše streamovalo mikrofon plný ozvěny. (Při osobní schůzce chybí vzdálený referenční signál, proti kterému by se ozvěna rušila, takže AEC tam signál jen propustí.) Nad tím na každé platformě běží textový filtr ozvěny na straně hostitele.

Veškeré zpracování mikrofonu v operačním systému je schválně vypnuté. Když na macOS zapneš vlastní potlačení ozvěny nebo automatické zesílení, mikrofon přepne na Voice Processing I/O. V tomhle sestavení to vyřadilo mikrofon i tap systémového zvuku.

Během nahrávání se zvuk dekóduje v posuvných oknech, ustřižených na krátkém koncovém tichu nebo na maximální délce okna, mimo vlákno UI. Z každého okna vznikne úsek přepisu se značkou řečníka a offsetem v milisekundách.

Okna, která nikdy nepřekročila práh RMS, se přeskočí úplně bez dekódování. Model řeči z ticha vyrábí halucinované tokeny, které nejsou řeč, a dekódování je zbytečné CPU. Prakticky: trvale velmi tichý řečník v přepisu není. Když se někdo vrátí prázdný, nejdřív zkontroluj úroveň vstupu, než to svedeš na model.

Po zastavení běží diarizace offline nad nahrávkou a rozdělí vzdálený kanál na jednotlivé řečníky (Person 1, Person 2, …), které můžeš přejmenovat. Počet řečníků se odvodí z prahu shlukování, ne z čísla, které zadáš. Je to artefakt prahu: tichý nebo překrývající se řečník se může sloučit se sousedem. Přepis se vykreslí jako řádky [mm:ss] SPEAKER: text.

Přejmenování řečníka není jen popisek v jednom přepisu. Control Center umí hlasový otisk uložit jako hlasový profil a v dalších schůzkách ho pozná samo. Když diarizovaného řečníka pojmenuješ, zeptá se, jestli otisk uložit. Když ano, přimíchá se do průběžného centroidu toho jména a s novými řečníky se porovná kosinovou podobností. Stejný člověk se příště ukáže pod svým jménem a nemusíš ho znovu přejmenovávat.

Hlasové profily patří do pracovního prostoru a hranici nepřekročí. Spravuješ je v Nastavení → Pracovní prostor → Schůzky. Přejmenování řečníka, který už byl uložený, zruší zápis starého jména a nabídne zapsat nové. Smazání profilu odstraní uložený hlasový otisk. Jména, která už u starších schůzek jsou, zůstanou.

Když nahrávání skončí, server publikuje MeetingRecordingStopped jako doménovou událost. Vestavěná šablona pipeline meeting_summary se tou událostí spustí. Nahrávač na ni nečeká. Schůzka jen projde stavy:

recording → processing → done

Agent pro shrnutí dostane název, tvoje hrubé živé poznámky a přepis a vrátí strukturované JSON. Které oddíly napíše, určuje aktivní šablona poznámek ze schůzky v pracovním prostoru (Nastavení → Pracovní prostor → Schůzky). Aktivní šablona platí pro nová i znovu spuštěná shrnutí. Kroky pipeline, které data ukládají, pak zapíšou to JSON do samostatných řádků:

  • enhancedNotes a summary → poznámky schůzky
  • každá akční položka → řádek MeetingActionItem (obsah, vlastník, volitelný odkaz na ticket)
  • každé rozhodnutí → řádek MeetingDecision

Akční položky a rozhodnutí se nikdy nečtou z volného markdownu, jen ze strukturovaných polí agenta. Když běh nevrátí strukturovaný výstup, kroky uložení se přeskočí a jako záloha zůstane surový přepis, takže o záznam nepřijdeš. Nic v pipeline neoznačí schůzku jako done. To udělá jeden reconciler z koncové události běhu. Pád sousedního kroku tak nenechá napůl zapsanou schůzku, která už vypadá jako hotová.

Kde se schůzky ukazují

Sekce “Kde se schůzky ukazují”
Plocha Co ukazuje
/meetings Seznam schůzek s počty akčních položek a rozhodnutí
/meetings/record HUD živého nahrávání: na jedné straně poznámky, na druhé streamovaný přepis
/meetings/:meetingId Detail schůzky: záložky Poznámky, Přepis, Akční položky a Rozhodnutí
Nastavení → Pracovní prostor → Schůzky Šablony poznámek a uložené hlasové profily pro tento pracovní prostor

Záznam je na všech třech desktopových platformách bez ovladače (tap Core Audio na macOS, WASAPI na Windows, PipeWire na Linuxu).

Nahrává i webový klient, což rámování zbytku stránky kolem desktopu snadno schová. Prohlížeč vezme mikrofon přes getUserMedia a zvuk schůzky přes getDisplayMedia (sdílení obrazovky), převzorkuje ho na 16 kHz PCM16 a streamuje na stejného hostitele. Platí tam tři výhrady:

  • Sdílená plocha musí nést zvukovou stopu. Safari, Firefox a sdílení celé obrazovky na macOS žádnou nedají a nahrávání se odmítne spustit.
  • Nativní AEC3 tam není. U mikrofonu se požádá o potlačení ozvěny v prohlížeči. Textový filtr ozvěny na hostiteli pořád běží. HUD ukazuje měřič úrovně vstupu z PCM mikrofonu.
  • Znovu spustit shrnutí a zrušit zpracování jde jen na desktopu.

Akce kalendáře Spustit nahrávání a propojit je jen na desktopu a na webu to řekne napřímo, i když vlastní nahrávání na obrazovce schůzek tam funguje.