Мінімалістичне Chrome-розширення (Manifest V3): під час дзвінка в Google Meet з'являється кнопка ● Запис. Один клік → просте «Поділитися цією вкладкою?» → йде запис відео + звуку зустрічі + вашого мікрофона. Коли ви виходите з дзвінка — запис зупиняється сам і файл зберігається.
За замовчуванням файл падає у теку «Завантаження». Якщо налаштувати Google Drive
(розділ нижче) — вивантажується одразу в Drive, з групуванням по теках:
Meeting Recordings / РРРР-ММ-ДД / Meet <код> <дата> <час> — кожна зустріч у власній теці
(відео + конспект разом), а ті — у теці дня.
Якщо додати Gemini API-ключ (розділ «Авто-конспект» нижче) — одразу після запису розширення робить структурований конспект українською і кладе його окремим Google Документом у ту саму теку.
Працює на безкоштовному @gmail.com. Записує навіть чужі дзвінки, де ви не організатор.
Захоплення, запис і великі аплоади (Drive / заливання у Gemini) відбуваються в самій
сторінці Meet (content script) — бо там уже є дозвіл на мікрофон, а головне: відео-файл не
ганяється через sendMessage, а вантажиться fetch'ем прямо звідси. Service worker дає
content script'у OAuth-токен (бо chrome.identity доступний лише там) і веде дрібну фонову
обробку Gemini через chrome.alarms — незалежно від того, чи відкрита вкладка Meet.
| Файл | Роль |
|---|---|
manifest.json |
Дозволи (identity, storage, downloads, alarms, offscreen, clipboardWrite), OAuth, реєстрація скриптів. |
content.js / content.css |
Кнопка в Meet, детекція дзвінка, захоплення (getDisplayMedia + мікрофон), MediaRecorder, аплоад відео й аудіо-доріжки на Drive (або локально) і заливання аудіо в Gemini. |
gdrive.js / gemini.js |
Чисті функції Drive / Gemini (приймають токен/ключ) — спільні для content script і service worker, без дублювання. |
background.js |
OAuth-токен для content script, фоновий конспект через chrome.alarms (Files API → generateContent → Google Doc / .txt) з ретраями до дедлайну та перезаливкою аудіо з Drive; стан диктофона. |
popup.html / popup.js |
Статус, кнопка диктофона 🎤 (запис → транскрипт у буфер), якість відео, Gemini-ключ, повноцінні логи. |
offscreen.html / offscreen.js |
Невидимий документ розширення: тримає мікрофон диктофона, транскрибує через Gemini, копіює текст у буфер. |
mic.html / mic.js |
Одноразовий запит дозволу мікрофона для диктофона. |
icons/ |
Іконки (червона крапка). |
Потік конспекту: клік «● Запис» → getDisplayMedia({preferCurrentTab}) + getUserMedia (мікрофон) →
мікс аудіо → MediaRecorder (WebM) → на стоп content.js бере токен у background.js,
вантажить відео на Drive (інакше локально), зберігає туди ж аудіо-доріжку, заливає
аудіо в Gemini й передає background.js дрібну задачу — той по chrome.alarms чекає обробки
і робить два кроки: (1) повний транскрипт спеціалізованою моделлю gemini-3.5-transcribe
(Interactions API; запис довший за 1 год або порожня відповідь → запасний шлях через
gemini-flash-latest із промптом дослівної розшифровки) → Google Документ «— транскрипт»;
(2) конспект уже з цього тексту (gemini-flash-latest) → Google Документ «— конспект»,
тека перейменовується за темою. У теці зустрічі лишаються чотири файли: відео, аудіо,
транскрипт, конспект. Якщо копія аудіо в Gemini протухла (~48 год) до транскрипту — сам
перезаливає її з Drive.
Вартість кодування визначається пікселями за секунду, а не бітрейтом: 1080p30 удвічі дорожчий для CPU за 720p30, тоді як подвоєння бітрейта майже безкоштовне. Тому роздільність підбирається під машину, а бітрейт задається щедрий — саме він вирішує, чи буде читабельним дрібний текст на демонстрації екрана.
| Профіль | Роздільність | Бітрейт | Розмір | Потрібно в бенчі |
|---|---|---|---|---|
| 1080p | висота ≤1080 | 5 Мбіт/с | ≈2,2 ГБ/год | ≥90 к/с |
| 900p | висота ≤900 | 3,5 Мбіт/с | ≈1,6 ГБ/год | ≥55 к/с |
| 720p | висота ≤720 | 2,5 Мбіт/с | ≈1,1 ГБ/год | — |
Авто (типово). Одразу після діалогу «Поділитися» розширення ~0,7 с ганяє реальний бенч кодера (WebCodecs, VP8 1080p: прогрів + медіана трьох прогонів — один короткий прогін дає розкид у 3× і не годиться) і бере найвищий профіль із запасом ~3× до потрібних 30 к/с. Міряється поточне навантаження машини, бо саме воно, а не залізо, вирішує, чи будуть ривки: на вільному профілі Intel UHD 630 без апаратного кодера дає ~95–130 к/с (→ 1080p), на завантаженому — 25–55 (→ 900p/720p). У попапі можна натомість зафіксувати профіль вручну.
Під час запису. Раз на 10 с перевіряється videoTrack.stats: якщо джерело почало
викидати >12% кадрів (хтось навантажив CPU по ходу зустрічі), кадри/с знижуються
30 → 24 → 20 → 15, а після 3 хвилин без дропів повертаються назад. Роздільність при цьому
не чіпається — зміна розміру всередині webm ламає перемотку в багатьох плеєрах.
Усі рішення видно в логах попапа (Якість: …, Кадрів/с: 30 → 24 …).
Доріжці екрана ставиться contentHint = 'text' — підказка кодеру берегти різкі краї
(текст, лінії) коштом плавності руху. Звук у відео пишеться на 128 кбіт/с.
Радикальне покращення — увімкнути апаратне кодування (chrome://gpu має показувати
Video Encode: Hardware accelerated; на Linux — VAAPI). Тоді бенч одразу даватиме високі
значення й 1080p30 писатиметься без навантаження на CPU.
- Зайдіть у дзвінок Google Meet.
- Натисніть ● Запис (внизу екрана) → у діалозі «Поділитися» (галочка звуку вкладки за потреби).
- На іконці розширення — бейдж REC.
- Завершіть дзвінок — запис зупиниться сам і збережеться. (Також можна натиснути ■ Зупинити запис на кнопці у вікні Meet.)
- Файл
Meet <код> <дата>.webm— у теці «Завантаження» (або в Drive, якщо налаштовано).
Без цього файли зберігаються локально. Щоб писати прямо в Drive:
chrome://extensions→ увімкніть Режим розробника → Завантажити розпаковане → ця тека. Скопіюйте ID розширення.- console.cloud.google.com → створіть проєкт.
- APIs & Services → Library → увімкніть Google Drive API.
- OAuth consent screen → External → назва, email; scope
.../auth/drive.file; додайте себе в Test users. - Credentials → OAuth client ID → тип Chrome Extension → вставте ID розширення → скопіюйте Client ID.
- У
manifest.jsonзамінітьВАШ_CLIENT_ID.apps.googleusercontent.comна свій Client ID → ↻ на картці розширення.
Після цього запис автоматично йтиме в Drive (папка «Meeting Recordings»), а якщо вивантаження не вдасться — все одно збережеться локально.
Якщо вписати Gemini API-ключ — після кожного запису розширення надсилає відео в Gemini
і отримує конспект українською (короткий підсумок, ключові тези, ухвалені рішення,
завдання/дедлайни, відкриті питання). Конспект зберігається Google Документом
«Meet … — конспект» у теці тієї ж зустрічі (поряд із відео; або локально .txt, якщо Drive
недоступний).
Налаштування:
- aistudio.google.com/apikey → Create API key (можна в тому ж проєкті, що й для Drive).
- Відкрийте popup розширення → вставте ключ у поле «Gemini API-ключ» → «Зберегти ключ».
Приватність (важливо): на безкоштовному тарифі Gemini Google може використовувати надіслані аудіо/відео та відповіді для покращення своїх моделей. Для запису зустрічей, де можуть бути інші люди, це варто враховувати. Щоб цього уникнути — створіть ключ у проєкті з увімкненим білінгом (платний тариф) або використовуйте Vertex AI: на них дані для навчання не використовуються. Код розширення при цьому той самий — різниця лише в тарифі проєкту, у якому видано ключ.
Технічна примітка: надсилається саме відео (video/webm) з mediaResolution: LOW — бо
MediaRecorder дає webm/opus, який Gemini не приймає як чисте аудіо. Відео заливається в
Gemini Files API прямо з content script (де воно вже в пам'яті), а очікування обробки й
генерацію конспекту веде service worker фоново через chrome.alarms, тож вкладку Meet можна
закрити одразу. Низька роздільність кадрів тримає запит у межах лімітів навіть для довгих
зустрічей.
- Старт лише за кліком (Chrome не дозволяє почати захоплення без жесту користувача).
- Діалог «Поділитися» показується щоразу — це вимога Chrome для запису екрана/вкладки.
- Детекція кінця дзвінка спирається на URL/DOM Meet; за зміни верстки Google може
знадобитися правка в
content.js(на цей випадок є ручна зупинка). - Звук зустрічі пишеться лише якщо у вкладці реально щось звучить (інші учасники) і поставлено галочку «звук вкладки»; ваш голос іде з мікрофона.
Під час запису шматки відео щосекунди пишуться на диск у IndexedDB (а не лише в
пам'ять). Тож якщо вкладку чи браузер закрили, стався збій або вимкнулось світло — дані
не зникають. При наступному відкритті Google Meet з'являється банер «Незавершений запис
від …» з кнопками «Зберегти на Drive», «Завантажити» або відхилити. Збереження
завжди дає один .webm-файл (журнал — лише проміжне сховище). При раптовому вимкненні
живлення можна втратити щонайбільше останні ~1–2 секунди. Успішно збережені сесії
видаляються з диску автоматично; покинуті прибираються через 7 днів.