İçeriğe geç

Toplantılar ve transkripsiyon

Control Center bir görüşmeyi kaydedip size temiz bir yazılı çıktı — bir özet, eylem öğeleri ve kararlar — sunabilir; konuşma tanıma ve konuşmacı ayırma kendi donanımınızda çalışır. Granola’yı düşünün, ama kendi sunucunuzda barındırılan ve ajanlarınızın yaşadığı aynı çalışma alanına bağlı.

Bir toplantı, kaydedilmiş ve transkripte edilmiş bir oturumdur. Bir takvim etkinliğiyle aynı şey değildir: etkinlik, Google’dan eşitlenen planlı bir taahhüttür; toplantıysa gerçekten kaydettiğiniz bir şeydir. İkisi bağlanabilir, çünkü bir etkinlikten kayıt başlatabilirsiniz; ama ayrı kayıtlar olarak kalırlar.

Her toplantı, Control Center’daki her şey gibi çalışma alanına özgüdür. Bir çalışma alanında kaydedilen toplantılar başka birinde asla görünmez.

“Cihaz üzerinde” doğru bir içgüdü ama yanlış bir adlandırma. İstemci sesi yakalar ve 16 kHz PCM16 çerçevelerini cc_server çalıştıran makineye akıtır. Geri kalan her şeyi o ana makine yapar: kanal başına WAV’ları <dataDir>/meetings/<meetingId>/ altına yazar, bir worker isolate içinde transkript çıkarır, yankıyı filtreler ve sonradan diarizasyon uygular. Tek başına çalışan bir masaüstünde o ana makine aynı makinedir. Uzak bir sunucuya yönlendirildiğinde değildir — yani “dizüstü bilgisayarımdan hiçbir şey çıkmıyor” yalnızca sunucu dizüstü bilgisayarınız olduğunda doğrudur.

Bir istisna daha var ve önemli olan da o.

Özetten önceki her şey — yakalama, transkripsiyon, yankı iptali, diarizasyon, ses izi eşleştirme — ağ çağrısı yapılmadan sunucuda çalışır.

Gömme, diarizasyon ve konuşma (ASR) modelleri ilk açılışta zorla kurulur (bir demoda atlanır); böylece konuşmacı ayırma ve kayıt, ayarlara uğramadan hazır olur. ASR yine de seçilebilir — birkaç yüz megabayttır ve seçicide dört derleme bulunur. Konuşma modeli, o ilk indirmeden sonra bir kez daha yeniden başlatma gerektirir; çünkü transkript çıkarıcı, modelini indirme tamamlanmadan önce çözer.

Boyut, dil kapsamı ve doğruluk açısından farklılaşan dört seçici girdisi:

  • Parakeet TDT 0.6B v3 — çok dilli, önerilen varsayılan (~600 MB)
  • Parakeet TDT 0.6B v2 — İngilizce (~480 MB)
  • Whisper large-v3-turbo — çok dilli (~626 MB)
  • Whisper base.en — yalnızca İngilizce, küçük tarihsel varsayılan (~198 MB)

Modeller, sunucunun çalışma zamanında indirdiği tek yapıtlardır; tüm yerel kütüphaneler paketle birlikte gelir.

Bir toplantı aynı anda iki ses kanalı kaydeder:

  • Siz (“me”): mikrofonunuz.
  • Onlar (“them”): toplantının ses çıkışı; sürücüsüz bir loopback ile yakalanır — macOS’te Core Audio süreç/aygıt tap’leri, Windows’ta WASAPI loopback, Linux’ta bir PipeWire / PulseAudio monitörü.

İki kanal ayrı ayrı yakalandığı için transkript baştan konuşmacıya atanır: sizin sözleriniz me, görüşmedeki herkes them olarak etiketlenir.

Kendi sesiniz sistem çıkışından mikrofona sızar ve aksi halde iki kez transkripte edilirdi. İki filtre bunu engeller. Sinyal düzeyinde AEC3 her uzak mod kaydında çalışır ve zorunludur — yerel AEC kütüphanesi yüklenemezse, kayıt yankıyla kirlenmiş bir mikrofonu sessizce akıtmak yerine başlamayı reddeder. (Yüz yüze modda iptal edilecek bir karşı uç referansı yoktur, bu yüzden AEC orada etkisiz bir geçiştir.) Üstüne, ana makine tarafında metin düzeyinde bir yankı filtresi her platformda çalışır.

Tüm işletim sistemi düzeyindeki mikrofon işleme kasten devre dışıdır. macOS’te platformun kendi yankı iptalini veya otomatik kazancını etkinleştirmek, mikrofonu Voice Processing I/O’ya geçirir; bu derlemede bu, hem mikrofonu hem de sistem sesi tap’ini öldürdü.

Siz kaydederken ses, kayan pencereler halinde — kısa bir sondaki sessizlikte ya da azami pencere uzunluğunda kesilerek — UI iş parçacığının dışında çözülür. Her pencere, milisaniye cinsinden konumlarla konuşmacı etiketli bir transkript bölümüne dönüşür.

Bir RMS eşiğinin üzerine hiç çıkmayan pencereler hiç çözülmeden atlanır; çünkü bir konuşma modeli sessizliği halüsinasyon görmüş konuşma dışı token’lar olarak üretir ve çözme boşa CPU harcar. Bunun pratik sonucu: sürekli çok sessiz konuşan bir kişi transkript üretmez. Birinin çıktısı boş gelirse, modeli suçlamadan önce giriş düzeyini kontrol edin.

Durdurduktan sonra diarizasyon kayıt üzerinde çevrimdışı çalışır ve uzak kanalı yeniden adlandırabileceğiniz ayrı konuşmacılara (Person 1, Person 2, …) böler. Konuşmacı sayısı, sizin girdiğiniz bir sayıdan değil, bir kümeleme eşiğinden çıkarılır — yani bu bir eşik yan ürünüdür ve sessiz ya da üst üste konuşan bir konuşmacı bir komşusuna birleştirilebilir. Transkript, [mm:ss] SPEAKER: text satırları olarak gösterilir.

Bir konuşmacıyı yeniden adlandırmak, tek bir transkripti etiketlemekten fazlasını yapar. Control Center, konuşmacının ses izini bir ses profili olarak kaydedebilir; böylece onu gelecekteki toplantılarda otomatik tanır. Diarizasyonla ayrılmış bir konuşmacıya ad verdiğinizde, ses izinin kaydedilip kaydedilmeyeceği sorulur; kaydederseniz, o ad için sürekli güncellenen bir merkeze karıştırılır ve yeni konuşmacılarla kosinüs benzerliğine göre eşleştirilir; böylece aynı kişi bir dahaki sefere yeniden etiketlemenize gerek kalmadan adıyla görünür.

Ses profilleri çalışma alanına özgüdür ve sınırı asla aşmaz. Bunları Ayarlar → Çalışma alanı → Toplantılar altından yönetin. Daha önce kaydedilmiş bir konuşmacıyı yeniden adlandırmak, eski adın kaydını kaldırır ve yeni adı kaydetmeyi önerir; bir profili silmek saklanan ses izini kaldırır ama geçmiş toplantılara uygulanmış adları olduğu gibi bırakır.

Bir kayıt durduğunda sunucu bir MeetingRecordingStopped alan olayı yayımlar. Yerleşik meeting_summary pipeline şablonu bu olayla tetiklenir. Kaydedici bunu beklemez; toplantı yalnızca durum yaşam döngüsünden geçer:

recording → processing → done

Özet ajanı başlığı, kaba canlı notlarınızı ve transkripti alır ve yapılandırılmış JSON döndürür. Hangi bölümleri yazacağı, çalışma alanının etkin toplantı notu şablonu ile belirlenir (Ayarlar → Çalışma alanı → Toplantılar); etkin şablon yeni ve yeniden çalıştırılan özetlere uygulanır. Ardından pipeline’ın kalıcılaştırma adımları bu JSON’u ayrı satırlara yazar:

  • enhancedNotes ve summary → toplantının notları
  • her eylem öğesi → bir MeetingActionItem satırı (içerik, sahip, isteğe bağlı bilet bağlantısı)
  • her karar → bir MeetingDecision satırı

Eylem öğeleri ve kararlar serbest biçimli markdown’dan asla ayrıştırılmaz; yalnızca ajanın yapılandırılmış dizilerinden alınır. Bir çalıştırma yapılandırılmış çıktı üretmezse, kalıcılaştırma adımları atlanır ve ham transkript yedek olarak saklanır; böylece kaydı asla kaybetmezsiniz. Pipeline’da hiçbir şey toplantıyı done olarak işaretlemez — bunu, çalıştırmanın terminal olayından tek bir uzlaştırıcı yapar; böylece kardeş bir adımın başarısız olması, zaten bitmiş görünen yarı yazılmış bir toplantıyı ortada bırakamaz.

Yüzey Ne gösterir
/meetings Toplantı listesi; eylem öğesi ve karar sayılarıyla
/meetings/record Canlı kayıt HUD’ı: bir yanda notlarınız, diğer yanda akan transkript
/meetings/:meetingId Bir toplantının ayrıntısı: Notlar, Transkript, Eylem öğeleri ve Kararlar sekmeleri
Ayarlar → Çalışma alanı → Toplantılar Bu çalışma alanının not şablonları ve kayıtlı ses profilleri

Yakalama, üç masaüstü platformunda da sürücüsüzdür (macOS’te Core Audio tap’leri, Windows’ta WASAPI, Linux’ta PipeWire).

Web istemcisi de kaydeder — bu sayfanın geri kalanındaki masaüstü anlatımı bunu gizleyebilir: tarayıcı mikrofonunuzu getUserMedia ile, toplantı sesini getDisplayMedia (ekran paylaşımı) ile alır, 16 kHz PCM16’ya düşürür ve aynı ana makineye akıtır. Burada üç uyarı geçerlidir:

  • Paylaşılan yüzey bir ses parçası taşımalıdır. Safari, Firefox ve macOS tam ekran paylaşımı ses parçası vermez ve kayıt başlamayı reddeder.
  • Yerel AEC3 yoktur. Mikrofonda tarayıcının kendi yankı iptali istenir; ana makine tarafındaki metin yankı filtresi yine çalışır. HUD, mikrofon PCM’inden beslenen bir giriş düzeyi ölçeri gösterir.
  • Özeti yeniden çalıştırma ve işlemeyi iptal etme yalnızca masaüstünde çalışır.

Takvimin Kaydı başlat ve bağla eylemi yalnızca masaüstünde çalışır ve web’de bunu açıkça bildirir; oysa toplantılar ekranının kendi kayıt akışı orada çalışır.