Привет, Хабр! Недавно Сбер выкатил новые модели распознавания речи (speech-to-text, STT), и мне захотелось проверить их не в абстрактном демо, а в реальном сценПривет, Хабр! Недавно Сбер выкатил новые модели распознавания речи (speech-to-text, STT), и мне захотелось проверить их не в абстрактном демо, а в реальном сцен

От голосовых к тексту: делаем Telegram-бота для расшифровки аудио на GigaAM-v3

Привет, Хабр! Недавно Сбер выкатил новые модели распознавания речи (speech-to-text, STT), и мне захотелось проверить их не в абстрактном демо, а в реальном сценарии. В этой статье я расскажу о практическом кейсе – разработке Telegram-бота, который преобразует голосовые сообщения в текст. Посмотрим, на что способна новая отечественная модель GigaAM-v3, и соберём на её основе расширяемого Telegram-бота.

e5924ac19848e9331905140b11521c91.png

Предыстория: существующие решения и их ограничения

Почему я не воспользовался готовыми решениями? Да потому что все они в чём-то ограничены. В самом Telegram уже есть встроенная функция расшифровки, доступная подписчикам Telegram Premium – при прослушивании голосового или видеосообщения можно нажать кнопку «A» и получить текст. Однако эта Premium-функция работает только для сообщений внутри Telegram (голосовых и кружков) и не умеет расшифровывать произвольные аудиофайлы. Кроме того, у Premium-расшифровки есть и неявные ограничения: длинные аудио она переваривает плохо. При попытке расшифровать, скажем, 6-минутное голосовое сообщение, приложение может выдать ошибку «слишком длинное сообщение». То есть фактически в Premium нет поддержки расшифровки действительно длинных записей.

522cfb8247e5a851bf7d6155c0434335.png

Задача автоматического распознавания речи в мессенджерах не нова – энтузиасты уже создавали ботов, переводящих голосовые сообщения в текст (и в Telegram, и во ВКонтакте). Например, ещё в 2018 году на Хабре публиковалась статья о VK-боте на Node.js, который использовал Yandex SpeechKit и wit.ai для расшифровки голосовых. В более свежем примере автор интегрировал модель Whisper от OpenAI в своего Telegram-бота (писал его на PHP). У большинства таких решений, однако, есть общие проблемы:

  1. Отсутствие Python в стеке. Многие реализуют ботов на Node.js, PHP и прочих платформах. Однако Python давно стал де-факто стандартом для ML-задач и быстрого прототипирования, поэтому логично выбирать именно его для проекта с распознаванием речи.

  2. Зависимость от устаревших или сторонних API. В ряде случаев применяются старые модели или сторонние API с лимитами. Например, в упомянутом VK-боте сперва приходилось обращаться к Yandex SpeechKit (где был дневной лимит), а потом переключаться на другой облачный сервис. В другом случае бот работал через внешний API Whisper. Такие подходы сложно масштабировать, они сильно зависят от сторонних сервисов и их ограничений.

  3. Одноразовые скрипты. Подобные решения обычно писались как разовые проекты и плохо подходят в качестве основы для развития. В них сложно добавить новые функции – будь то автоматическая суммаризация длинных расшифровок, аналитика созвонов, голосовые ассистенты или интеграция с LLM. Хочется с самого начала заложить архитектуру, которую легко расширять под любые задачи.

Отдельно стоит упомянуть сторонние разработки. Например, команда Silero пару лет назад в статье представила собственного бесплатного телеграм-бота для перевода речи в текст. Silero-бот работает автономно на своих моделях и довольно шустро, но предназначен прежде всего для небольших фрагментов аудио (несколько минут). Разработчики прямо указывали, что бот рассчитан на короткие голосовые сообщения и заметки, а 20-мегабайтное ограничение на размер файла (исходящее от Telegram) они даже не стали обходить. Иными словами, в Silero-боте тоже не получится расшифровать что-то длиной значительно больше ~10 минут – лучше сразу использовать их отдельный сервис для длинных файлов. С положительной стороны, бот от Silero сразу отправляет результат частями с удобными таймкодами, чтобы текст не превращался в бесформенную «стену». Этот момент я взял на заметку.

В итоге вопрос «зачем городить своего бота, если есть готовые решения» свёлся к нескольким практическим причинам.

Во-первых, универсальность. Встроенная расшифровка в Telegram Premium работает только с голосовыми и видеосообщениями внутри Telegram и плохо переносит длинные записи. Произвольные аудиофайлы, подкасты, лекции или записи созвонов она просто не покрывает – а хотелось иметь одно решение для всех случаев.

Во-вторых, контроль и масштабирование. Собственный бот позволяет управлять всей цепочкой обработки: распараллеливать задачи, оптимизировать пайплайн и расшифровать сразу много записей, не упираясь в лимиты чужого сервиса. Да, у Telegram есть ограничение Bot API на размер файлов, которые можно передать напрямую. Однако это ограничение не является фундаментальным: в бота можно добавить поддержку обработки аудио по ссылке. В таком случае бот не получает файл от Telegram, а сам скачивает его из облачного хранилища (например, Google Drive), что позволяет работать с аудиозаписями практически любого размера.

В-третьих, гибкость доработок. Кастомного бота можно развивать под свои задачи: добавить загрузку по ссылке, поддержку облачных хранилищ, дополнительные этапы обработки или интеграции с другими сервисами. В то время как готовая функция от Telegram – это "чёрный ящик", который не расширить и не переделать.

И наконец, формат результата. Premium-расшифровка Telegram выдаёт просто сплошной текст. Мне же хотелось получать расшифровку сразу в удобном виде – с разбивкой по временным меткам, чтобы в длинной записи можно было легко ориентироваться, как это делает, например, бот от Silero.

В совокупности эти причины и подтолкнули к созданию собственного решения.

Выбор модели распознавания: почему GigaAM-v3

Для сердца бота существует несколько вариантов. Самый очевидный путь: использовать готовый облачный API (Google, Яндекс, Sber SaluteSpeech и т.д.). Но мне хотелось опробовать современную открытую модель, которую можно запустить локально и не зависеть от внешних сервисов и тарифов. У Silero есть свои модели STT для русского, но недавно появилась очень интересная альтернатива от SberDevices GigaAM-v3. Это семейство крупных моделей, обученных на огромных объёмах русской речи (суммарно сотни тысяч часов). Конкретно я решил взять модель в варианте End-to-End RNN-T с пунктуацией – она свежая (2025 год) и заявлена как одна из новых SOTA (state-of-the-art) для русского языка. По заявлениям Сбера, модель превосходит даже Whisper-large от OpenAI на большинстве тестов – в среднем качество лучше ~70:30 по оценке LLM-судьи.

Интерес подогревало и то, что это полностью открытая модель (MIT License), ее можно бесплатно скачать с Hugging Face и запустить где угодно, хоть на сервере, хоть в Colab. К тому же модель сразу выдаёт нормализованный текст с расставленной пунктуацией и заглавными буквами, что избавляет от необходимости постобработки. Проще говоря, захотелось сделать бота на питоне с GigaAM-v3 и заодно поделиться опытом его создания.

От аудио к тексту: схема работы бота

Перед тем как перейти к коду, опишу кратко архитектуру моего бота – как именно он будет получать аудио и возвращать текст. Ниже представлена схема, иллюстрирующая этапы обработки:

d96d4e8964b470d56853f7e81876a3e5.png
  1. Пользователь отправляет боту аудио – это может быть голосовое сообщение, «кружочек» (видеосообщение) или просто аудиофайл.

  2. Бот получает файл и проверяет ограничения. Если в чате уже идет обработка другого файла, бот вежливо попросит подождать. Если файл слишком большой, бот сразу ответит, что Telegram не пропускает такие файлы (ограничение Bot API).

  3. Индикация процесса. Если всё в порядке, бот оповестит пользователя о начале распознавания – например, отправит статус «печатает…» в чат (чтобы было понятно, что работа идёт).

  4. Загрузка и подготовка аудио. Бот через Telegram API скачивает отправленный файл во временное хранилище. Далее с помощью FFmpeg конвертирует его в WAV с параметрами, подходящими для модели: моно 16 кГц. Это необходимо, поскольку модель обучена на 16 kHz моно и ожидает именно такой формат на вход.

  5. Нарезка на фрагменты. Если аудио длиннее заданного порога, бот разобьёт его на последовательность чанков каждый продолжительностью по 25 секунд. Это сделано для снижения нагрузки на модель и для того, чтобы постепенно отправлять результат пользователю, не дожидаясь полной расшифровки всего файла.

  6. Распознавание речи моделью. Каждый фрагмент аудио подаётся в модель для расшифровки. Модель возвращает текст расшифровки этого куска. Поскольку используется end-to-end модель, текст уже содержит знаки препинания и готов к чтению.

  7. Постепенная отправка расшифровки. По мере готовности каждого фрагмента бот собирает распознанный текст. Чтобы сообщение не оказалось слишком большим, используется буферизация по 3000 символов: как только набирается большой кусок текста, бот отправляет его пользователю. При этом в начало каждого фрагмента добавляется соответствующий таймкод (MM:SS) – промежуток времени, которому соответствует данный текст. Первое сообщение бот отправляет сразу, как только готова первая часть текста, чтобы не заставлять ждать. Далее текст может приходить несколькими сообщениями: «Часть 1», «Часть 2» и т.д. – это удобнее, чем один гигантский абзац.

  8. Завершение. После обработки всех аудио-фрагментов бот останавливает индикатор «набор текста» и убеждается, что вся расшифровка доставлена. В итоге пользователь получает полный текст аудио-разговора, разбитый на части с указанием времени, что значительно облегчает поиск по содержанию длинной записи.

Таким образом, вся реализация сводится к двум вещам: запустить модель распознавания речи на аудио (с конвертацией и разбиением на части) и обернуть это в Telegram-бота с нормальным пользовательским опытом – потоковой выдачей текста, таймкодами и обработкой ошибок.

Код и быстрый старт: разворачиваем бота в Colab

Ниже приведена рабочая реализация Telegram-бота для расшифровки аудио на базе модели GigaAM-v3.

Я запускал бота в Google Colab, поэтому в начале скрипта устанавливаются все необходимые системные и Python-зависимости. Это позволяет воспроизвести решение без локальной настройки окружения – достаточно открыть ноутбук и выполнить ячейки.

Полный код также опубликован в виде Colab-ноутбука – по ссылке его можно запустить и посмотреть, как всё работает.

Как получить токен Telegram-бота (для чайников):

  1. Откройте в Telegram чат @BotFather.

  2. Напишите команду /newbot.

  3. Придумайте имя (любое) и уникальный username, который обязательно заканчивается на bot (например, my_transcriber_bot).

  4. BotFather выдаст строку вида 123456:ABC... – это и есть токен.

Как запустить в Colab:

  1. Откройте ноутбук по ссылке.

  2. Вставьте токен бота в переменную os.environ["BOT_TOKEN"] = "..."

  3. Запустите ячейки сверху вниз.

  4. После запуска бот станет доступен в Telegram.

Кроме того, у меня есть готовая реализация в виде Telegram-бота: вы можете отправить ему голосовое сообщение или аудиофайл и сразу увидеть результат расшифровки.

Что получилось и куда двигаться дальше

bea8518c806ca83ce960cffeccb3f904.png

Что в итоге получилось? На выходе – работающий прототип Telegram-бота, который расшифровывает аудио и голосовые сообщения локально с помощью модели GigaAM-v3. Он справляется с небольшими по объему файлами и выдает текст расшифровки, разбитый по минутам. Качество распознавания оказалось стабильным: модель корректно обрабатывает русскую речь, включая сложные слова, и в большинстве случаев адекватно расставляет знаки препинания (например, текст на изображении выше). Согласно опубликованным метрикам, GigaAM-v3 демонстрирует высокий уровень точности для русскоязычного ASR, что в целом подтвердилось и в практических экспериментах. Даже на длинных записях, где могут появляться отдельные ошибки, общий смысл сохраняется, а текст остаётся связным и пригодным для работы.

Главное достоинство своего решения – гибкость. Мы не зависим от внешнего API и можем улучшать бота под свои нужды. Например, следующий шаг, который напрашивается, – добавить поддержку длинных файлов через облако. Сейчас, если аудио больше 20 МБ, бот откажет, но можно реализовать прием не файла, а ссылки (например, на тот же Google Drive или Яндекс.Диск) и тогда снимать ограничение по длине вообще. Я провёл эксперимент: подключил к боту функцию скачивания по URL с Google Drive – получилось успешно расшифровать и часовой файл (разбив его на множество кусков). Такое улучшение можно интегрировать в следующей версии бота.

Другие направления для развития: подключение диаризации (определение спикеров) с помощью моделей вроде pyannote.audio – это позволило бы помечать, где говорит один человек, а где другой. Пока что мой бот этого не делает (речь идёт единым потоком), но технически GigaAM предоставляет некоторые средства для сегментации, так что эту функцию тоже можно внедрить. Также можно добавить поддержку английского языка – модель GigaAM обучена преимущественно на русском, но умеет распознавать и английскую речь (хотя тут она, вероятно, уступает специализированным моделям). В целом, архитектура бота позволяет подменить движок распознавания на любой другой. Таким образом, построенный каркас универсален.

Подводя итог, я получил удобного ассистента для расшифровки аудио прямо в Telegram. Он превращает долгие голосовые сообщения в текст, разбитый по минутам, что экономит время при прослушивании. Несмотря на то, что Telegram Premium теперь предлагает голос-to-text, свой бот выигрышно отличается отсутствием ограничений по типу/длине аудио и возможностью кастомизации результата (таймкоды, форматирование). Ну а использование отечественной STT модели показало на практике, насколько мощны и доступны стали открытые технологии распознавания речи – качество не уступает лучшим коммерческим сервисам, а местами и превосходит их. Далее я планирую шлифовать бота, добавляя новые функции, и, возможно, выложу его исходники в открытый доступ – пусть каждый желающий сможет развернуть себе такого расшифровщика и не зависеть от чужих ограничений.

Спасибо за внимание и успехов в ваших проектах!

Источник

Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.

Вам также может быть интересно

XRP демонстрирует возобновление покупательской активности со стороны крупных инвесторов – вот сколько они купили

XRP демонстрирует возобновление покупательской активности со стороны крупных инвесторов – вот сколько они купили

Продолжающаяся волатильность цен на криптовалютном рынке продолжает препятствовать росту XRP, поскольку недавние попытки роста сталкиваются со значительным сопротивлением на уровне $
Поделиться
Bitcoinist2025/12/26 22:00
Лучшие мем-коины для покупки в 2026 году: Canton Coin взлетает на институциональных новостях, а DeepSnitch AI определяет следующее поколение вирусных крипто-проектов

Лучшие мем-коины для покупки в 2026 году: Canton Coin взлетает на институциональных новостях, а DeepSnitch AI определяет следующее поколение вирусных крипто-проектов

Наслаждайтесь любимыми видео и музыкой, загружайте оригинальный контент и делитесь всем этим с друзьями, семьей и всем миром на YouTube.
Поделиться
Blockchainreporter2025/12/26 22:40
Технический директор Ripple Дэвид Шварц призывает к более безопасным обновлениям программного обеспечения крипто-кошельков

Технический директор Ripple Дэвид Шварц призывает к более безопасным обновлениям программного обеспечения крипто-кошельков

Технический директор Ripple Дэвид Шварц предупреждает о поспешных обновлениях криптовалютных кошельков, которые могут подвергнуть пользователей угрозам безопасности. Шварц призывает разработчиков кошельков позволить пользователям
Поделиться
Coincentral2025/12/26 22:40