Bỏ qua để đến nội dung

Cuộc họp và phiên âm

Control Center có thể ghi âm một cuộc gọi và trả lại cho bạn một bản ghi chép gọn gàng — tóm tắt, mục hành động và quyết định — với nhận dạng giọng nói và phân tách người nói chạy trên chính phần cứng của bạn. Cứ nghĩ đến Granola, nhưng tự lưu trữ và được nối vào đúng không gian làm việc mà các agent của bạn đang sống.

Một cuộc họp là một phiên đã được ghi âm và phiên âm. Nó không phải là một sự kiện trên lịch: sự kiện là một cam kết đã lên lịch được đồng bộ từ Google, còn cuộc họp là thứ bạn thực sự đã ghi lại. Hai thứ có thể được liên kết, vì bạn có thể bắt đầu ghi từ một sự kiện, nhưng chúng vẫn là hai bản ghi riêng biệt.

Mọi cuộc họp đều thuộc phạm vi không gian làm việc, giống mọi thứ khác trong Control Center. Cuộc họp được ghi trong một không gian làm việc không bao giờ xuất hiện ở một không gian làm việc khác.

“Trên thiết bị” là trực giác đúng nhưng sai cách gọi. Máy khách thu âm thanh và truyền các khung PCM16 16 kHz tới máy đang chạy cc_server. Máy chủ đó làm mọi việc còn lại: nó ghi các tệp WAV theo từng kênh vào <dataDir>/meetings/<meetingId>/, phiên âm trong một isolate worker, lọc tiếng vọng và phân tách người nói sau đó. Trên một máy để bàn độc lập, máy chủ đó cũng chính là máy đó. Khi trỏ tới một máy chủ từ xa thì không phải vậy — nên câu “không gì rời khỏi laptop của tôi” chỉ đúng khi máy chủ chính là laptop của bạn.

Còn một ngoại lệ nữa và đó là ngoại lệ quan trọng.

Mọi thứ trước bản tóm tắt — thu âm, phiên âm, khử vọng, phân tách người nói, khớp dấu giọng — đều chạy trên máy chủ mà không cần gọi mạng.

Các mô hình embedding, phân tách người nói và giọng nói (ASR) được cài đặt bắt buộc ở lần khởi động đầu tiên (bị bỏ qua ở bản demo), nên việc phân tách người nói và ghi âm đã sẵn có mà bạn không cần ghé vào phần cài đặt. ASR vẫn có thể chọn — nó nặng vài trăm megabyte và có bốn bản dựng trong bộ chọn. Sau lần tải về đầu tiên đó, mô hình giọng nói vẫn cần một lần khởi động lại, vì bộ phiên âm phân giải mô hình của nó trước khi quá trình tải về kịp hoàn tất.

Bốn mục trong bộ chọn, khác nhau về kích thước, độ phủ ngôn ngữ và độ chính xác:

  • Parakeet TDT 0.6B v3 — đa ngôn ngữ, mặc định được khuyến nghị (~600 MB)
  • Parakeet TDT 0.6B v2 — tiếng Anh (~480 MB)
  • Whisper large-v3-turbo — đa ngôn ngữ (~626 MB)
  • Whisper base.en — chỉ tiếng Anh, mặc định cũ nhỏ gọn (~198 MB)

Mô hình là thứ duy nhất máy chủ tải về lúc chạy; mọi thư viện gốc đều có sẵn trong gói.

Một cuộc họp ghi hai kênh âm thanh cùng lúc:

  • Bạn (“me”): micro của bạn.
  • Họ (“them”): đầu ra âm thanh của cuộc họp, được thu bằng một loopback không cần trình điều khiển — các bộ tap process/device của Core Audio trên macOS, loopback WASAPI trên Windows, một monitor PipeWire / PulseAudio trên Linux.

Vì hai kênh được thu riêng, bản ghi được gán người nói ngay từ đầu: lời của bạn được gắn thẻ me, còn mọi người trong cuộc gọi được gắn thẻ them.

Giọng của chính bạn rò từ đầu ra hệ thống trở lại micro và nếu không xử lý sẽ bị phiên âm hai lần. Hai bộ lọc ngăn điều đó. AEC3 ở mức tín hiệu chạy trên mọi bản ghi ở chế độ từ xa và là bắt buộc — nếu thư viện AEC gốc không tải được, bản ghi sẽ từ chối khởi động thay vì âm thầm truyền một micro lẫn tiếng vọng. (Chế độ gặp trực tiếp không có tín hiệu đầu xa nào để khử, nên ở đó AEC chỉ là một bước chuyển tiếp nguyên vẹn.) Trên hết, một bộ lọc tiếng vọng ở mức văn bản phía máy chủ chạy trên mọi nền tảng.

Mọi xử lý micro ở cấp hệ điều hành đều bị tắt có chủ đích. Bật tính năng khử vọng hoặc tự động tăng âm của chính nền tảng trên macOS sẽ chuyển micro sang Voice Processing I/O, và trong bản dựng này, điều đó giết chết cả micro lẫn bộ tap âm thanh hệ thống.

Trong khi bạn ghi, âm thanh được giải mã theo cửa sổ trượt — cắt tại một khoảng lặng ngắn ở cuối hoặc tại độ dài cửa sổ tối đa — bên ngoài luồng UI. Mỗi cửa sổ trở thành một phân đoạn bản ghi có gắn thẻ người nói kèm mốc lệch mili giây.

Những cửa sổ không bao giờ vượt ngưỡng RMS sẽ bị bỏ qua mà hoàn toàn không được giải mã, vì mô hình giọng nói biến khoảng lặng thành các token ảo giác không phải tiếng nói và việc giải mã chỉ tốn CPU vô ích. Hệ quả thực tế: một người nói liên tục rất nhỏ sẽ không tạo ra bản ghi nào. Nếu ai đó trở về tay trắng, hãy kiểm tra mức đầu vào của họ trước khi đổ lỗi cho mô hình.

Sau khi bạn dừng, phân tách người nói chạy ngoại tuyến trên bản ghi âm và tách kênh từ xa thành từng người nói riêng (Person 1, Person 2, …) mà bạn có thể đổi tên. Số lượng người nói được suy ra từ một ngưỡng phân cụm chứ không từ con số bạn đặt — nên đó là hệ quả của ngưỡng và một người nói nhỏ hoặc nói chồng lấn có thể bị gộp vào người bên cạnh. Bản ghi được hiển thị thành các dòng [mm:ss] SPEAKER: text.

Đổi tên một người nói không chỉ là dán nhãn cho một bản ghi. Control Center có thể lưu dấu giọng của người nói thành một hồ sơ giọng nói, để tự động nhận ra họ trong những cuộc họp sau. Khi bạn đặt tên cho một người nói đã được phân tách, bạn được hỏi có muốn lưu dấu giọng hay không; nếu lưu, dấu giọng được hòa vào một trọng tâm động cho tên đó và được đối chiếu với những người nói mới bằng độ tương đồng cosine, nên lần sau chính người đó sẽ hiện ra kèm tên mà bạn không phải gán nhãn lại.

Hồ sơ giọng nói thuộc phạm vi không gian làm việc và không bao giờ vượt qua ranh giới đó. Quản lý chúng tại Cài đặt → Không gian làm việc → Cuộc họp. Đổi tên một người nói đã được lưu trước đó sẽ hủy đăng ký tên cũ và đề nghị đăng ký tên mới; xóa một hồ sơ sẽ gỡ dấu giọng đã lưu nhưng giữ nguyên mọi tên đã áp dụng cho các cuộc họp trước đó.

Khi một bản ghi âm dừng lại, máy chủ phát ra một sự kiện miền MeetingRecordingStopped. Mẫu quy trình meeting_summary tích hợp sẵn được kích hoạt bởi sự kiện đó. Bộ ghi âm không chờ nó; cuộc họp chỉ chuyển qua vòng đời trạng thái của mình:

recording → processing → done

Agent tóm tắt nhận tiêu đề, ghi chú trực tiếp thô của bạn và bản ghi, rồi trả về JSON có cấu trúc. Những mục mà nó viết được định hình bởi mẫu ghi chú cuộc họp đang hoạt động của không gian làm việc (Cài đặt → Không gian làm việc → Cuộc họp); mẫu đang hoạt động áp dụng cho cả tóm tắt mới lẫn tóm tắt chạy lại. Các bước lưu trữ của quy trình sau đó ghi JSON đó thành những hàng riêng biệt:

  • enhancedNotes và summary → ghi chú của cuộc họp
  • mỗi mục hành động → một hàng MeetingActionItem (nội dung, người phụ trách, liên kết phiếu tùy chọn)
  • mỗi quyết định → một hàng MeetingDecision

Mục hành động và quyết định không bao giờ được trích ra từ markdown dạng tự do, mà chỉ từ các mảng có cấu trúc của agent. Nếu một lần chạy không tạo ra đầu ra có cấu trúc, các bước lưu trữ bị bỏ qua và bản ghi thô được giữ làm phương án dự phòng, nên bạn không bao giờ mất bản ghi. Không có gì trong quy trình đánh dấu cuộc họp là done — chỉ một bộ hòa giải duy nhất làm việc đó dựa trên sự kiện kết thúc của lần chạy, nên một bước cùng cấp thất bại không thể để lại một cuộc họp viết dở mà trông như đã hoàn tất.

Nơi xuất hiện Nội dung hiển thị
/meetings Danh sách cuộc họp, kèm số lượng mục hành động và quyết định
/meetings/record HUD ghi âm trực tiếp: ghi chú của bạn ở một bên, bản ghi đang truyền ở bên kia
/meetings/:meetingId Chi tiết một cuộc họp: các tab Ghi chú, Bản ghi, Mục việc và Quyết định
Cài đặt → Không gian làm việc → Cuộc họp Mẫu ghi chú và hồ sơ giọng nói đã lưu cho không gian làm việc này

Việc thu âm không cần trình điều khiển trên cả ba nền tảng máy để bàn (các bộ tap Core Audio trên macOS, WASAPI trên Windows, PipeWire trên Linux).

Máy khách web cũng ghi âm, điều mà cách trình bày thiên về máy để bàn ở phần còn lại của trang này có thể che khuất: trình duyệt lấy micro của bạn qua getUserMedia và âm thanh cuộc họp qua getDisplayMedia (chia sẻ màn hình), hạ mẫu xuống PCM16 16 kHz rồi truyền tới cùng máy chủ đó. Ở đó có ba lưu ý:

  • Bề mặt được chia sẻ buộc phải mang một track âm thanh. Chia sẻ toàn màn hình trên Safari, Firefox và macOS không tạo ra track nào và bản ghi âm sẽ từ chối khởi động.
  • Không có AEC3 gốc. Tính năng khử vọng của chính trình duyệt được yêu cầu trên micro; bộ lọc tiếng vọng ở mức văn bản phía máy chủ vẫn chạy. HUD hiển thị một đồng hồ đo mức đầu vào lấy từ PCM của micro.
  • Chạy lại tóm tắt và hủy xử lý chỉ có trên máy tính.

Hành động Bắt đầu ghi & liên kết của lịch chỉ có trên máy tính và báo rõ điều đó trên web, dù luồng ghi âm của chính màn hình cuộc họp vẫn hoạt động ở đó.