Последние полгода ко мне регулярно приходят с одной и той же задачей: нужно, чтобы бот или сайт понимал голосовые сообщения. Кто-то хочет принимать заявки голосом в Telegram, кто-то - расшифровывать звонки из CRM, кто-то делает голосовой поиск по каталогу. Во всех случаях интеграция Whisper для распознавания речи закрывает задачу быстрее, чем городить собственную ML-модель - движок открытый, а качество на русском языке у него на порядок выше, чем у большинства платных SaaS-сервисов распознавания, которые я тестировал в 2023-2024 годах.
Что такое Whisper и почему не Google Speech-to-Text
Whisper - модель распознавания речи от OpenAI, обученная на 680 тысячах часов аудио на разных языках. Она вышла в открытый доступ в 2022 году, и с тех пор появилось несколько практичных форков: faster-whisper (та же модель, но в 4 раза быстрее за счёт CTranslate2) и whisper.cpp (версия на C++ для запуска без Python и без GPU).
На практике сравнивал с Google Speech-to-Text и Yandex SpeechKit на звонках с шумом на фоне и русской разговорной речью с числительными и адресами. Whisper стабильно давал меньше ошибок на слитной речи и на смеси русского с английскими терминами - актуально для IT-продуктов, где в голосовом сообщении может проскочить «зарегистрируй аккаунт в CRM». У Google и Yandex точность на чистой студийной записи сопоставима, но на реальных голосовых из Telegram, записанных на телефон в метро, Whisper выигрывает.
Минус один: у Whisper нет встроенной диаризации (разделения речи по говорящим) и нет пунктуации в лёгких моделях - это либо отдельная библиотека (pyannote), либо доработка промпта при использовании GPT поверх транскрипта.
Локальная модель или API OpenAI: что ставить в прод
Первый вопрос, который решаю на каждом проекте - где крутить модель. Вариантов два, и они принципиально разные по деньгам и по инфраструктуре.
| Критерий | OpenAI Whisper API | Локальный faster-whisper |
|---|---|---|
| Стоимость | $0.006 за минуту аудио | только сервер (GPU или мощный CPU) |
| Скорость ответа | 2-5 сек на голосовое до минуты | 0.5-3 сек на GPU, 3-8 сек на CPU |
| Приватность данных | аудио уходит на серверы OpenAI | всё остаётся на вашей инфраструктуре |
| Лимиты | rate limit по ключу, файл до 25 МБ | ограничены только железом |
| Поддержка моделей | только large-v2/v3 | tiny/base/small/medium/large-v3 на выбор |
Для стартапов и MVP почти всегда беру API - не нужно поднимать GPU-сервер ради экспериментальной фичи. Для медицинских, юридических или банковских проектов, где аудио с персональными данными нельзя передавать на сторону, разворачиваю faster-whisper на своём сервере с моделью medium или large-v3 - на видеокарте уровня RTX 4060 это укладывается в 1-2 секунды на голосовое сообщение до 30 секунд.
Какую модель выбирать по размеру
- tiny и base - для черновой транскрибации, где ошибки в словах не критичны (например, поиск ключевых слов в звонке)
- small - разумный баланс для ботов с короткими голосовыми командами
- medium - то, что обычно ставлю в прод для распознавания заявок и обращений на русском
- large-v3 - когда в записи специфичная терминология, акценты или смешанная речь, и цена ошибки высокая (медицина, юриспруденция)
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Распознавание речи в Telegram-боте на aiogram
Самый частый запрос - голосовые сообщения в боте вместо текстового ввода. В aiogram это делается через обработчик content_types=ContentType.VOICE, дальше файл скачивается, конвертируется из .ogg в .wav через ffmpeg (Whisper API принимает ogg напрямую, но локальная модель работает надёжнее с wav) и отправляется на распознавание.
from aiogram import types, Router
from aiogram.enums import ContentType
import openai
router = Router()
client = openai.AsyncOpenAI(api_key="sk-...")
@router.message(lambda m: m.content_type == ContentType.VOICE)
async def handle_voice(message: types.Message, bot):
file = await bot.get_file(message.voice.file_id)
file_path = f"voices/{message.voice.file_id}.ogg"
await bot.download_file(file.file_path, file_path)
with open(file_path, "rb") as audio:
transcript = await client.audio.transcriptions.create(
model="whisper-1",
file=audio,
language="ru"
)
await message.answer(f"Распознал: {transcript.text}")
В реальных ботах вокруг этого куска обычно добавляю: очередь на обработку (если голосовых много одновременно), лимит длины файла (Whisper API режет на 25 МБ), и логирование транскриптов в базу для аналитики - часто клиенты потом хотят видеть, что чаще всего спрашивают голосом.
Если бот работает на потоке заявок (например, приём обращений от курьеров или заказов на доставку через СДЭК), transcript.text дальше передаю в GPT для извлечения структурированных данных - адрес, телефон, товар - вместо того, чтобы парсить текст регулярками.
Виджет распознавания голоса на сайте и в Tilda
На сайте задача сложнее, чем в боте: браузер не может просто взять и отправить голос в OpenAI - ключ API нельзя палить на фронте. Поэтому схема всегда через бэкенд-прокси: браузер записывает аудио через MediaRecorder API, отправляет blob на свой сервер, сервер уже стучится в Whisper и возвращает текст.
Для Tilda делаю это через кастомный JS-блок (Zero Block или T123 с вставленным скриптом): кнопка записи через getUserMedia, запись в webm, отправка на серверный вебхук по fetch. Сам Whisper на Tilda не разместить - там только фронтенд, бэкенд поднимаю отдельно на VPS или serverless-функции. Такую интеграцию с оформлением кнопки, обработкой ошибок микрофона и вебхуком под ключ обычно делаю как доработку кастомного скрипта для Tilda - учитывая, что фронтенд и бэкенд связаны, работа идёт как единая задача, а не два отдельных модуля.
На WordPress и кастомных SPA то же самое, только без ограничений Tilda - можно сразу писать серверную часть на Node.js или Python рядом с остальным бэкендом, без отдельного домена под вебхук.
Пример серверного эндпоинта на Node.js
app.post('/api/transcribe', upload.single('audio'), async (req, res) => {
const response = await openai.audio.transcriptions.create({
file: fs.createReadStream(req.file.path),
model: 'whisper-1',
language: 'ru',
});
res.json({ text: response.text });
});
Важный момент - таймауты. Голосовое на 20-30 секунд Whisper API обрабатывает за 3-5 секунд, но если пользователь на сайте наговорил 2-3 минуты, ответ может идти 15-20 секунд, и фронтенду нужен явный индикатор загрузки, иначе кажется, что форма зависла.
Автоматизация транскрибации через n8n
Когда речь не про диалог в реальном времени, а про пакетную обработку - расшифровку звонков из CRM, голосовых из общего чата, записей встреч - ставлю n8n вместо кастомного бэкенда. Логика простая: триггер на новый файл (вебхук от АТС, папка в Google Drive, событие в CRM) → HTTP Request нод на OpenAI Audio API или на локальный faster-whisper-сервер → запись результата обратно в CRM или таблицу.
Плюс n8n здесь в том, что не пишешь отдельный сервис ради интеграции - весь пайплайн собирается визуально за день-два, и его проще передать на поддержку человеку без бэкграунда в Python. На одном из проектов так подключали расшифровку звонков из телефонии в amoCRM: n8n забирал запись по вебхуку после завершения звонка, гонял её через локальный Whisper (звонки с персональными данными клиентов) и записывал текст в карточку сделки - менеджеры перестали слушать записи вручную, чтобы найти нужный момент разговора.
Сколько стоит и сколько занимает интеграция
Цены зависят от того, куда встраивается распознавание и что происходит с текстом дальше.
- Голосовые сообщения в Telegram-боте (aiogram, готовая транскрибация через API) - от 30 000 ₽
- Виджет записи голоса на сайте с серверным прокси - кастомный скрипт для Tilda с комплексной интеграцией от 40 000 ₽, для WordPress отдельно закладывается в стоимость сайта
- Автоматизация транскрибации через n8n (звонки, встречи, чаты) - от 25 000 ₽
- Связка Whisper + GPT для извлечения структурированных данных из речи (RAG, классификация обращений) - от 50 000 ₽
По срокам: простой приём голосовых в боте с ответом текстом закрываю за 3-5 рабочих дней. Виджет на сайте с серверной частью, обработкой ошибок микрофона и адаптацией под разные браузеры - от 7 до 10 дней. Пайплайн в n8n с интеграцией в CRM и локальным Whisper-сервером - от 10 дней, основное время уходит не на саму транскрибацию, а на настройку сервера с GPU и тестирование под реальную нагрузку.
На рынке за похожие задачи в студиях встречал ценники от 60 000 до 150 000 ₽ - разброс объясняется тем, что часть подрядчиков закладывает разработку собственного распознавания вместо готовой модели, что для 95% задач избыточно.
Искусственный интеллект для бизнеса
AI / Claude API
от 50 000 ₽
Подробнее →Частые вопросы
Можно ли использовать Whisper бесплатно в коммерческом проекте?
Сама модель Whisper выложена под лицензией MIT, и локальный запуск через faster-whisper или whisper.cpp не требует лицензионных отчислений - платите только за сервер. OpenAI Whisper API - платный, тарификация по минутам аудио ($0.006 за минуту на момент публикации), это отдельная статья расходов, которую я закладываю в смету проекта отдельно от стоимости разработки.
Понимает ли Whisper русский язык так же хорошо, как английский?
На моделях medium и large-v3 точность на русском разговорном языке близка к английскому - разница в основном на именах собственных, аббревиатурах и смешанной речи. На моделях tiny и base просадка по русскому заметнее, поэтому для боевых проектов с русской аудиторией беру не ниже small.
Нужна ли видеокарта для локального Whisper?
Нет, но без неё будет медленнее. На CPU faster-whisper с моделью small обрабатывает минуту аудио за 5-10 секунд - для пакетной обработки звонков это нормально, для чат-бота с ответом в реальном времени лучше GPU или API OpenAI.
Как быть с приватностью, если аудио содержит персональные данные?
Если данные нельзя передавать на сторонние серверы (медицинские записи, банковские звонки), беру локальный faster-whisper на своём или клиентском сервере - аудио никуда не уходит. Для менее чувствительных данных API OpenAI обычно проходит по требованиям, но это стоит сверять с юристом проекта до начала интеграции, а не после.