skillok meeting
169ce64e1705fd64e48ee357a816bbdb90bab01d
Перейти к файлу
Код
meeting README.md
anc Этап 1: запись встречи в Zoom, живая расшифровка и разбор - crates/audio: захват звука процесса Zoom и микрофона (WASAPI, process loopback), формат 16 кГц моно, нарезка на куски по паузам с отсевом тишины, распознавание начала и конца встречи по звуковой сессии Zoom. - Ядро: запись двух дорожек → Whisper через OpenRouter → расшифровка, живой конспект раз в три минуты, по окончании — разбор сам; звук удаляется после разбора, если не включено хранение. - Контроллер: слежу за Zoom → прошу предупредить участников → пишу; запись вручную, пауза, стоп; прерванная запись помечается при запуске. - Трей, уведомления, крестик прячет окно, запуск вместе с Windows. - Интерфейс: главный экран с карточкой состояния (задача #1), живая расшифровка и конспект на экране встречи, новые настройки. - reqwest на системном TLS: под Windows без C-кода ring. - 67 тестов; код под Windows проверен компиляцией и clippy с Mac, на Windows не запускался. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> 169ce64 30 сентября 2026 г.
README.md

Skillok Meet#

Рабочее название. Продукт Skillok.

Программа для Windows, которая работает на компьютере пользователя. Сама включает запись,
когда начинается встреча в Zoom, по ходу ведёт расшифровку, а после встречи делает
конспект, ревью, решения и задачи. Итог можно сохранить в свой репозиторий на skillok.org.

Нашего сервера нет. Пользователь вводит свой ключ OpenRouter — и всё. Звук и
расшифровки лежат у него на диске. Наружу уходят только запросы к моделям по его
собственному ключу.


Что делает#

  1. Замечает, что началась встреча в Zoom, и включает запись. Кнопку жать не нужно.
  2. Ведёт расшифровку по ходу встречи. Реплики разделены на «я» (микрофон) и
    «собеседники» (звук Zoom).
  3. Каждые несколько минут обновляет живой конспект.
  4. После встречи делает разбор:
    • краткое содержание;
    • ревью встречи: чего достигли, что осталось открытым, где ушли в сторону;
    • решения;
    • задачи с исполнителем и сроком, если они прозвучали;
    • вопросы на следующую встречу.
  5. Сохраняет итог в репозиторий на skillok.org — одним нажатием или автоматически.

Как это работает#

 Zoom.exe ──звук──┐
                  ├─► захват (WASAPI) ─► куски 6–28 с ──► OpenRouter: Whisper ─► расшифровка
 микрофон ────────┘                                                                  │
                                                                                     ▼
                                              OpenRouter: Claude ◄── конспект / разбор
                                                                                     │
                                          диск пользователя ◄─────────────────────────┤
                                          skillok.org (репозиторий) ◄── по желанию ───┘

Захват звука Zoom#

  • Звук берём только от процесса Zoom (process loopback) и отдельно с микрофона.
    Системные звуки и музыка в запись не попадают.
    См. Application loopback sample
    и ActivateAudioInterfaceAsync.
    Нужна Windows 10 сборки 20438 или новее.
  • Встреча идёт, пока у Zoom.exe есть активная звуковая сессия вывода: во время встречи Zoom
    держит поток открытым, даже когда все молчат. Началом считаем 4 секунды такой сессии
    (звук уведомления — не встреча), концом — 20 секунд без неё (переподключение не рвёт запись).
  • API Zoom, аккаунт разработчика и одобрение в Marketplace не нужны. Работает на любой
    встрече и на любом плане Zoom, в том числе бесплатном и на чужой встрече.

Расшифровка — Whisper через OpenRouter#

  • Эндпоинт POST https://openrouter.ai/api/v1/audio/transcriptions, тот же ключ, что для
    текстовых моделей. Модели: openai/whisper-large-v3-turbo (по умолчанию),
    openai/whisper-large-v3, openai/whisper-1.
    См. документацию OpenRouter STT.
  • Эндпоинт принимает файл целиком, потокового режима нет. Поэтому звук режем на куски
    от 6 до 28 секунд по паузам в речи, куски без речи не отправляем. Расшифровка отстаёт от живой речи на длину куска
    плюс время ответа.
  • Дорожки «я» и «собеседники» распознаём раздельно. Так реплики подписаны без узнавания
    людей по голосу.

Разбор — Claude через OpenRouter#

Задача Модель по умолчанию Когда
Живой конспект Claude Haiku 4.5 каждые несколько минут
Итоговый разбор: ревью, решения, задачи Claude Opus 5.5 после встречи
  • Модели можно поменять в настройках на любую из доступных в OpenRouter.
  • Разбор приходит JSON строго по схеме: summary, review, decisions[],
    tasks[] (текст, исполнитель, срок, цитата-основание), open_questions[].
    Из JSON программа собирает Markdown.
  • У каждой задачи есть ссылка на момент расшифровки, где она прозвучала.

Сохранение в репозиторий Skillok#

  • Пользователь создаёт токен доступа на skillok.org (Settings → Access tokens)
    и выбирает репозиторий.

  • Программа кладёт файлы через API Skillok:

    • POST /api/v1/repositories/{id}/files — создать файл;
    • PUT /api/v1/repositories/{id}/files/{path} — обновить файл;
    • заголовок Authorization: Bearer <токен>.
  • Раскладка в репозитории:

    meetings/2026-10-01-планёрка/
      summary.md      — конспект, ревью, решения, задачи
      transcript.md   — расшифровка с временем
    
  • Звук в репозиторий не уходит.


Интерфейс — как у skillok.org#

Та же система, что на skillok.org:

  • бумажный фон, чернильный текст, терракотовый акцент;
  • шрифт iA Writer Quattro S, JetBrains Mono только для кода и времени в расшифровке;
  • кегль только из шкалы, не меньше 12px;
  • квадратные углы;
  • кнопки контурные, без заливки.

Токены стиля берём из дизайн-системы Skillok, новых цветов не заводим.

Экраны:

  • Встречи — список: дата, длительность, статус разбора.
  • Встреча — вкладки «Расшифровка», «Конспект», «Задачи», кнопка «Сохранить в Skillok».
  • Идёт запись — маленькое окно или значок в трее: время, уровень звука, стоп и пауза.
  • Настройки:
    • ключ OpenRouter;
    • модели;
    • папка хранения;
    • токен Skillok и репозиторий;
    • автосохранение;
    • текст предупреждения участникам.

Стек#

Tauri 2: ядро на Rust, интерфейс на HTML/CSS/TS.

  • Интерфейс в HTML/CSS — поэтому стиль skillok.org переносится один в один.
  • Ядро на Rust:
    • захват звука через крейт windows (WASAPI, process loopback);
    • разбивка звука на куски по паузам в речи;
    • запросы к OpenRouter и Skillok.
  • Небольшой установщик, есть автообновление.
  • Tauri 2 умеет Android — пригодится, если вернёмся к нему.

Хранение

  • Каждая встреча — отдельная папка: расшифровка, разбор и звук.
  • Звук по умолчанию удаляется после разбора.
  • Ключи лежат в Windows Credential Manager, не в файлах.

Согласие на запись#

Zoom не показывает участникам, что идёт такая запись. Предупреждать их обязан
пользователь.

  • РФ, 152-ФЗ. Голос — персональные данные, тайная запись запрещена. Если голос
    используется для узнавания человека, это биометрия, и нужно письменное согласие
    (Консультант).
    Поэтому отпечатки голоса мы не строим.
  • ЕС (GDPR) требует уведомления. В ряде штатов США нужно согласие всех сторон.
  • Что делает программа:
    • при старте записи показывает текст предупреждения, который можно скопировать
      в чат Zoom;
    • запись идёт только после отметки «участники предупреждены»; можно поставить
      «предупреждаю всегда сам».

Почему не через API Zoom#

Проверено и отложено:

  • RTMS (живой поток от Zoom): нужен сервер, который принимает поток, и кредиты
    Zoom Developer Pack (RTMS).
  • Облачная запись: план Pro или выше, только встречи, где пользователь хост,
    расшифровка — после встречи
    (KB0065911).
  • Бот на Meeting SDK: с 2 марта 2026 на встречах чужих аккаунтов нужен токен OBF,
    плюс ревью в Marketplace (OBF FAQ).

Android — позже#

Звук Zoom на Android локально не захватить. Системный захват не берёт голосовую связь
(AudioPlaybackCaptureConfiguration),
а микрофон во время звонка отдаёт другим приложениям тишину
(Sharing audio input).

Возможные пути на будущее:

  • очные встречи через микрофон;
  • облачная запись Zoom после встречи;
  • импорт файла.

Разработка#

Нужны Rust (stable) и Node.js. На Windows ещё WebView2 — он уже есть в Windows 10/11.

npm install
npm run tauri dev      # приложение целиком: ядро + интерфейс
npm run dev            # только интерфейс в браузере, http://localhost:1420, с заглушкой ядра
npm run typecheck      # проверка типов интерфейса
cargo test --workspace # тесты ядра и звука

Запись Zoom работает только в Windows. Проверить цепочку «звук → куски → распознавание →
расшифровка» на другой машине можно файлом: MEET_DEV_REPLAY=путь.wav npm run tauri dev
(WAV 16 кГц, моно, 16 бит) — он играет роль звука собеседников, «Записать вручную» его запускает.
Нужен настоящий ключ OpenRouter: распознавание платное.

В браузере заглушка изображает и запись. Ручки в консоли:
__meetMock.meetingStarted(), __meetMock.meetingEnded(), __meetMock.noKey(), __meetMock.unsupported().

Код под Windows проверяется с Mac так (нужен rustup target add x86_64-pc-windows-msvc):

cargo clippy -p meet-audio --target x86_64-pc-windows-msvc --all-targets

Всё приложение под Windows с Mac не собрать: встраиванию ресурсов Windows нужен llvm-rc.
Собирать установщик — на Windows: npm run tauri build.

Раскладка:

src/                 интерфейс: HTML/CSS/TS, стиль skillok.org (src/styles/tokens.css)
src/dev-mock.ts      заглушка ядра — только для `npm run dev` в браузере
crates/audio/        звук, без Tauri
  pcm.rs             формат 16 кГц моно 16 бит, WAV, уровень
  chunker.rs         нарезка на куски по паузам, отсев тишины
  detector.rs        когда встреча в Zoom началась и кончилась
  source.rs          источник звука; Replay — звук из памяти для тестов
  win.rs             Windows: захват процесса Zoom и микрофона, поиск сессии Zoom
src-tauri/src/       ядро на Rust
  transcript.rs      реплики, импорт текста, Markdown расшифровки
  analysis.rs        схема разбора, проверка ответа модели, summary.md
  openrouter.rs      клиент OpenRouter: ключ, распознавание, живой конспект, разбор
  recorder.rs        запись встречи: дорожки → куски → распознавание → расшифровка
  controller.rs      что программа делает сама: следит за Zoom, согласие, запись, разбор
  shell.rs           окно, трей, уведомления, автозапуск
  settings.rs        настройки; ключ — в хранилище паролей ОС (keyring)
  meetings.rs        встречи на диске, папка на встречу
  commands.rs        команды для интерфейса
prompts/             системные промпты разбора и живого конспекта
fixtures/transcripts проверочные расшифровки

Данные приложения: настройки — в папке конфигурации (%APPDATA%\org.skillok.meet на Windows),
встречи — в папке данных, подпапка meetings. Путь виден на экране «Настройки».


План работ#

Этап 0. Каркас#

  • Проект Tauri 2, стиль skillok.org, экраны «Встречи», «Встреча», «Настройки».
  • Ключ OpenRouter в хранилище паролей ОС (keyring), проверка ключа через GET /key.
  • Схема разбора (JSON), промпт prompts/analysis.md, проверочные расшифровки fixtures/transcripts/.
  • Импорт текста расшифровки и разбор по кнопке — вся цепочка разбора без захвата звука.
  • Прогнать разбор на проверочных расшифровках настоящей моделью и поправить промпт (нужен ключ).
  • Проверить хранилище ключа и окно на Windows.

Этап 1. MVP#

  • Захват звука Zoom.exe и микрофона на две дорожки.
  • Автостарт и автостоп по встрече в Zoom, значок в трее.
  • Предупреждение участникам и отметка «предупреждены».
  • Куски по паузам → Whisper через OpenRouter → живая расшифровка.
  • Живой конспект и итоговый разбор через Claude.
  • Сохранение встречи на диск, экспорт в Markdown.
  • Проверить на Windows с настоящей встречей в Zoom — код под Windows только
    скомпилирован с Mac, ни разу не запускался.
  • Распознать заново из сохранённого звука, если кусок не распознался или разбор упал.

Этап 2. Skillok#

  • Токен Skillok, выбор репозитория.
  • Сохранение summary.md и transcript.md через API файлов, автосохранение.
  • Задачи из разбора — в трекер задач репозитория.

Дальше#

  • Поиск по встречам и вопросы к архиву.
  • Шаблоны разбора: планёрка, собеседование, встреча с клиентом.
  • Другие программы для встреч (Teams, Meet в браузере) — тот же захват по процессу.
  • Android.