🎙

Голос-бот: расшифровка голосовых сообщений Telegram в текст

собственный Telegram-бот: голосовые, кружочки, аудио и видео в текст через Gemini

Telegram-бот перевода голосовых сообщений в текст: голосовые, кружочки, аудио и видео расшифровываются дословно, прибрано или конспектом. Google Gemini, пул ключей, FFmpeg, кэш расшифровок; аудио не хранится.

В продакшене · собственный продукт
3 режима
дословно, прибрано, конспект; переключаются кнопкой после расшифровки
180 минут
максимальная длительность записи по умолчанию, меняется в настройках
30 дней
живёт кэш расшифровки; сам аудиофайл удаляется сразу после обработки

Задача

Голосовые сообщения удобны отправителю и неудобны получателю. Их нельзя просмотреть глазами, найти поиском, процитировать или прочитать там, где нельзя включить звук: в метро, на совещании, ночью рядом со спящим ребёнком. Пятиминутное голосовое требует ровно пяти минут внимания, даже если полезного в нём две строки.

Нужен был бот перевода голосовых в текст, которому достаточно переслать сообщение. Без регистрации на сторонних сайтах, без загрузки файла в браузер и с честным поведением: если речи в записи нет, бот должен сказать об этом, а не сочинить текст.

Решение

Golos Bot — собственный Telegram-бот расшифровки голосовых сообщений. Реализовано в версии 2.2.0:

  • Любой источник звука. Голосовые (ogg), кружочки (берётся звуковая дорожка), аудиофайлы mp3, m4a, ogg и wav, видео (вырезка из созвона, лекция), документы, когда аудио прислали файлом.
  • Три режима. Дословно — каждое слово как сказано, для договорённостей. Прибрано — без «эээ» и повторов, абзацами, на каждый день. Конспект — тезисы и структура.
  • Переделать иначе. Режим переключается кнопкой под готовой расшифровкой, пересылать запись заново не нужно.
  • Язык ответа. Русский, English или язык оригинала.
  • Файлом. Длинный текст отдаётся как .txt, а не режется на куски.
  • Кэш. Та же запись в том же режиме возвращается мгновенно, без трат на API.
  • Тишина. Если речи нет, бот сообщает об этом, а не выдумывает текст.
  • Пул ключей Gemini. Автопереключение при исчерпании квоты и автооткат на запасную модель.
  • Лимиты. Число расшифровок в час и максимальная длительность записи; часовой лимит меняется из админки на лету. Список премиум-пользователей без лимита, админы безлимитны всегда.
  • Админ-панель. Статистика, аналитика, ключи, пользователи, баны, рассылка, настройки, логи, обслуживание. Новый пользователь — админам приходит карточка с ID и username, один раз.

Как это устроено

Gemini транскрибация аудио одним запросом

Google Gemini — мультимодальная модель, то есть нейросеть, которая понимает звук напрямую, без отдельного этапа «распознать речь, потом обработать текст». Бот отправляет аудио вместе с промптом (инструкцией), в котором указаны режим и язык, и получает готовый текст. Так меньше звеньев и меньше потерь смысла. Глубина рассуждений модели и таймаут ответа задаются настройками.

ffmpeg: проверка и сжатие в моно-MP3

Перед отправкой в модель ffprobe (утилита из набора FFmpeg) читает длительность записи и проверяет, есть ли в ней звук. Если файл больше 20 МБ, FFmpeg пережимает его в моно-MP3 с битрейтом 32 kbps: для распознавания речи этого достаточно, а объём падает в разы. Библиотека pydub намеренно не используется: она не обновлялась с 2021 года и импортирует модуль audioop, удалённый из Python 3.13.

Пул ключей Gemini и квоты

Бесплатная квота Gemini ограничена, поэтому бот держит несколько ключей. Когда ключ упёрся в квоту, он уходит на остывание (по умолчанию 60 минут), а запрос идёт через следующий. Пользователь ничего не замечает, админу приходит уведомление. В админке виден статус каждого ключа и есть кнопка снять остывание принудительно. Если основная модель вернула 404 (переименовали, сняли), бот молча переходит на запасную.

Кэш расшифровок

Результат сохраняется в SQLite вместе с ключом «запись + режим». Повторная отправка той же записи в том же режиме отдаётся из кэша мгновенно. Кэш живёт ограниченный срок (по умолчанию 30 дней), сам аудиофайл удаляется сразу после обработки. В базе также хранятся пользователи и их настройки, журнал расшифровок, использование ключей и настройки, меняемые из админки.

Управление и учёт

Админ-панель открывается командой /admin и работает на кнопках под сообщением. В шапке показана версия бота: по ней видно, что реально раскатано на сервере. При первом появлении нового пользователя всем админам приходит карточка: имя, ID отдельным блоком (копируется тапом), ссылка на username и общее число пользователей в базе. Логика бота покрыта модульными проверками и проверками маршрутизации, в которых Telegram и Gemini заменены имитациями, поэтому сеть для прогона не нужна.

Результат

  • Голосовое, кружочек, аудиофайл или видео читаются как текст: его можно найти поиском, процитировать и прочитать без звука.
  • Режим меняется после расшифровки без повторной пересылки записи.
  • Повторы отдаются из кэша без обращения к API.
  • Исчерпание квоты одного ключа не останавливает работу: пул ключей и запасная модель.
  • Аудио не хранится, текст расшифровки живёт ограниченный срок.
  • Бот работает в Docker с healthcheck и ротацией логов, версия пишется в лог при старте и приходит админам сообщением о запуске.

Технологии: что и зачем

  • Python 3.14 и aiogram 3 — асинхронный Telegram-бот на inline-кнопках.
  • Google Gemini (google-genai) — расшифровка аудио одним запросом; основная и запасная модели задаются настройками.
  • FFmpeg и ffprobe — длительность, проверка наличия звука, сжатие длинных записей.
  • SQLite (aiosqlite) — пользователи, журнал, кэш расшифровок, использование ключей, настройки.
  • Docker — образ python:3.14-slim, запуск под непривилегированным пользователем, healthcheck, TZ=Europe/Moscow.

Статус

Собственный продукт, в продакшене. Текущая версия 2.2.0 от 20 сентября 2026 года: добавлена подпись «Сделано в DevUnit Lab» со ссылкой на сайт. Версия 2.1.0 (15 августа 2026) зафиксировала переезд в отдельный репозиторий и разбиение однофайлового бота на пакет модулей.

Ограничения: 20 МБ на скачивание через облачный Bot API, работа только в личных сообщениях, очереди при исчерпании всех ключей нет. В планах: кнопка «Скопировать текст», саммари первым сообщением, работа в группах, мониторинг квоты, учёт стоимости, экспорт в .docx и .srt.

Вопросы по проекту

Как прочитать голосовое сообщение, не слушая его?
Перешлите голосовое боту. Он вернёт текст в выбранном режиме: дословно, прибрано (без «эээ» и повторов) или конспектом. Длинный текст придёт файлом .txt, а не нарезкой на куски.
Какие записи бот понимает?
Голосовые сообщения, кружочки (видеосообщения, берётся звуковая дорожка), аудиофайлы mp3, m4a, ogg и wav, видео и документы, если аудио прислали файлом. Язык ответа: русский, английский или язык оригинала.
Как работает транскрибация аудио через Gemini?
Аудио вместе с инструкцией (режим и язык) уходит в мультимодальную модель Google Gemini одним запросом. Отдельного этапа «распознать речь, потом обработать текст» нет. Перед отправкой ffprobe проверяет длительность и наличие звука, а файл больше 20 МБ FFmpeg пережимает в моно-MP3.
Что происходит, когда у ключа Gemini кончается квота?
Ключи работают пулом. Исчерпанный ключ уходит на остывание (по умолчанию 60 минут), запрос идёт через следующий, админу приходит уведомление. Если основная модель вернула 404, бот сам переходит на запасную.
Хранятся ли мои записи?
Аудиофайл удаляется сразу после обработки. Текст расшифровки лежит в кэше ограниченный срок, по умолчанию 30 дней: та же запись в том же режиме возвращается мгновенно и без трат на API.
Есть ли ограничения?
Облачный Bot API Telegram не отдаёт ботам файлы больше 20 МБ. Фильтры безопасности Gemini могут отклонить запись на резкую тему, а шум и несколько говорящих одновременно ухудшают результат. Если речи в записи нет, бот прямо об этом скажет, а не выдумает текст.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.