← ПроектыРазработка D2Tech · в продакшене
Голосовой секретарь в Telegram
Надиктовал — получил грамотный, готовый к отправке текст: письмо, список или инструкцию. Плюс разбор фото, сканов, видео и документов. Персональные данные не покидают периметр: перед отправкой в модель они заменяются метками и возвращаются в ответе.
2 модели с автопереключением: Gemini, при сбое или лимите — DeepSeek6 типов персональных данных маскируются до модели, плюс имена людей4 команды к последнему тексту: /ты, /вы, /сократи, /смысл0 выдуманных фактов — модель переписывает, а не пересказывает
Задача
Руководитель надиктовывает длинное голосовое — с оговорками, повторами, «э-э» и «короче». Чтобы отправить это письмом или поручением, кто-то должен переслушать и переписать руками.
Отдавать такие записи внешней модели как есть нельзя: в них имена, телефоны, номера карт и договоров.
Что сделали
Переписывает начисто, а не пересказывает
Расшифровка уходит в модель с задачей редактора-секретаря: убрать слова-паразиты и самоперебивы, исправить грамматику, самому выбрать формат — письмо, список, инструкция по шагам или абзацы. Все факты, имена и числа сохраняются, ничего не дописывается: ни подписей, ни дат, ни выводов.
Персональные данные не выходят наружу
Телефоны, почты, карты, СНИЛС, ИНН, паспорта и имена людей заменяются на метки вида ⟦PER_1⟧ до отправки в модель и возвращаются на место в ответе. Карты проверяются по Луну, ИНН — по контрольным цифрам, имена находит NER.
Фото, сканы, видео и документы
Скан → текст, фото → описание, видео → пересказ, PDF → суть и пункты. Подпись к вложению работает как инструкция: что попросил, то и сделает.
Команды к последнему тексту
/ты и /вы меняют обращение, /сократи оставляет главное, /смысл выделяет основные пункты и вопросы. Команды применяются цепочкой: надиктовал → /сократи → /ты.
Словарь точных написаний
Общий /terms: названия и имена собственные бот пишет канонически — «MedC», «IFK система» — даже если распознались похоже по звучанию. Словарь живёт на томе и переживает пересборку контейнера.
Почему этому можно верить
- Две модели
- Основная — Gemini 2.5 Flash. Сломался, залимитился — текст уходит в DeepSeek, пользователь этого не видит. Для вложений запасной модели нет, и бот честно пишет: лимит на сегодня исчерпан, пришли завтра или голосом.
- Метки
- Один и тот же телефон получает одну и ту же метку, где бы ни встретился. После ответа проверяется, что все метки раскрыты; если модель какую-то потеряла, это видно в логе.
- Границы
- Только whitelist, чужим бот вообще не отвечает. Десять минут аудио, 20 МБ на вложение. Длинный текст дублируется файлом DOCX.
Где это ломается
Распознавание на русском ошибается в именах собственных — для этого и нужен словарь /terms; без него редкие названия придётся править руками.
Счётчик дневного лимита Gemini живёт в памяти процесса и обнуляется при рестарте. Это безопасно: реальный предел всё равно ловится по ошибке 429.
Как устроено
- Распознавание
- Deepgram nova-2, русский, smart_format. OGG/Opus из Telegram принимается без перекодирования.
- Модели
- Google Gemini 2.5 Flash как основной мультимодальный провайдер; DeepSeek через OpenAI-совместимый API как текстовый fallback; дневная квота с защёлкой по 429.
- Защита данных
- Регулярные выражения с проверками Луна и контрольных цифр ИНН плюс NER natasha для имён; обратимое маскирование до модели и после.
- Бот
- Python, aiogram 3, python-docx. Docker Compose, глоссарий на томе.
Похожая задача?
Опишите её — пришлём скоуп и смету за 24 часа: