Lewati ke konten

Rapat dan transkripsi

Control Center dapat merekam panggilan dan mengembalikan tulisan yang bersih kepada Anda — ringkasan, item tindakan dan keputusan — dengan pengenalan ucapan dan pemisahan pembicara berjalan di perangkat keras Anda sendiri. Bayangkan Granola, tetapi dihosting sendiri dan terhubung ke ruang kerja yang sama tempat agen Anda berada.

Rapat adalah sesi yang direkam dan ditranskripsi. Rapat bukan hal yang sama dengan acara kalender: acara adalah komitmen terjadwal yang disinkronkan dari Google, sedangkan rapat adalah sesuatu yang benar-benar Anda rekam. Keduanya dapat ditautkan, karena Anda dapat memulai rekaman dari sebuah acara, tetapi keduanya tetap merupakan catatan yang berbeda.

Setiap rapat dibatasi pada ruang kerja, seperti semua hal lain di Control Center. Rapat yang direkam di satu ruang kerja tidak pernah muncul di ruang kerja lain.

“Di perangkat” adalah insting yang benar, tetapi kata bendanya salah. Klien menangkap audio dan mengalirkan frame PCM16 16 kHz ke mesin yang menjalankan cc_server. Host itu melakukan semua hal lainnya: ia menulis WAV per kanal di bawah <dataDir>/meetings/<meetingId>/, mentranskripsi di isolate pekerja, memfilter gema dan melakukan diarisasi setelah rekaman selesai. Pada desktop mandiri, host itu adalah mesin yang sama. Saat diarahkan ke server jarak jauh, tidak demikian — jadi “tidak ada yang meninggalkan laptop saya” hanya benar bila servernya adalah laptop Anda.

Ada satu pengecualian lain dan itulah yang penting.

Semua yang sebelum ringkasan — penangkapan, transkripsi, pembatalan gema, diarisasi, pencocokan sidik suara — berjalan di server tanpa panggilan jaringan.

Model embedding, diarisasi dan ucapan (ASR) dipasang paksa saat boot pertama (dilewati dalam demo), sehingga pemisahan pembicara dan perekaman tersedia tanpa perlu membuka pengaturan. ASR tetap dapat dipilih — ukurannya beberapa ratus megabita, dan empat build tersedia di pemilih. Model ucapan tetap memerlukan satu kali mulai ulang setelah unduhan pertama itu, karena pentranskripsi menyelesaikan modelnya sebelum pengambilan selesai.

Keempat entri pemilih, yang berbeda dalam ukuran, cakupan bahasa dan akurasi:

  • Parakeet TDT 0.6B v3 — multibahasa, default yang direkomendasikan (~600 MB)
  • Parakeet TDT 0.6B v2 — bahasa Inggris (~480 MB)
  • Whisper large-v3-turbo — multibahasa (~626 MB)
  • Whisper base.en — hanya bahasa Inggris, default historis yang kecil (~198 MB)

Model adalah satu-satunya artefak yang diambil server saat runtime; setiap pustaka native disertakan dalam bundel.

Sebuah rapat merekam dua kanal audio sekaligus:

  • Anda (“me”): mikrofon Anda.
  • Mereka (“them”): keluaran audio rapat, ditangkap oleh loopback tanpa driver — tap proses/perangkat Core Audio di macOS, loopback WASAPI di Windows, monitor PipeWire / PulseAudio di Linux.

Karena kedua kanal ditangkap secara terpisah, transkrip sudah diatribusikan ke pembicara sejak awal: kata-kata Anda diberi tag me, semua orang dalam panggilan diberi tag them.

Suara Anda sendiri merembes dari keluaran sistem kembali ke mikrofon dan jika tidak ditangani akan ditranskripsi dua kali. Dua filter menghentikannya. AEC3 tingkat sinyal berjalan pada setiap perekaman mode jarak jauh dan wajib ada — jika pustaka AEC native gagal dimuat, perekaman menolak dimulai alih-alih secara diam-diam mengalirkan mikrofon yang tercemar gema. (Mode tatap muka tidak memiliki referensi ujung jauh untuk dibatalkan, jadi AEC di sana hanya meneruskan sinyal apa adanya.) Di atasnya, filter gema tingkat teks di sisi host berjalan di setiap platform.

Semua pemrosesan mikrofon tingkat OS sengaja dinonaktifkan. Mengaktifkan pembatalan gema atau penguatan otomatis milik platform di macOS mengalihkan mikrofon ke Voice Processing I/O, yang pada build ini mematikan mikrofon dan tap audio sistem.

Saat Anda merekam, audio didekode dalam jendela bergulir — dipotong pada keheningan pendek di akhir, atau pada panjang jendela maksimum — di luar thread UI. Setiap jendela menjadi segmen transkrip bertag pembicara dengan offset milidetik.

Jendela yang tidak pernah melewati ambang RMS akan dilewati tanpa didekode sama sekali, karena model ucapan merender keheningan sebagai token non-ucapan hasil halusinasi dan pendekodeannya hanya membuang CPU. Konsekuensi praktisnya: pembicara yang terus-menerus sangat pelan tidak menghasilkan transkrip. Jika seseorang tidak menghasilkan apa pun, periksa level masukannya sebelum menyalahkan model.

Setelah Anda berhenti, diarisasi berjalan offline atas rekaman dan memecah kanal jarak jauh menjadi pembicara individual (Person 1, Person 2, …) yang dapat Anda ganti namanya. Jumlah pembicara disimpulkan dari ambang pengelompokan, bukan dari jumlah yang Anda tetapkan — jadi ini artefak ambang dan pembicara yang pelan atau tumpang tindih dapat digabungkan ke pembicara tetangganya. Transkrip dirender sebagai baris [mm:ss] SPEAKER: text.

Mengganti nama pembicara lebih dari sekadar memberi label pada satu transkrip. Control Center dapat menyimpan sidik suara pembicara sebagai profil suara, sehingga mengenali mereka secara otomatis di rapat mendatang. Saat Anda memberi nama pembicara hasil diarisasi, Anda ditanya apakah ingin menyimpan sidik suaranya; jika ya, sidik itu digabungkan ke centroid berjalan untuk nama tersebut dan dicocokkan dengan pembicara baru melalui kemiripan kosinus, sehingga orang yang sama muncul dengan namanya lain kali tanpa Anda melabelinya ulang.

Profil suara dibatasi per ruang kerja dan tidak pernah melewati batasnya. Kelola profil ini di Pengaturan → Ruang kerja → Rapat. Mengganti nama pembicara yang sebelumnya tersimpan akan membatalkan pendaftaran nama lama dan menawarkan mendaftarkan nama baru; menghapus profil menghapus sidik suara yang tersimpan tetapi membiarkan nama apa pun yang sudah diterapkan pada rapat sebelumnya tetap utuh.

Saat perekaman berhenti, server menerbitkan peristiwa domain MeetingRecordingStopped. Templat pipeline meeting_summary bawaan dipicu oleh peristiwa itu. Perekam tidak menunggunya; rapat hanya bertransisi melalui siklus hidup statusnya:

recording → processing → done

Agen ringkasan menerima judul, catatan langsung kasar Anda dan transkrip, lalu mengembalikan JSON terstruktur. Bagian yang ditulisnya ditentukan oleh templat catatan rapat aktif ruang kerja (Pengaturan → Ruang kerja → Rapat); templat aktif berlaku untuk ringkasan baru dan yang dijalankan ulang. Langkah persist pipeline kemudian menulis JSON itu ke baris terpisah:

  • enhancedNotes dan summary → catatan rapat
  • setiap item tindakan → baris MeetingActionItem (konten, pemilik, tautan tiket opsional)
  • setiap keputusan → baris MeetingDecision

Item tindakan dan keputusan tidak pernah diurai dari markdown bebas, hanya dari larik terstruktur agen. Jika suatu eksekusi tidak menghasilkan keluaran terstruktur, langkah persist dilewati dan transkrip mentah disimpan sebagai cadangan, sehingga Anda tidak pernah kehilangan catatannya. Tidak ada apa pun di pipeline yang menandai rapat done — satu reconciler yang melakukannya dari peristiwa terminal eksekusi, sehingga kegagalan langkah saudaranya tidak dapat meninggalkan rapat yang setengah tertulis tetapi sudah terlihat selesai.

Permukaan Isinya
/meetings Daftar rapat, dengan jumlah item tindakan dan keputusan
/meetings/record HUD perekaman langsung: catatan Anda di satu sisi, transkrip yang mengalir di sisi lain
/meetings/:meetingId Detail rapat: tab Catatan, Transkrip, Item tindakan dan Keputusan
Pengaturan → Ruang kerja → Rapat Templat catatan dan profil suara tersimpan untuk ruang kerja ini

Penangkapan tidak memerlukan driver di ketiga platform desktop (tap Core Audio di macOS, WASAPI di Windows, PipeWire di Linux).

Klien web juga merekam, yang bisa tersembunyi oleh kerangka desktop di sisa halaman ini: peramban mengambil mikrofon Anda melalui getUserMedia dan audio rapat melalui getDisplayMedia (berbagi layar), menurunkan sampelnya ke PCM16 16 kHz dan mengalirkannya ke host yang sama. Ada tiga catatan di sana:

  • Permukaan yang dibagikan harus membawa trek audio. Berbagi layar penuh di Safari, Firefox dan macOS tidak menghasilkan trek itu dan perekaman menolak dimulai.
  • Tidak ada AEC3 native. Pembatalan gema milik peramban diminta pada mikrofon; filter gema teks di sisi host tetap berjalan. HUD menampilkan pengukur level masukan yang digerakkan oleh PCM mikrofon.
  • Jalankan ulang ringkasan dan batalkan pemrosesan hanya tersedia di desktop.

Tindakan Mulai rekaman & tautkan di kalender hanya tersedia di desktop dan melaporkan hal itu secara terang-terangan di web, meskipun alur perekaman di layar rapat sendiri berfungsi di sana.