О проекте
Команда: oaiu
Кейс HackAlem.ai: Инновации — Самрук-Казына
Стадия: Рабочий MVP
Задача кейса: «Хаттама»: протокол и поручения по аудиозаписи совещания (каз./рус./смешанная речь)
Суть
Полностью локальная система: по аудиозаписи совещания на русском, казахском или смешанном языке делает стенограмму, краткое содержание, список поручений со сроками и DOCX-протокол.
Как устроено
ffmpeg приводит аудио к 16 кГц моно, режет гул и выравнивает громкость. whisper.cpp (ggml-large-v3-turbo, Metal) распознаёт речь, в смешанном режиме в два прохода (ru и kk), и для каждой реплики выбирает вариант по доле казахских слов. Говорящих разделяют по паузам или по отдельным дорожкам с телефонов участников, отметка участников идёт по QR. Ollama qwen3:4b извлекает поручения с цитатой, краткое содержание и название. Устные сроки переводит в даты код (dates.py). Данные хранятся в SQLite, API на FastAPI, протокол экспортируется через python-docx.
Ключевые решения
- whisper.cpp large-v3-turbo
- двухпроходное ru/kk распознавание
- диаризация по паузам/дорожкам
- извлечение поручений LLM
- rule-based парсинг дат
- QR-регистрация
Особенности
Смешанная речь решена двумя проходами Whisper с выбором варианта по каждой реплике, язык определяется по доле казахских слов. Подсказка распознаванию состоит только из имён участников, потому что длинный русский словарь мешал казахскому. Многодорожечная запись склеивает текст, а не звук. Работает офлайн, без облака.
Стек
Python · FastAPI · SQLite · ffmpeg · whisper.cpp · Ollama · python-docx · segno · HTML/JS
Модели
Whisper large-v3-turbo (whisper.cpp) · Qwen3:4b via Ollama
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-5f811d8e-oaiu.
README
README.mdHattama — протокол совещаний с контролем поручений
Система принимает запись совещания и выдаёт готовый протокол и список поручений с ответственными, сроками и статусами. Работает полностью локально: аудио и текст не передаются во внешние сервисы. Решение рассчитано на закрытый контур заказчика.
1. Какую проблему решает
На совещаниях поручения раздают устно. Секретарь записывает их вручную: часть теряется, сроки искажаются («до конца недели» превращается в «до пятницы»), ответственный не всегда зафиксирован. Через неделю никто не может сказать, кому что поручено. Протокол оформляют ещё два-три часа после встречи, а исполнение не контролируется, потому что контролировать нечего: списка нет.
Отдельная сложность в Казахстане: на совещаниях говорят на русском, казахском и смешивают языки внутри одной фразы. Облачные сервисы либо не знают казахского, либо требуют отправлять запись наружу, что для госкомпаний и банков недопустимо.
Что даёт система
| Кому | Что получает |
|---|---|
| Секретарь | Протокол собирается сам: участники, краткое содержание, таблица поручений |
| Руководитель | Поручения со сроками и статусами, просроченные отмечаются автоматически |
| Исполнитель | Своё поручение с цитатой из совещания и сроком |
2. Что умеет
- Распознаёт речь — русский, казахский, смешанная речь. Локально. Модель определяет язык один раз на всю запись, поэтому на совещании, где языки чередуются, казахские фразы уезжают в русский. Мы прогоняем запись двумя проходами, русским и казахским, и по каждой реплике берём тот вариант, в котором действительно есть казахские буквы. Плата за это — время обработки вырастает вдвое.
- Разделяет говорящих. Два режима: по паузам в одной записи либо по дорожкам, когда каждый участник пишет со своего телефона. Во втором случае имя говорящего известно точно.
- Язык совещания выбирается перед записью: русский, казахский или смешанный. Один язык — один проход распознавания, быстро и точно. Смешанный — два прохода с выбором варианта по каждой реплике, это режим по умолчанию.
- Отмечает участников перед началом: QR на экране ведущего, участник сканирует и вводит имя. Имена участников передаются распознаванию и разбору поручений, что снижает число ошибок.
- Находит поручения: что сделать, кому, к какому сроку, кто поручил, и цитату из стенограммы, откуда поручение взято.
- Переводит устные сроки в даты: «до конца недели» → 25.09.2026. Рядом сохраняется исходная формулировка и правило пересчёта.
- Составляет краткое содержание: по каждому докладчику показатель, названная проблема и принятое решение.
- Даёт название совещанию по содержанию разговора.
- Экспортирует протокол в DOCX: шапка, участники, краткое содержание, таблица поручений, стенограмма приложением.
- Ведёт статусы: в работе, просрочено, выполнено. Просрочка считается сама.
- Удаляет совещание полностью: из базы стираются стенограмма, поручения и участники, а аудиофайл и дорожки участников удаляются с диска. Запись не хранится дольше, чем нужно.
3. Архитектура
аудио (файл, запись в браузере или дорожки участников)
└─ ffmpeg приведение к 16 кГц моно, срез гула, выравнивание громкости
└─ whisper.cpp распознавание речи на видеоядре Apple Silicon, локально
└─ разделение по паузам либо по дорожкам участников
└─ склейка дорожек реплики по времени, чужие голоса отсеиваются по громкости
└─ Ollama qwen3:4b поручения, краткое содержание, название совещания
└─ dates.py устные сроки в даты, обычным кодом
└─ SQLite хранение совещаний, участников, поручений, статусов
└─ FastAPI API и веб-интерфейс
└─ python-docx протокол в DOCX
Два решения, которые стоит отметить:
- Сроки переводит код, а не модель. Правило должно быть одинаковым каждый раз и объяснимым. Рядом с датой в интерфейсе видно, как она получена.
- Дорожки не смешиваются в один звук. Смешивание складывает шумы и не делает дальний голос громче. Склеивается текст, имя берётся из владельца дорожки.
Подробнее: docs/multitrack.md.
4. Технологии
| Слой | Чем |
|---|---|
| Распознавание речи | whisper.cpp, модель ggml-large-v3-turbo, Metal на Apple Silicon |
| Языковая модель | Ollama, qwen3:4b, локально |
| Бэкенд | Python 3, FastAPI, SQLite |
| Документы | python-docx |
| QR для отметки участников | segno, генерация офлайн |
| Интерфейс | HTML и JavaScript без сборки, один файл на страницу |
Внешние облачные API не используются. Это требование кейса о закрытом контуре и одновременно главное отличие от Otter и Fireflies. Ключи и учётные записи для проверки не нужны.
5. Установка
Требуется macOS с Apple Silicon, Homebrew, около 6 ГБ свободного места.
# инструменты
brew install ffmpeg ollama whisper-cpp
# локальная языковая модель
ollama serve &
ollama pull qwen3:4b
# модель распознавания речи
mkdir -p ~/Desktop/models
curl -L -o ~/Desktop/models/ggml-large-v3-turbo.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin
# окружение проекта
python3 -m venv .venv
./.venv/bin/pip install fastapi uvicorn python-docx requests python-multipart segno pillow
Первая установка требует интернета для загрузки моделей, около 4 ГБ. Дальше система работает офлайн.
6. Запуск
ollama serve & # если ещё не запущен
./.venv/bin/python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000
- Лендинг: http://localhost:8000
- Приложение: http://localhost:8000/app
Порт 0.0.0.0 нужен, чтобы участники могли отметиться со своих телефонов в той же сети.
7. Как проверить решение
Быстрая проверка, около двух минут
- Открыть http://localhost:8000/app
- Нажать «Загрузить файл», выбрать
samples/meeting_test.wav - Дождаться четырёх шагов обработки и статуса «готово»
- Проверить результат:
- совещание получило название по содержанию;
- показано краткое содержание;
- в списке поручений есть ответственный, срок в виде даты, исходная формулировка срока и цитата из стенограммы;
- вкладка «Стенограмма» показывает реплики с говорящими.
- Нажать «Скачать протокол» и открыть полученный DOCX.
Проверка отметки участников и записи с телефонов
- В приложении «Новое совещание» — появится QR
- Открыть с телефона в той же сети или ввести участников вручную
- Участник на своей странице нажимает «Начать запись», в конце дорожка уходит на сервер
- Ведущий нажимает «Собрать совещание из дорожек участников»
Проверка работы без интернета
Отключить Wi-Fi и повторить быструю проверку. Система продолжает работать: сетевых вызовов в решении нет.
8. Параметры окружения
Ключи и внешние учётные записи не требуются. Поведение можно менять переменными:
| Переменная | По умолчанию | Что делает |
|---|---|---|
HATTAMA_PROMPT | on | Передаёт распознаванию имена участников, снижает ошибки в именах. В подсказке только имена собственные: длинный текст на одном языке склоняет модель к этому языку и мешает смешанной речи. off отключает |
HATTAMA_AUDIO_CLEAN | on | Срез гула техники и выравнивание громкости, помогает участникам вдали от микрофона. off отключает |
HATTAMA_MIXED | on | Двухпроходное распознавание для смешанной речи: русский и казахский проходы с выбором варианта по каждой реплике. off оставляет один проход и работает вдвое быстрее |
HATTAMA_SECRET | встроенный | Секрет для кода отметки участников |
Пути к моделям задаются в backend/transcribe.py (MODEL_TURBO)
и backend/extract.py (MODEL, адрес Ollama).
9. Структура репозитория
backend/
main.py API, база, сценарий обработки, отметка участников, QR
transcribe.py подготовка звука, распознавание, говорящие, склейка дорожек
extract.py поручения, краткое содержание, название совещания
dates.py перевод устных сроков в даты
export.py протокол в DOCX
frontend/
landing.html лендинг
index.html приложение
join.html страница отметки участника
img/ изображения
samples/ демо-запись, стенограммы, текст для проверки речи
docs/ развитие продукта: кабинеты, многодорожечная запись, устройство
10. Ограничения, о которых честно
- В режиме одной записи говорящие разделяются по паузам: на перебивках возможны ошибки. Режим с дорожками участников решает это полностью.
- Качество распознавания казахской речи ниже русской: модель turbo ужата ради скорости. Полная large-v3 точнее, требует 3 ГБ места и вдвое больше времени.
- Запись в
samples/синтезирована для тестирования, живых записей совещаний в репозитории нет по соображениям приватности. - Устройство записи, показанное на лендинге, это концепт: в решение хакатона оно не входит.
11. Проверено
23.09.2026. Репозиторий склонирован в пустую папку, зависимости установлены по инструкции выше, сервер запущен, пройден полный сценарий: загрузка записи, распознавание, название совещания, краткое содержание, три поручения с ответственными, сроки переведены в даты, протокол DOCX скачан.
Проверка выполнена на чистой копии, без файлов и настроек из рабочей папки.
Авторы коммитов
История коммитов
- 2026-09-23 17:43Выбор языка совещания перед записью: русский, казахский или смешанныйMuhammedjan
- 2026-09-23 17:40Экран обработки: устойчивый опрос, счётчик времени и подробные шаги вместо одного зависшегоMuhammedjan
- 2026-09-23 17:30Определение языка реплики по доле казахских слов, а не букв: русские фразы больше не подменяются казахским вариантомMuhammedjan
- 2026-09-23 17:25Смешанная речь: два прохода распознавания, русский и казахский, с выбором варианта по каждой репликеMuhammedjan
- 2026-09-23 17:23Удаление совещания: стенограмма, поручения, участники и аудиофайлы стираются с дискаMuhammedjan
- 2026-09-23 17:22README: полное описание для проверяющих — проблема, возможности, архитектура, технологии, установка, запуск, шаги проверки, ограниченияMuhammedjan
- 2026-09-23 17:20Блок «Следующее поколение»: рендеры устройства с пометкой «Концепт» и честным текстом о срокахMuhammedjan
- 2026-09-23 17:04Подсказка модели только из имён: длинный русский словарь мешал распознаванию казахской речи; переключатели подсказки и обработки звукаMuhammedjan
Все коммиты (17)
- 2026-09-23 16:56Персонаж на лендинге: первый экран, блоки о работе, ролях и казахской речиMuhammedjan
- 2026-09-23 16:42Краткое содержание совещания: по каждому докладчику показатель, проблема и решение; выводится в приложении и в протоколеMuhammedjan
- 2026-09-23 16:24Запись с нескольких телефонов: дорожка на участника, склейка по времени, отсев чужих голосов по громкости; обработка звука для дальних говорящих; лендинг с полным описаниемMuhammedjan
- 2026-09-23 16:11Название совещания по содержанию разговора, устойчивый разбор ответа моделиMuhammedjan
- 2026-09-23 15:55Логотип Hattama на лендинге и в приложенииMuhammedjan
- 2026-09-23 15:51README: отметка о проверке запуска на чистом клонеMuhammedjan
- 2026-09-23 15:48Лендинг, приложение в виде мобильного интерфейса, отметка участников по QR с защитойMuhammedjan
- 2026-09-23 15:10Рабочая цепочка: распознавание речи, извлечение поручений, сроки в даты, протокол DOCX, веб-интерфейс и APIMuhammedjan
- 2026-09-23 14:16Структура проекта: agent, backend, frontend; контракт API и формат данныхMuhammedjan
Структура репозитория (28 файлов)
.gitignore README.md agent/README.md backend/README.md backend/dates.py backend/export.py backend/extract.py backend/main.py backend/transcribe.py docs/device.md docs/multitrack.md docs/vision.md frontend/README.md frontend/img/device-back.jpg frontend/img/device-room.jpg frontend/img/device-side.jpg frontend/img/device-top.jpg frontend/img/hero-phone.png frontend/img/mascot-doc.png frontend/img/mascot-give.png frontend/img/mascot.png frontend/index.html frontend/join.html frontend/landing.html samples/meeting1_transcript.txt samples/meeting_test.wav samples/script.txt samples/test_kz.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.