← Проекты

Разработка 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 часа: