Перейти до вмісту

Зустрічі та транскрипція

Control Center може записати дзвінок і повернути вам охайний підсумок — резюме, пункти дій і рішення — виконуючи розпізнавання мовлення та розділення промовців на вашому власному обладнанні. Це як Granola, але self-hosted і вбудований у той самий робочий простір, де живуть ваші агенти.

Зустріч — це записана й транскрибована сесія. Це не те саме, що подія календаря: подія — це заплановане зобов’язання, синхронізоване з Google, тоді як зустріч — це те, що ви насправді записали. Їх можна пов’язати, бо запис можна почати з події, але це залишаються різні записи.

Кожна зустріч належить робочому простору, як і все інше в Control Center. Зустрічі, записані в одному робочому просторі, ніколи не з’являються в іншому.

«На пристрої» — правильний інстинкт, але невдале слово. Клієнт захоплює аудіо й передає кадри PCM16 з частотою 16 кГц на машину, де запущено cc_server. Цей хост робить усе інше: записує поканальні WAV-файли в <dataDir>/meetings/<meetingId>/, транскрибує в ізоляті воркера, фільтрує відлуння та виконує діаризацію постфактум. На окремому настільному комп’ютері цей хост — та сама машина. Якщо вказати віддалений сервер, то це вже не так — тож «нічого не залишає мій ноутбук» правда лише тоді, коли сервер і є ваш ноутбук.

Є ще один виняток, і саме він найважливіший.

Усе до підсумку — захоплення, транскрипція, придушення відлуння, діаризація, зіставлення голосових відбитків — виконується на сервері без мережевих звернень.

Моделі ембедингів, діаризації та розпізнавання мовлення (ASR) примусово встановлюються під час першого запуску (у деморежимі пропускаються), тож розділення промовців і запис доступні без відвідування налаштувань. ASR усе ще можна вибирати — вона займає кілька сотень мегабайтів, і у списку вибору є чотири збірки. Після цього першого завантаження мовленню все одно потрібен один перезапуск, бо транскрибер визначає свою модель до того, як завантаження встигне завершитися.

Чотири варіанти у списку вибору, що різняться розміром, мовним покриттям і точністю:

  • Parakeet TDT 0.6B v3 — багатомовна, рекомендована типово (~600 МБ)
  • Parakeet TDT 0.6B v2 — англійська (~480 МБ)
  • Whisper large-v3-turbo — багатомовна (~626 МБ)
  • Whisper base.en — лише англійська, невеликий історичний варіант за замовчуванням (~198 МБ)

Моделі — єдині артефакти, які сервер завантажує під час роботи; усі нативні бібліотеки постачаються в комплекті.

Зустріч записує два аудіоканали одночасно:

  • Ви («me»): ваш мікрофон.
  • Вони («them»): аудіовихід зустрічі, який захоплює loopback без драйверів — перехоплення процесів і пристроїв Core Audio в macOS, loopback WASAPI у Windows, монітор PipeWire / PulseAudio у Linux.

Оскільки ці два канали захоплюються окремо, транскрипт від самого початку прив’язаний до промовців: ваші слова позначено me, усіх інших у дзвінку — them.

Ваш власний голос просочується із системного виходу назад у мікрофон і без цього був би транскрибований двічі. Цьому запобігають два фільтри. AEC3 на рівні сигналу працює за кожного запису у віддаленому режимі й є обов’язковим — якщо нативна бібліотека AEC не завантажується, запис відмовляється запускатися, а не тихо передає мікрофон, забруднений відлунням. (У режимі очної зустрічі немає опорного сигналу віддаленої сторони, відносно якого можна щось скасовувати, тож там AEC лише пропускає сигнал без змін.) Поверх нього на кожній платформі працює текстовий фільтр відлуння на боці хоста.

Усю обробку мікрофона на рівні ОС навмисно вимкнено. Увімкнення власного придушення відлуння чи автоматичного підсилення платформи в macOS перемикає мікрофон у режим Voice Processing I/O, який у цій збірці вивів з ладу і мікрофон, і перехоплення системного звуку.

Під час запису аудіо декодується ковзними вікнами — на короткій тиші в кінці або після досягнення максимальної довжини вікна — поза потоком інтерфейсу. Кожне вікно стає сегментом транскрипту з позначкою промовця та зсувами в мілісекундах.

Вікна, що жодного разу не перевищили поріг RMS, пропускаються взагалі без декодування, бо модель розпізнавання мовлення перетворює тишу на вигадані несловесні токени, а декодування лише марнує CPU. Практичний наслідок: промовець, який постійно говорить дуже тихо, не дає жодного транскрипту. Якщо чийсь транскрипт виявився порожнім, перевірте рівень його входу, перш ніж звинувачувати модель.

Після зупинки діаризація виконується офлайн по всьому запису й ділить віддалений канал на окремих промовців (Person 1, Person 2, …), які ви можете перейменувати. Кількість промовців виводиться з порогу кластеризації, а не з числа, яке ви задали, тож це артефакт порогу: тихий промовець або промовець, чия мова перекривається з іншими, може злитися з сусідом. Транскрипт виводиться рядками [mm:ss] SPEAKER: text.

Перейменування промовця робить більше, ніж позначає один транскрипт. Control Center може зберегти голосовий відбиток промовця як голосовий профіль, щоб автоматично розпізнавати його на майбутніх зустрічах. Коли ви даєте ім’я промовцю з діаризації, вас запитують, чи зберегти голосовий відбиток; якщо зберегти, його домішують до центроїда, який поступово формується для цього імені, і порівнюють з новими промовцями за косинусною схожістю, тож наступного разу та сама людина з’явиться зі своїм іменем без повторного підписування.

Голосові профілі належать робочому простору й ніколи не перетинають його межі. Керуйте ними в Налаштування → Робочий простір → Зустрічі. Перейменування промовця, збереженого раніше, скасовує реєстрацію старого імені й пропонує зареєструвати нове; видалення профілю прибирає збережений голосовий відбиток, але залишає незмінними всі імена, уже застосовані до минулих зустрічей.

Коли запис зупиняється, сервер публікує доменну подію MeetingRecordingStopped. Вбудований шаблон конвеєра meeting_summary запускається цією подією. Записувач на нього не чекає; зустріч просто проходить через свій життєвий цикл станів:

recording → processing → done

Агент підсумку отримує назву, ваші чорнові нотатки під час зустрічі та транскрипт і повертає структурований JSON. Те, які розділи він напише, визначає активний шаблон нотаток зустрічі робочого простору (Налаштування → Робочий простір → Зустрічі); активний шаблон застосовується до нових підсумків і до повторних запусків. Далі кроки збереження конвеєра записують цей JSON в окремі рядки:

  • enhancedNotes і summary → нотатки зустрічі
  • кожен пункт дій → рядок MeetingActionItem (вміст, відповідальний, необов’язкове посилання на тікет)
  • кожне рішення → рядок MeetingDecision

Пункти дій і рішення ніколи не витягуються з вільного markdown — лише зі структурованих масивів агента. Якщо запуск не дає структурованого виводу, кроки збереження пропускаються, а необроблений транскрипт зберігається як запасний варіант, тож ви ніколи не втратите запис. Ніщо в конвеєрі не позначає зустріч як done — це робить один узгоджувач за термінальною подією запуску, тож збій сусіднього кроку не може залишити наполовину записану зустріч, яка вже виглядає завершеною.

Поверхня Що вона показує
/meetings Список зустрічей із кількістю пунктів дій і рішень
/meetings/record Живий HUD запису: ваші нотатки з одного боку, транскрипт у потоці — з іншого
/meetings/:meetingId Деталі зустрічі: вкладки «Нотатки», «Транскрипт», «Пункти дій» і «Рішення»
Налаштування → Робочий простір → Зустрічі Шаблони нотаток і збережені голосові профілі для цього робочого простору

Захоплення працює без драйверів на всіх трьох настільних платформах (перехоплення Core Audio в macOS, WASAPI у Windows, PipeWire у Linux).

Вебклієнт теж записує, і це легко не помітити за рештою викладу цієї сторінки, орієнтованого на настільні застосунки: браузер бере ваш мікрофон через getUserMedia, а звук зустрічі — через getDisplayMedia (демонстрація екрана), знижує частоту до 16 кГц PCM16 і передає все на той самий хост. Тут діють три застереження:

  • Поверхня, якою ви поділилися, обов’язково має містити звукову доріжку. Safari, Firefox і повноекранна демонстрація в macOS не дають жодної, і запис відмовляється запускатися.
  • Нативного AEC3 немає. На мікрофоні запитується власне придушення відлуння браузера; текстовий фільтр відлуння на боці хоста все одно працює. HUD показує індикатор рівня входу, який живиться від PCM мікрофона.
  • Повторний запуск підсумку та скасування обробки доступні лише в настільному застосунку.

Дія календаря Почати запис і прив’язати доступна лише в настільному застосунку й прямо повідомляє про це в браузері, хоча власний процес запису на екрані зустрічей там працює.