AI Протоколист
Локальное приложение, которое записывает системный звук встречи Teams (или берёт загруженный файл), показывает живой транскрипт, выделяет поручения…
О проекте
Команда: rA9
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Локальное приложение, которое записывает системный звук встречи Teams (или берёт загруженный файл), показывает живой транскрипт, выделяет поручения и формирует саммари и DOCX.
Как устроено
PyAudioWPatch/WASAPI loopback захватывает звук устройства вывода Windows и режет на 5-секундные WAV-фрагменты, которые распознаются faster-whisper base на CPU/int8 и стримятся в UI. После остановки полная запись проходит диаризацию pyannote Community-1, поручения извлекаются правилами для русского и казахского, саммари — отбором значимых фраз, экспорт в transcript.txt и DOCX через python-docx. Оператор вручную сопоставляет спикеров с именами, после чего пересчитываются ответственные.
Ключевые решения
- faster-whisper
- pyannote Community-1 diarization
- WASAPI loopback capture
- chunked streaming transcription
- rule-based action extraction
- extractive summary
Особенности
Захват реальной встречи Teams: бот-аккаунт «AI Протоколист» входит гостем, звук берётся через WASAPI loopback, транскрипт появляется во время звонка; облачных API нет — соответствует требованию закрытого контура.
Стек
Python · FastAPI · PyAudioWPatch · python-docx · HTML/CSS/JS
Модели
faster-whisper base · pyannote Community-1
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-f2ece5dd-ra9.
README
README.mdAI Протоколист — команда rA9
Проект для хакатона HackAlem AI по кейсу «Система автопротоколирования совещаний с фиксацией поручений».
Приложение должно записывать звук совещания, распознавать реплики участников и формировать протокол с поручениями, ответственными и сроками. Цель — сократить ручную работу секретаря и уменьшить риск потери договорённостей.
Текущий статус
Реализованы локальный интерфейс на HTML/CSS/JavaScript, backend записи на Python/FastAPI и отображение живого транскрипта. Запись системного звука Windows через WASAPI проверена командой в тестовой встрече Teams. faster-whisper base/CPU распознаёт новые WAV-фрагменты. После окончания записи формируются поручения, краткие итоги и DOCX. Можно также загрузить готовое аудио для локальной обработки.
Добавлено подключение локальной диаризации pyannote Community-1 по полной записи. Для неё нужно отдельно принять условия модели и скачать веса: инструкция установки и проверки. Пока веса не настроены, результат честно показывает неизвестных говорящих. Реальная диаризация, качество казахского/смешанного аудио и полный сценарий браузера ещё требуют проверки на ноутбуке; наличие кода не означает прохождения этих проверок.
В интерфейсе доступны:
- Ввод названия встречи, открытие ссылки Teams в гостевом окне Edge/Chrome и выбор устройства воспроизведения Windows. Ввод имени, вход и ожидание допуска выполняет оператор; открытое окно не означает успешное подключение.
- Начало и остановка реальной записи, индикатор уровня звука, сохранение WAV и пятисекундных WAV-фрагментов для будущего распознавания.
- Список локальных записей, прослушивание и скачивание полной записи после остановки.
- Сценарий Zoom использует тот же захват звука, но требует ручного входа и пока отдельно не проверен.
- Воспроизведение вымышленного примера: шесть реплик, три говорящих и три заранее заданных поручения.
- Редактирование имён участников с обновлением транскрипта и ответственных; отметка проверки поручений.
- Экспорт демонстрационного транскрипта в TXT и структурированных результатов в JSON. Файлы явно помечены как демонстрационные.
- Выбор локального аудиофайла, отображение имени, размера и длительности, встроенное прослушивание. Поддерживаемые расширения: MP3, WAV, M4A, OGG, OPUS, FLAC, WebM; предел размера — 200 МБ. Возможность прослушивания зависит от кодеков браузера.
- Адаптивная компоновка для широкого и узкого экрана.
При выборе настоящего файла вымышленные результаты очищаются. Кнопка распознавания передаёт файл локальному backend, который сохраняет его в sessions/ и выполняет обработку. Аудио и текст во внешние облачные API не отправляются.
Реплики доступны по /api/sessions/{id}/transcript, исходный текст — по /api/sessions/{id}/transcript.txt, итог — по /api/sessions/{id}/result, DOCX — по /api/sessions/{id}/protocol.docx. В итогах оператор сопоставляет голоса с именами; связь пересчитывается в поручениях. Саммари использует отбор значимых фраз и задач, анализатор основан на правилах и может ошибаться. Полные итоги и разделение голосов доступны после завершения обработки, а не во время звонка. WAV, транскрипты и результаты сохраняются в sessions/. Закрытие вкладки не останавливает запись: нажмите «Остановить и сохранить» перед выходом.
Следующие разделы описывают целевой MVP. По ТЗ обработка аудио/текста во внешних облачных API запрещена. Интернет используется только при установке зависимостей и скачивании весов; перед автономным демо обе модели нужно загрузить заранее.
Планируемый сценарий
- Оператор вручную входит во встречу отдельным аккаунтом «AI Протоколист» на компьютере с Windows. Микрофон этого аккаунта выключен, участники уведомлены о записи и обработке речи.
- В локальном интерфейсе оператор выбирает устройство воспроизведения и начинает запись системного звука.
- Приложение обрабатывает поступающий звук фрагментами и постепенно показывает транскрипт с таймкодами и обозначениями говорящих.
- Из транскрипта извлекаются поручения и обновляются предварительные итоги.
- После завершения записи приложение обрабатывает оставшееся аудио и формирует два итоговых файла.
Основная платформа демонстрации — Microsoft Teams. Совместимость с Zoom планируется проверить отдельно. Захват звука должен работать через устройство вывода Windows; автоматическое подключение бота по ссылке встречи в MVP не входит.
Планируемые функции MVP
- Запуск и остановка записи, выбор источника и индикатор поступления звука.
- Распознавание русского, казахского и смешанной русско-казахской речи.
- Разделение говорящих: «Спикер 1», «Спикер 2» и далее, с возможностью вручную сопоставить обозначения с именами.
- Транскрипт с таймкодами, пополняемый во время встречи.
- Извлечение поручений: содержание задачи, ответственный, срок и подтверждающая цитата из транскрипта.
- Отметка «не указан», если исполнитель или срок не названы; неоднозначные поручения требуют проверки оператором.
- Предварительное саммари во время встречи и итоговое саммари после её завершения.
- Сохранение промежуточных результатов в локальную папку совещания.
- Экспорт исходного результата распознавания в
transcript.txtи итогового протокола вsummary.docx.
summary.docx должен содержать краткие итоги и таблицу поручений. Транскрипт сохраняется без редакторского пересказа, но может содержать ошибки распознавания.
Архитектура и технологии
Планируемая цепочка обработки:
Звук Teams / Zoom → захват Windows → распознавание и диаризация
→ транскрипт → извлечение поручений и саммари → TXT / DOCX
- Python — обработка аудио, взаимодействие с моделями и экспорт документов.
- Локальный веб-интерфейс — управление записью и просмотр результатов.
- FastAPI и PyAudioWPatch / WASAPI loopback — реализованные API и захват звука Windows. Контракт распознавания и получения реплик UI описан в backend/TRANSCRIPTION_CONTRACT.md.
- Диаризация — локальный pyannote Community-1; извлечение поручений — правила русского и казахского языка; краткие итоги — локальный отбор фраз; DOCX — python-docx. Облачного провайдера нет.
- Локальное распознавание — faster-whisper 1.2.1, модель base, CPU/int8. Первый запуск скачивает модель в
models/; следующие фрагменты используют уже загруженную модель. НастройкиWHISPER_MODELиWHISPER_DEVICEзадаются переменными окружения перед запуском сервера. - Локальные JSON-файлы — хранение структурированных результатов. База данных и регистрация пользователей для MVP не нужны.
Адрес сервиса и названия моделей будут задаваться в конфигурации. Секретные API-ключи не должны попадать в Git, README, демонстрационные материалы или журналы приложения.
Ограничения и открытые вопросы
- Live-обработка означает последовательную обработку поступающего звука с задержкой. Фактическая задержка и способность работать без накопления очереди пока не измерены.
- Качество казахской и смешанной речи, разделение голосов и устойчивость обозначений спикеров между фрагментами требуют проверки на тестовых записях.
- Диаризация отделяет голоса друг от друга, но сама по себе не устанавливает имена и должности людей.
- Системный захват может включать посторонние звуки выбранного устройства. Для демо следует отключить уведомления и другие источники воспроизведения.
- Звук локального микрофона не гарантируется системным захватом. Для основного сценария используется отдельный аккаунт слушателя, получающий речь остальных участников через встречу.
- В исходном документе кейса предусмотрен закрытый контур. Использование внешнего API рассматривается на основании сообщённого командой разрешения организаторов; применимость разрешения к GPT Sandbox нужно уточнить до отправки туда записей.
В MVP не входят определение руководителя по тону, автоматический вход во встречи, напоминания о сроках, рассылка поручений, интеграция с СЭД, история с поиском и промышленное развёртывание.
Тестовые материалы
В папке Assets/ находятся:
Совещание №1.mp3иСовещание №2.mp3— тестовые аудиозаписи.Протокол_совещания№1.docxиПротокол_совещания№2.docx— предоставленные командой документы для сверки результатов.
Эталонные документы используются для оценки качества, а не для подстановки заранее подготовленных ответов. Реальные записи должны быть анонимизированы перед публичной демонстрацией.
Запуск
Нужны Windows, Python 3.11+ x64 и устройство вывода звука. Проверено на Python 3.14.6. API-ключи для записи не требуются. Для гостевого Teams нужны Edge или Chrome; организатор должен разрешить вход гостям.
Первый запуск из терминала в корне репозитория:
.\setup.cmd
.\start-ui.cmd
Откройте http://127.0.0.1:8765. Сервер доступен только на этом компьютере и обслуживает папку ui, а не весь репозиторий. Для остановки нажмите Ctrl+C в терминале. Если порт занят, завершите предыдущий экземпляр сервера либо используйте другой порт:
.venv\Scripts\python.exe -m backend --port 8766
Для записи вставьте ссылку Teams и нажмите «Открыть Teams гостем». В открывшемся окне выберите вход через браузер, укажите имя «AI Протоколист», выключите микрофон и камеру, дождитесь допуска. В приложении выберите то же устройство вывода, которое использует Teams, подтвердите готовность источника и уведомление участников, затем нажмите «Начать запись». После встречи нажмите «Остановить и сохранить» и скачайте WAV из списка записей. Для проверки системного захвата можно воспроизвести тестовую запись через локальный плеер.
Захватываются все звуки выбранных динамиков/наушников. Локальный микрофон не включён в запись. Для записи своего выступления используйте отдельный компьютер гостя. Приложение не узнаёт о завершении встречи автоматически: остановка записи выполняется оператором.
Для просмотра вымышленного примера раскройте соответствующий раздел и нажмите «Запустить пример». Для проверки настоящего аудиофайла нажмите «Загрузить аудиофайл», выберите запись и запустите распознавание. Дождитесь итогов, сохраните имена говорящих и скачайте DOCX. Для старых сессий без result.json загрузите сохранённый WAV повторно.
Не запускайте старый python -m http.server: он не обслуживает backend API. Открытие ui/index.html напрямую также не запускает запись. OpenAPI и описание методов доступны по /docs работающего backend.
23 сентября 2026 года проверена запись тестовой встречи Teams: 114.73 секунды, 48 кГц, stereo PCM16 и 23 фрагмента. Объединённые фрагменты точно совпадают с полной записью; обнаружен ненулевой звуковой сигнал, ошибок завершения нет. Проходят 27 тестов. На первых 20 секундах тестового MP3 проверена настоящая модель: первый фрагмент вместе с загрузкой модели занял 20.7 с, следующие пятисекундные фрагменты — 1.61–1.76 с каждый. Это короткая проверка работоспособности, а не оценка качества всей записи. Проверка live-распознавания в Teams, диаризации и Zoom остаётся отдельной задачей.
План проверки перед демонстрацией
- Проверить распознавание на обеих тестовых записях и сопоставить поручения с эталонными документами.
- Отдельно проверить русский, казахский и смешанную речь.
- Проверить разделение голосов и привязку поручений к исполнителям.
- Провести live-проверку в Teams и отдельную проверку в Zoom.
- Измерить задержку и убедиться, что обработка успевает за поступающим звуком.
- Проверить отсутствие выдуманных исполнителей и сроков.
- Открыть итоговые TXT и DOCX и проверить полноту и читаемость результатов.
- Проверить обработку отсутствия звука, ошибок API и завершения записи.
- Проверить запуск по README, зависимости и отсутствие секретов в репозитории.
Актуализация документации перед сдачей
После завершения разработки заменить планируемые возможности на фактически реализованные и проверенные. Указать точные модели, зависимости, команды запуска, режим обработки данных, результаты проверки Teams и Zoom и известные ограничения. Нереализованные функции явно отметить как дальнейшие планы. До этой проверки не заявлять готовность приложения и полное соответствие кейсу.
Авторы коммитов
История коммитов
- 2026-09-23 17:51feat: PROTON meeting workflow, audio uploads and task summariess_element
- 2026-09-23 17:50Merge pull request #1 from BAITC-Hacks/feature/sttzhan
- 2026-09-23 17:47feat: integrate local meeting results, diarization and DOCX exportzhancmd
- 2026-09-23 17:23merge: integrate new meeting workspace UIs_element
- 2026-09-23 17:10feat(ui): preserve meeting workspace and prepare task integrationasre57
- 2026-09-23 17:02feat: connect Jan's local speech recognition to meeting backends_element
- 2026-09-23 16:57Merge remote-tracking branch 'origin/feature/ai' into feature/realtime-backends_element
- 2026-09-23 16:47feat: add local speech-to-summary pipelinezhancmd
Все коммиты (13)
- 2026-09-23 16:25feat: stream diarized transcript events from audio chunkss_element
- 2026-09-23 16:19feat: capture meeting audio and publish WAV chunkss_element
- 2026-09-23 16:16feat: support Kazakh and mixed meeting actionszhancmd
- 2026-09-23 15:36fix: improve transcript action analysiszhancmd
- 2026-09-23 15:10feat: добавить первый UI и загрузку тестового аудиоs_element
Структура репозитория (41 файлов)
.gitignore README.md ai/README.md ai/__init__.py ai/analyzer.py ai/diarization.py ai/download_diarization.py ai/meeting.py ai/pipeline.py ai/report.py ai/requirements-diarization.txt ai/requirements.txt ai/summary.py ai/transcriber.py backend/README.md backend/TRANSCRIPTION_CONTRACT.md backend/__init__.py backend/__main__.py backend/app.py backend/recorder.py backend/teams.py backend/transcription.py requirements-dev.txt requirements.txt setup.cmd speech/__init__.py speech/recognizer.py start-ui.cmd tests/fixtures/transcript.json tests/test_analyzer.py tests/test_meeting_results.py tests/test_pipeline.py tests/test_recording_backend.py tests/test_speech_adapter.py tests/test_transcriber.py tests/test_transcription.py ui/app.js ui/index.html ui/recording.js ui/results.js ui/styles.css
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.