Przejdź do głównej zawartości

Spotkania i transkrypcja

Control Center potrafi nagrać rozmowę i oddać Ci gotowe opracowanie — podsumowanie, zadania i decyzje — z rozpoznawaniem mowy i rozdzielaniem mówców działającymi na Twoim własnym sprzęcie. Coś jak Granola, ale hostowana samodzielnie i wpięta w ten sam obszar roboczy, w którym żyją Twoi agenci.

Spotkanie to nagrana i transkrybowana sesja. To nie to samo co wydarzenie w kalendarzu: wydarzenie to zaplanowane zobowiązanie zsynchronizowane z Google, a spotkanie to coś, co faktycznie nagrałeś. Oba można powiązać, bo nagranie możesz rozpocząć z wydarzenia, ale pozostają osobnymi rekordami.

Każde spotkanie należy do obszaru roboczego, podobnie jak wszystko inne w Control Center. Spotkania nagrane w jednym obszarze roboczym nigdy nie pojawiają się w innym.

„Na urządzeniu” to właściwy odruch, ale złe słowo. Klient przechwytuje dźwięk i strumieniuje ramki 16 kHz PCM16 do maszyny z uruchomionym cc_server. Ten host robi wszystko inne: zapisuje pliki WAV poszczególnych kanałów w <dataDir>/meetings/<meetingId>/, transkrybuje w izolacie workera, filtruje echo i rozdziela mówców po fakcie. W samodzielnej instalacji na komputerze tym hostem jest ta sama maszyna. Przy wskazaniu zdalnego serwera już nie — więc „nic nie opuszcza mojego laptopa” jest prawdą tylko wtedy, gdy serwerem jest Twój laptop.

Jest jeszcze jeden wyjątek i to on jest najważniejszy.

Wszystko przed podsumowaniem — przechwytywanie, transkrypcja, usuwanie echa, rozdzielanie mówców, dopasowywanie odcisku głosu — działa na serwerze bez żadnego wywołania sieciowego.

Modele osadzania, rozdzielania mówców i mowy (ASR) są wymuszenie instalowane przy pierwszym rozruchu (pomijane w wersji demo), więc rozdzielanie mówców i nagrywanie działają bez zaglądania do ustawień. ASR jest jednak wybieralny — waży kilkaset megabajtów, a na liście wyboru dostępne są cztery kompilacje. Mowa nadal wymaga jednego restartu po tym pierwszym pobraniu, bo transkrybator ustala swój model, zanim pobieranie zdąży się zakończyć.

Cztery pozycje na liście wyboru, różniące się rozmiarem, pokryciem językowym i dokładnością:

  • Parakeet TDT 0.6B v3 — wielojęzyczny, zalecany domyślny (~600 MB)
  • Parakeet TDT 0.6B v2 — angielski (~480 MB)
  • Whisper large-v3-turbo — wielojęzyczny (~626 MB)
  • Whisper base.en — tylko angielski, mały domyślny model historyczny (~198 MB)

Modele to jedyne artefakty, które serwer pobiera w czasie działania; każda biblioteka natywna jest dołączona do pakietu.

Spotkanie nagrywa dwa kanały audio jednocześnie:

  • Ty („me”): Twój mikrofon.
  • Oni („them”): wyjście audio spotkania, przechwytywane przez pętlę zwrotną bez sterownika — przechwytywanie procesów/urządzeń Core Audio w systemie macOS, pętla zwrotna WASAPI w systemie Windows, monitor PipeWire / PulseAudio w systemie Linux.

Ponieważ oba kanały są przechwytywane osobno, transkrypt od początku ma przypisanych mówców: Twoje słowa są oznaczane jako me, a wszyscy pozostali w rozmowie jako them.

Twój własny głos przedostaje się z wyjścia systemowego z powrotem do mikrofonu i bez zabezpieczeń zostałby transkrybowany dwukrotnie. Dwa filtry temu zapobiegają. AEC3 na poziomie sygnału działa przy każdym nagraniu w trybie zdalnym i jest wymagany — jeśli natywna biblioteka AEC nie może się wczytać, nagranie odmawia startu, zamiast po cichu strumieniować mikrofon zanieczyszczony echem. (Tryb osobisty nie ma referencji zdalnej, względem której można by usuwać echo, więc AEC tylko przepuszcza tam sygnał bez zmian.) Dodatkowo na każdej platformie działa po stronie hosta filtr echa na poziomie tekstu.

Całe przetwarzanie mikrofonu na poziomie systemu jest celowo wyłączone. Włączenie własnego usuwania echa lub automatycznego wzmocnienia platformy w systemie macOS przełącza mikrofon na Voice Processing I/O, co w tej kompilacji unieruchamiało zarówno mikrofon, jak i przechwytywanie dźwięku systemowego.

W trakcie nagrywania dźwięk jest dekodowany w przesuwnych oknach — ciętych przy krótkiej ciszy na końcu lub przy maksymalnej długości okna — poza wątkiem interfejsu. Każde okno staje się segmentem transkryptu z przypisanym mówcą i przesunięciami w milisekundach.

Okna, które nigdy nie przekroczyły progu RMS, są pomijane bez żadnego dekodowania, bo model mowy przedstawia ciszę jako halucynowane tokeny niebędące mową, a dekodowanie marnuje CPU. Praktyczna konsekwencja: mówca konsekwentnie bardzo cichy nie daje żadnego transkryptu. Jeśli ktoś wypada pusto, sprawdź jego poziom wejściowy, zanim obwinisz model.

Po zatrzymaniu diaryzacja działa offline na całym nagraniu i dzieli kanał zdalny na poszczególnych mówców (Person 1, Person 2, …), których możesz zmienić nazwę. Liczba mówców jest wnioskowana z progu grupowania, a nie z ustawionej przez Ciebie wartości — więc jest artefaktem progu i cichy lub nakładający się mówca może zostać scalony z sąsiadem. Transkrypt jest renderowany jako wiersze [mm:ss] SPEAKER: text.

Zmiana nazwy mówcy to coś więcej niż oznaczenie jednego transkryptu. Control Center może zapisać odcisk głosu mówcy jako profil głosu, dzięki czemu rozpoznaje go automatycznie na przyszłych spotkaniach. Gdy nadajesz nazwę mówcy po diaryzacji, pojawia się pytanie, czy zapisać odcisk głosu; jeśli to zrobisz, zostaje on wmieszany do stale aktualizowanej centroidy dla tej nazwy i dopasowywany do nowych mówców na podstawie podobieństwa kosinusowego, więc ta sama osoba pojawi się następnym razem ze swoją nazwą bez ponownego oznaczania.

Profile głosu są przypisane do obszaru roboczego i nigdy nie przekraczają jego granicy. Zarządzasz nimi w Ustawienia → Obszar roboczy → Spotkania. Zmiana nazwy mówcy, który został wcześniej zapisany, wyrejestrowuje starą nazwę i proponuje zarejestrowanie nowej; usunięcie profilu usuwa zapisany odcisk głosu, ale pozostawia nienaruszone nazwy już zastosowane do minionych spotkań.

Gdy nagranie się zatrzyma, serwer publikuje zdarzenie domenowe MeetingRecordingStopped. Wbudowany szablon potoku meeting_summary jest wyzwalany przez to zdarzenie. Nagrywarka na niego nie czeka; spotkanie po prostu przechodzi przez kolejne stany swojego cyklu życia:

recording → processing → done

Agent podsumowujący otrzymuje tytuł, Twoje pobieżne notatki na żywo i transkrypt, a zwraca ustrukturyzowany JSON. To, jakie sekcje zapisze, kształtuje aktywny szablon notatek ze spotkania w obszarze roboczym (Ustawienia → Obszar roboczy → Spotkania); aktywny szablon dotyczy nowych i ponownie uruchamianych podsumowań. Kroki utrwalania w potoku zapisują następnie ten JSON do osobnych wierszy:

  • enhancedNotes i summary → notatki spotkania
  • każde zadanie → wiersz MeetingActionItem (treść, właściciel, opcjonalne powiązanie ze zgłoszeniem)
  • każda decyzja → wiersz MeetingDecision

Zadania i decyzje nigdy nie są wyciągane z dowolnego markdownu, tylko z ustrukturyzowanych tablic agenta. Jeśli uruchomienie nie da żadnego ustrukturyzowanego wyniku, kroki zapisu są pomijane, a surowy transkrypt zostaje zachowany jako rozwiązanie awaryjne, więc nigdy nie tracisz zapisu. Nic w potoku nie oznacza spotkania jako done — robi to pojedynczy moduł uzgadniający na podstawie zdarzenia końcowego uruchomienia, dzięki czemu awaria sąsiedniego kroku nie pozostawi na wpół zapisanego spotkania, które już wygląda na ukończone.

Powierzchnia Co pokazuje
/meetings Lista spotkań z liczbą zadań i decyzji
/meetings/record HUD nagrywania na żywo: z jednej strony Twoje notatki, z drugiej strumieniowany transkrypt
/meetings/:meetingId Szczegóły spotkania: karty Notatki, Transkrypt, Zadania i Decyzje
Ustawienia → Obszar roboczy → Spotkania Szablony notatek i zapisane profile głosu dla tego obszaru roboczego

Przechwytywanie nie wymaga sterowników na wszystkich trzech platformach desktopowych (przechwytywanie Core Audio w systemie macOS, WASAPI w systemie Windows, PipeWire w systemie Linux).

Klient webowy też nagrywa, co reszta tej strony, skupiona na komputerze, może ukrywać: przeglądarka pobiera Twój mikrofon przez getUserMedia, a dźwięk spotkania przez getDisplayMedia (udostępnianie ekranu), zmniejsza próbkowanie do 16 kHz PCM16 i strumieniuje do tego samego hosta. Obowiązują tam trzy zastrzeżenia:

  • Udostępniana powierzchnia musi nieść ścieżkę audio. Safari, Firefox i udostępnianie pełnego ekranu w systemie macOS nie dają żadnej, a nagranie odmawia startu.
  • Nie ma natywnego AEC3. Na mikrofonie wymagane jest własne usuwanie echa przeglądarki; filtr echa na poziomie tekstu po stronie hosta nadal działa. HUD pokazuje miernik poziomu wejściowego sterowany z PCM mikrofonu.
  • Ponowne uruchomienie podsumowania i anulowanie przetwarzania są dostępne tylko na komputerze.

Akcja Rozpocznij nagrywanie i powiąż w kalendarzu jest dostępna tylko na komputerze i w webowym kliencie wprost to zgłasza, mimo że własny przepływ nagrywania na ekranie spotkań działa tam również.