AI · 7 мин чтения

Whisper: интеграция распознавания речи на сайт или в бота

Последние полгода ко мне регулярно приходят с одной и той же задачей: нужно, чтобы бот или сайт понимал голосовые сообщения. Кто-то хочет принимать заявки голосом в 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 обычно проходит по требованиям, но это стоит сверять с юристом проекта до начала интеграции, а не после.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно