README: описание продукта, интеграция с Zoom, архитектура и план работ
Родитель:
b50d906
· сравнить с родителем
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`.