skillok meeting

README: описание продукта, интеграция с Zoom, архитектура и план работ

claude · 30 сентября 2026 г. e2fcdc42c9593a3de7005744bf0d949fd8d6484a
1 файл
  • README.md +217 −1
    Показать разницуСкрыть разницу
    1 −# README
    1 +# Skillok Meet
    2 2
    3 +Рабочее название. Продукт Skillok, адрес — `meet.skillok.org`.
    4 +
    5 +Приложение для встреч в Zoom. Само начинает запись, когда начинается конференция, по ходу
    6 +ведёт расшифровку, а после встречи собирает конспект, ревью, решения и задачи.
    7 +
    8 +Платформы: **Windows** и **Android**, плюс сервер.
    9 +
    10 +---
    11 +
    12 +## Что делает
    13 +
    14 +1. **Подключается к Zoom.** Два способа, см. «Интеграция с Zoom»:
    15 + - локально на Windows;
    16 + - через сервер Zoom (RTMS или облачная запись).
    17 +2. **Сам начинает запись**, как только стартует встреча. Кнопку жать не нужно.
    18 +3. **Ведёт расшифровку по ходу встречи.** Реплики подписаны именами участников из Zoom.
    19 + Живой конспект обновляется раз в несколько минут.
    20 +4. **Разбирает встречу после её окончания:**
    21 + - краткое содержание;
    22 + - ревью встречи: чего достигли, что осталось открытым, где ушли в сторону;
    23 + - решения;
    24 + - задачи с исполнителем и сроком, если они прозвучали;
    25 + - вопросы на следующую встречу.
    26 +
    27 + Задачи можно выгрузить. Выгрузка в трекеры — на следующих этапах.
    28 +
    29 +---
    30 +
    31 +## Интеграция с Zoom: что возможно и где ограничения
    32 +
    33 +Всё, что сказано ниже про Zoom и платформы, подтверждено документацией. Ссылки — в каждом пункте.
    34 +
    35 +### Выбранная схема — гибрид
    36 +
    37 +| Путь | Стартует сам | В реальном времени | Где работает | Что нужно от пользователя |
    38 +|---|---|---|---|---|
    39 +| **A. Локальный захват на Windows** (MVP) | да | да | любая встреча, в том числе чужая | ничего от Zoom |
    40 +| **B. RTMS** (этап 2) | да | да: звук и транскрипт Zoom | встречи, где хост разрешил наше приложение | авторизация приложения; кредиты Zoom Developer Pack |
    41 +| **C. Облачная запись** (запасной путь) | да, через «автозапись» | **нет**: после встречи | встречи наших пользователей-хостов | план Pro или выше, включены облачная запись и транскрипция |
    42 +
    43 +#### A. Локальный захват на Windows
    44 +
    45 +- Звук берём только от процесса Zoom (process loopback) и отдельно с микрофона.
    46 + Системные звуки и музыка в запись не попадают.
    47 + См. [Application loopback sample](https://learn.microsoft.com/en-us/samples/microsoft/windows-classic-samples/applicationloopbackaudio-sample/)
    48 + и [ActivateAudioInterfaceAsync](https://learn.microsoft.com/en-us/windows/win32/api/mmdeviceapi/nf-mmdeviceapi-activateaudiointerfaceasync).
    49 + Нужна Windows 10 сборки 20438 или новее.
    50 +- Начало встречи определяем по появлению звуковой сессии процесса Zoom и окна встречи.
    51 +- API Zoom и одобрение в Marketplace не нужны.
    52 +- **Минус:** Zoom участникам ничего не показывает. Предупреждать их обязан пользователь,
    53 + см. «Согласие на запись».
    54 +
    55 +#### Android: локальный захват невозможен
    56 +
    57 +- Android даёт захватить чужой звук, только если он помечен как `USAGE_MEDIA`, `USAGE_GAME`
    58 + или `USAGE_UNKNOWN`. Голос в звонке помечен как голосовая связь и не захватывается
    59 + ([AudioPlaybackCaptureConfiguration](https://developer.android.com/reference/android/media/AudioPlaybackCaptureConfiguration)).
    60 +- Микрофон тоже не выход: пока идёт голосовая связь (`VOICE_COMMUNICATION`), другие
    61 + приложения получают тишину
    62 + ([Sharing audio input](https://developer.android.com/media/platform/sharing-audio-input)).
    63 +- Поэтому на Android встречи в Zoom записываются **только через сервер**: путь B или C.
    64 + Локально на Android — только очные встречи через микрофон.
    65 +
    66 +#### B. RTMS (Realtime Media Streams)
    67 +
    68 +- Даёт живой звук по дорожкам, видео и транскрипт с разметкой: кто, что и когда сказал
    69 + ([обзор RTMS](https://developers.zoom.us/docs/rtms/meetings/)).
    70 +- Поток стартует тремя способами: автоматически, когда пользователь входит на встречу
    71 + или запускает её; вызовом REST API; из Zoom App
    72 + ([Getting started](https://developers.zoom.us/docs/rtms/meetings/getting-started/)).
    73 +- Нужны кредиты Zoom Developer Pack. На форуме Zoom называют $0,01 за минуту потока
    74 + без транскрипта ([devforum](https://devforum.zoom.us/t/rtms-developer-pack-pricing-for-business-account/144203)).
    75 + Точную цену сверить в продаже Zoom.
    76 +- Участники видят значок Active Apps Notifier: какое приложение и к чему получает доступ
    77 + ([Zoom Library](https://library.zoom.com/zoom-workplace/zoom-meetings/securing-zoom-meetings-explainer/zoom-realtime-media-streams)).
    78 +- Устройство участника неважно: поток идёт с сервера Zoom на наш. Поэтому путь B
    79 + закрывает Android.
    80 +- SDK: [zoom/rtms](https://github.com/zoom/rtms).
    81 +
    82 +#### C. Облачная запись и вебхуки
    83 +
    84 +- Автозапись в облако включается в настройках
    85 + ([KB0067954](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0067954)).
    86 +- Транскрипт: план Pro, Business, Education или Enterprise, и в настройках включён
    87 + «Create audio transcript»
    88 + ([KB0065911](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0065911)).
    89 +- О готовности сообщают вебхуки `recording.completed` и `recording.transcript_completed`.
    90 + Файл транскрипта имеет `file_type: TRANSCRIPT`, нужен scope `recording:read`
    91 + ([Cloud recording](https://developers.zoom.us/docs/build/cloud-recording/)).
    92 +
    93 +#### Почему не бот на Meeting SDK
    94 +
    95 +- С 2 марта 2026 на встречах чужих аккаунтов нужен токен OBF. Бот не войдёт, пока на встрече
    96 + нет авторизовавшего его пользователя, и выйдет вместе с ним. Для непрерывной записи
    97 + Zoom сам советует RTMS
    98 + ([OBF FAQ](https://developers.zoom.us/docs/meeting-sdk/obf-faq/)).
    99 +- Чтобы получать звук, боту нужно разрешение хоста на запись. Для внешних пользователей —
    100 + ещё и ревью в Marketplace. Выходит самый тяжёлый путь при тех же возможностях, что у RTMS.
    101 +
    102 +---
    103 +
    104 +## Согласие на запись
    105 +
    106 +- **РФ, 152-ФЗ.** Голос — персональные данные, тайная запись запрещена. Если голос
    107 + используется для узнавания человека, это биометрия, и нужно письменное согласие
    108 + ([Консультант](https://www.consultant.ru/law/podborki/zapis_telefonnogo_razgovora_personalnye_dannye/)).
    109 + Поэтому разметку «кто говорит» берём **только из имён Zoom**, отпечатки голоса не строим.
    110 +- **ЕС (GDPR)** требует законного основания и уведомления. В ряде штатов США нужно
    111 + согласие всех сторон.
    112 +- **Что для этого делает продукт:**
    113 + - перед записью показывает пользователю готовый текст объявления для участников;
    114 + - в режиме A запись не стартует без отметки «участники предупреждены»,
    115 + отметку можно поставить заранее;
    116 + - сохраняет, когда и кем было дано уведомление;
    117 + - звук по умолчанию удаляется после расшифровки.
    118 +
    119 +---
    120 +
    121 +## Расшифровка и разбор
    122 +
    123 +**Распознавание речи**
    124 +
    125 +- По умолчанию — Whisper large-v3 на своём сервере: хорошо знает русский, звук не уходит
    126 + третьим лицам.
    127 +- Для хранения данных в РФ — Yandex SpeechKit как запасной провайдер.
    128 +- В режиме B можно взять транскрипт Zoom вместо своего распознавания.
    129 +
    130 +**Разбор на Claude** (Anthropic API)
    131 +
    132 +| Задача | Модель | Цена, вход / выход за 1M токенов |
    133 +|---|---|---|
    134 +| Живой конспект раз в несколько минут | `claude-haiku-4-5` | $1 / $5 |
    135 +| Итоговое ревью, решения, задачи | `claude-opus-5-5` | $4 / $20 |
    136 +
    137 +- Часовая встреча — это примерно 25 тыс. токенов, то есть порядка $0,15 на итоговый разбор.
    138 +- Результат — JSON строго по схеме (structured outputs): `summary`, `review`, `decisions[]`,
    139 + `tasks[]` (текст, исполнитель, срок, цитата-основание), `open_questions[]`.
    140 +- У каждой задачи есть ссылка на момент расшифровки, где она прозвучала.
    141 +
    142 +---
    143 +
    144 +## Архитектура
    145 +
    146 +```
    147 + Windows (Flutter + C++/WASAPI) ──┐
    148 + ├──► Сервер (Rust) ──► распознавание (Whisper) ──► Claude
    149 + Android (Flutter + Kotlin) ──────┘ ▲
    150 + │ вебхуки, RTMS
    151 + Zoom
    152 +```
    153 +
    154 +**Клиент — один код на Flutter для Windows и Android.**
    155 +
    156 +- Захват звука в любом случае пишется нативно: на Windows — C++ (WASAPI), на Android —
    157 + Kotlin (микрофон для очных встреч). Flutter даёт общий интерфейс поверх этого.
    158 +- .NET MAUI на Windows слабее, у Kotlin Multiplatform интерфейс под Windows ещё сырой.
    159 +
    160 +**Сервер (Rust)**
    161 +
    162 +- Приём звука от клиентов и живая расшифровка.
    163 +- Вебхуки Zoom, OAuth-приложение Zoom, приём RTMS. Для RTMS на старте можно поставить
    164 + рядом сервис на официальном SDK Node.js.
    165 +- Распознавание речи, вызовы Claude, хранение встреч.
    166 +- Вход через аккаунт Skillok.
    167 +
    168 +**Хранение**
    169 +
    170 +- Расшифровки и разборы — в Postgres.
    171 +- Звук удаляется после расшифровки. Хранить его можно только с явного включения.
    172 +
    173 +---
    174 +
    175 +## План работ
    176 +
    177 +### Этап 0. Каркас
    178 +
    179 +- [ ] Монорепозиторий: `app/` (Flutter), `server/` (Rust), `docs/`.
    180 +- [ ] Вход через аккаунт Skillok, список встреч.
    181 +- [ ] Схема разбора (JSON) и промпты с набором проверочных расшифровок.
    182 +
    183 +### Этап 1. MVP — Windows, локальный захват
    184 +
    185 +- [ ] Нативный модуль захвата: звук процесса Zoom и микрофон, две дорожки.
    186 +- [ ] Автостарт при начале встречи и остановка в конце. Иконка в трее.
    187 +- [ ] Экран согласия и текст объявления для участников.
    188 +- [ ] Потоковая отправка на сервер, живая расшифровка в окне.
    189 +- [ ] Живой конспект (Haiku) и итоговый разбор (Opus): ревью, решения, задачи.
    190 +- [ ] Android: просмотр встреч и разборов, запись очной встречи с микрофона.
    191 +
    192 +### Этап 2. RTMS — запись без десктопа, в том числе с Android
    193 +
    194 +- [ ] Приложение Zoom (OAuth), подписка на `meeting.rtms_started` и `meeting.rtms_stopped`.
    195 +- [ ] Приём потока и транскрипта Zoom, та же цепочка разбора.
    196 +- [ ] Автостарт для встреч, где хост — наш пользователь.
    197 +- [ ] Учёт минут и расходов Developer Pack.
    198 +
    199 +### Этап 3. Облачная запись как запасной путь
    200 +
    201 +- [ ] Вебхуки `recording.completed` и `recording.transcript_completed`.
    202 +- [ ] Разбор после встречи для тех, у кого нет RTMS.
    203 +
    204 +### Дальше
    205 +
    206 +- [ ] Выгрузка задач: трекер задач Skillok, календарь, почта.
    207 +- [ ] Поиск по всем встречам и вопросы к архиву.
    208 +- [ ] Шаблоны разбора: планёрка, собеседование, встреча с клиентом.
    209 +- [ ] Ревью Zoom Marketplace — для пользователей из других аккаунтов Zoom.
    210 +
    211 +---
    212 +
    213 +## Что должен сделать владелец
    214 +
    215 +- Создать приложение в Zoom App Marketplace (General App) и выдать ключи.
    216 +- Решить вопрос с кредитами Developer Pack для RTMS.
    217 +- Выдать ключ Anthropic API.
    218 +- Утвердить название и настроить адрес `meet.skillok.org`.