Legan Studio
Все статьи
~ 16 мин чтения

Голосовой бот в MAX: распознавание и синтез речи

Как сделать голосового бота в MAX: ASR (распознавание), TTS (синтез), обработка голосовых сообщений, типичные сценарии и ограничения.

  • MAX
  • AI
  • сценарии

Голосовое сообщение — самый ленивый и самый быстрый способ написать боту. Пользователь не набирает длинный запрос на ходу, в перчатках, с ребёнком на руках или за рулём — он зажимает кнопку микрофона и говорит. А бот превращает аудио в текст и пускает его в обычный пайплайн. STT-движки последних поколений (Whisper Large v3, Distil-Whisper, Yandex SpeechKit, GigaAM, SaluteSpeech) делают это стабильно даже на шумной записи из метро или с улицы.

В этой статье разберём весь жизненный цикл голосового бота в MAX: как мессенджер передаёт voice-сообщения через Bot API, какие STT-сервисы выбрать под русский язык, как сравнивать TTS-движки, как собрать пайплайн на Python, посчитать стоимость на 1000 пользователей и не нарушить 152-ФЗ при работе с биометрией.

Зачем боту в MAX голос

Голосовой ввод — не модный гаджет, а реальный UX-паттерн с понятной аудиторией.

  • В дороге. Пользователь за рулём, в метро или с пакетами в руках не может набрать текст. Голос — единственный канал ввода.
  • Скорость диктовки. Средняя скорость набора на мобильной клавиатуре — 30–40 слов в минуту, диктовка — 120–160. Для длинных сообщений выигрыш в 4 раза.
  • Accessibility. Пользователи с нарушениями зрения, моторики, дислексией. Голос снимает барьер и делает бота доступным.
  • Снижение трения. Открыть бот, нажать и держать кнопку микрофона — два действия. Открыть бот, тапнуть в поле, набрать, отправить — четыре действия плюс умственная нагрузка на формулировку.
  • Эмоциональный канал. В голосе есть интонация, паузы, сомнение. Для бота-собеседника, коуча или психолога это даёт глубину, недоступную тексту.
  • Локальный фактор MAX. Аудитория мессенджера — преимущественно RU-сегмент, и качественные русскоязычные STT/TTS (Yandex SpeechKit, SaluteSpeech, GigaAM) работают здесь лучше, чем в любом другом канале.

Сценарии использования

Самые жизнеспособные продуктовые сценарии для голосовых ботов в MAX.

  • Голосовой ассистент по делам. Пользователь надиктовывает «купить молоко, забрать заказ, позвонить маме» — бот раскладывает по задачам и ставит напоминания.
  • Расшифровка voice-сообщений. Пользователь пересылает в бот голосовое из рабочего чата, получает текст. Незаменимо для тех, кто на встречах или в шумном офисе.
  • Бот-собеседник и психолог. Голос делает разговор живым. LLM-обвязка с TTS-ответом превращает чат в диалог, а не в обмен текстами.
  • Обучение языкам. Бот произносит фразу, пользователь повторяет, STT оценивает произношение, TTS даёт обратную связь. Хорошо ложится в формат коротких уроков.
  • Медицинские заметки. Врач после приёма надиктовывает протокол — бот сохраняет в EHR. Один из самых платежеспособных сегментов и одновременно самый требовательный к 152-ФЗ.
  • Полевые отчёты. Курьер, монтажник, сервис-инженер диктует отчёт по объекту с фото. Бот собирает структурированную карточку и отправляет в CRM.
  • Транскрибация подкастов и интервью. Пользователь шлёт длинный аудиофайл, бот возвращает текст с таймкодами и спикерами.
  • Голосовой поиск товаров. «Найди женские кроссовки до пяти тысяч с доставкой завтра» — бот собирает фильтры и выдаёт карточки.

Базовый pipeline

Голосовой бот в MAX укладывается в простую схему.

voice (OGG/OPUS) → download → ffmpeg (WAV 16kHz mono) → STT → текст
                                                               ↓
                                                     LLM / handler / FSM
                                                               ↓
                                  ответ ← sendVoice (OGG) ← ffmpeg ← TTS

Минимальный цикл умещается в 200 строк кода на Python. На холодный старт уходит 3–7 секунд из-за загрузки модели в память — держите процесс живым, не запускайте Whisper на каждый запрос.

Что приходит из MAX

Голосовые сообщения в MAX Bot API приходят как медиавложение типа voice (или audio для музыкальных файлов). Структура близка к Telegram Bot API: апдейт содержит file_id, duration, mime_type (обычно audio/ogg) и file_size. Аудиофайл — OGG-контейнер с кодеком OPUS, моно, 48 кГц. Скачивается через метод getFile плюс загрузку по полученному file_path.

Помимо voice бывает audio (mp3/m4a) и видео-кружки. Голосовой бот обычно поддерживает все три типа, унифицированно конвертируя их в один формат для STT.

Лимит размера файла для скачивания через публичный Bot API — около 20 МБ (как в большинстве чат-API). При длинных voice (диктофонные записи 30+ минут) часть случаев упрётся в лимит — для таких сценариев используйте загрузку по прямой ссылке или клиентскую разбивку перед отправкой.

Сравнение STT-сервисов

Под русский язык реально работают следующие движки. Цены актуальны на начало 2026 года, проверяйте перед интеграцией.

ДвижокЯзык RUЦена за минутуLatencyТочность (WER)On-prem
OpenAI Whisper APIХорошооколо 0.006 USD1–3 с5–8%Нет
Whisper large-v3 (локально)ХорошоТолько GPU0.5–2 с (GPU)5–8%Да
faster-whisper (CTranslate2)ХорошоCPU/GPU0.3–1 с (GPU)5–8%Да
Distil-WhisperУдовл.Только GPU0.1–0.5 с6–9%Да
Yandex SpeechKitОтличнооколо 0.18 RUB0.5–1.5 с4–7%Гибрид
SaluteSpeech (Сбер)Отличнооколо 0.15 RUB0.5–1.5 с4–7%Гибрид
Google Speech-to-TextХорошооколо 0.024 USD1–2 с5–8%Нет
Azure SpeechХорошооколо 1 USD за час1–2 с5–8%Контейнер
GigaAM (Сбер, open)ОтличноТолько GPU0.3–1 с4–7%Да
VoskУдовл.CPU/GPU0.5–2 с10–15%Да

Что выбрать. Для прототипа — OpenAI Whisper API, минимум кода. Для продакшна с бюджетом — Yandex SpeechKit или SaluteSpeech: оба заточены под русский с лучшим WER и хостятся в РФ, что снимает половину 152-ФЗ-вопросов. Для on-prem (медицина, госзакупки, чувствительные данные) — faster-whisper large-v3 или GigaAM на собственном GPU. Для CPU-only сервера — faster-whisper medium с квантизацией int8 или Vosk small.

Сравнение TTS-движков

ДвижокЯзык RUЦенаКачествоЭмоции/SSMLOn-prem
Yandex SpeechKit TTSОтличнооколо 0.40 RUB за 1000 симв.ВысокоеДа, SSMLГибрид
SaluteSpeech TTSОтличнооколо 0.35 RUB за 1000 симв.ВысокоеДаГибрид
OpenAI TTS (tts-1, tts-1-hd)Удовл.около 15 USD за 1М симв.ВысокоеБазовоНет
ElevenLabsУдовл. (мультиязычная v2)около 22 USD за 100k симв.Очень высокоеДаНет
Silero TTSХорошоБесплатноСреднееБазовоДа
Coqui TTS (XTTS v2)Удовл.БесплатноСреднее-высокоеГолосовое клонированиеДа

Что выбрать. Для русского коммерческого продукта — Yandex SpeechKit TTS, лучший каталог голосов и SSML. Для on-prem без бюджета — Silero TTS, запускается на CPU без GPU, бесплатно. Для бренд-голоса (свой уникальный тембр) — Coqui XTTS v2 или ElevenLabs с осторожностью к ограничениям и трансграничной передаче ПДн.

Скачивание voice через MAX Bot API

import httpx
import aiofiles

API_BASE = "https://botapi.max.ru/v1"

async def download_voice(token: str, file_id: str, dest: str) -> None:
    async with httpx.AsyncClient(timeout=30) as client:
        meta = await client.get(
            f"{API_BASE}/files/{file_id}",
            params={"access_token": token},
        )
        meta.raise_for_status()
        file_path = meta.json()["file_path"]

        async with client.stream("GET", file_path) as resp:
            async with aiofiles.open(dest, "wb") as f:
                async for chunk in resp.aiter_bytes():
                    await f.write(chunk)

После скачивания получаем OGG/OPUS. Конвертируем в WAV 16 кГц моно — оптимальный вход для большинства STT.

ffmpeg -i voice.ogg -ar 16000 -ac 1 -c:a pcm_s16le voice.wav

В Python вызываем через subprocess или используем pydub либо ffmpeg-python как обёртки.

Handler: voice → STT → LLM → TTS → sendVoice

Полный цикл — приём голосового, распознавание через Whisper API, ответ от GigaChat, синтез речи через Yandex SpeechKit и отправка обратно методом sendVoice.

import asyncio
import tempfile
from pathlib import Path
import httpx
from openai import AsyncOpenAI

oai = AsyncOpenAI(api_key=OPENAI_KEY)

async def voice_handler(update: dict) -> None:
    chat_id = update["message"]["chat"]["chat_id"]
    voice = update["message"]["body"]["attachments"][0]
    file_id = voice["payload"]["file_id"]

    with tempfile.TemporaryDirectory() as tmp:
        ogg_path = Path(tmp) / "in.ogg"
        wav_path = Path(tmp) / "in.wav"
        out_wav = Path(tmp) / "out.wav"
        out_ogg = Path(tmp) / "out.ogg"

        # 1. Скачать voice
        await download_voice(MAX_TOKEN, file_id, str(ogg_path))

        # 2. Конвертировать в WAV 16kHz mono
        await run_ffmpeg(["-i", str(ogg_path), "-ar", "16000",
                          "-ac", "1", str(wav_path)])

        # 3. STT через Whisper API
        with open(wav_path, "rb") as f:
            stt = await oai.audio.transcriptions.create(
                model="whisper-1", file=f, language="ru"
            )
        user_text = stt.text

        # 4. LLM ответ через GigaChat
        answer = await gigachat_reply(user_text)

        # 5. TTS через Yandex SpeechKit
        await yandex_tts(answer, out_wav)

        # 6. Конвертировать обратно в OGG/OPUS для sendVoice
        await run_ffmpeg(["-i", str(out_wav), "-c:a", "libopus",
                          "-b:a", "24k", str(out_ogg)])

        # 7. Отправить voice в MAX
        await send_voice(chat_id, out_ogg)


async def run_ffmpeg(args: list[str]) -> None:
    proc = await asyncio.create_subprocess_exec(
        "ffmpeg", "-y", *args,
        stdout=asyncio.subprocess.DEVNULL,
        stderr=asyncio.subprocess.DEVNULL,
    )
    await proc.wait()

Отправка voice в MAX — двухшаговая: загружаем файл через uploads, получаем токен и шлём его методом sendMessage с типом вложения audio.

async def send_voice(chat_id: int, path: Path) -> None:
    async with httpx.AsyncClient(timeout=30) as client:
        upload = await client.post(
            f"{API_BASE}/uploads",
            params={"access_token": MAX_TOKEN, "type": "audio"},
        )
        upload_url = upload.json()["url"]

        with open(path, "rb") as f:
            r = await client.post(upload_url, files={"data": f})
            token = r.json()["token"]

        await client.post(
            f"{API_BASE}/messages",
            params={"access_token": MAX_TOKEN, "chat_id": chat_id},
            json={"attachments": [{"type": "audio",
                                   "payload": {"token": token}}]},
        )

Вызов Yandex SpeechKit TTS

async def yandex_tts(text: str, dest: Path) -> None:
    url = "https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize"
    headers = {"Authorization": f"Api-Key {YANDEX_API_KEY}"}
    data = {
        "text": text,
        "lang": "ru-RU",
        "voice": "ermil",
        "emotion": "good",
        "format": "lpcm",
        "sampleRateHertz": 48000,
    }
    async with httpx.AsyncClient(timeout=30) as client:
        async with client.stream("POST", url, headers=headers,
                                 data=data) as resp:
            with open(dest, "wb") as f:
                async for chunk in resp.aiter_bytes():
                    f.write(chunk)

LPCM — сырые сэмплы без заголовка. Для отдачи в ffmpeg используйте флаги -f s16le -ar 48000 -ac 1 на входе.

Какую модель Whisper брать

Whisper выпускается в нескольких размерах: tiny, base, small, medium, large-v3.

  • tiny / base — для русского почти не подходят, WER 15–25%.
  • small (244M) — реалистичный минимум, WER 8–12%.
  • medium (769M) — стабильная рабочая лошадка, WER 6–9%.
  • large-v3 (1.5B) — идеал, WER 5–8%.
  • Distil-Whisper — компактнее в 6 раз, скорость в 6 раз выше, потеря качества порядка 1% WER.

На GPU 16 ГБ large-v3 обрабатывает 30 секунд аудио примерно за секунду. На CPU — 10–30 секунд. Для продакшна на CPU берите faster-whisper с моделью medium и квантизацией int8 — ускорение в 3–4 раза без заметной деградации качества.

Стриминг ответа

Для естественности диалога ответ можно отдавать порциями: пока LLM генерирует следующее предложение, TTS уже синтезирует предыдущее, а MAX уже воспроизводит первое. Это даёт ощущение живой реакции вместо монолитной паузы в 5–10 секунд.

Подход: разбиваем поток LLM по предложениям через re.split(r'(?<=[.!?])\s+', text), на каждое предложение запускаем TTS параллельно, отправляем sendVoice по мере готовности. Минус — пользователь получает несколько голосовых вместо одного, нужно обсудить с дизайнером сценария. Альтернатива — буферизовать первые 1–2 предложения, отправить как одно voice, остальное добивать вторым.

Распознавание длинных voice

MAX (как и большинство мессенджеров) пускает голосовые продолжительностью до часа. Whisper рассчитан на чанки до 30 секунд, дальше сегментирует сам, но память растёт линейно от длины.

Стратегия для длинных файлов:

  • VAD-сегментация. Silero VAD режет на куски по паузам, длиной 20–30 секунд каждый.
  • Параллельная обработка в пуле воркеров.
  • Сборка результата с учётом перекрытий (5% overlap, чтобы не терять слова на стыках).
  • Дедупликация повторов на стыках по совпадению последних 3 слов.
from silero_vad import load_silero_vad, get_speech_timestamps

vad = load_silero_vad()
timestamps = get_speech_timestamps(audio, vad, sampling_rate=16000,
                                    min_silence_duration_ms=500)
chunks = [audio[ts["start"]:ts["end"]] for ts in timestamps]

Качество и подводные камни

Что регулярно ломает распознавание.

  • Долгие паузы. Whisper иногда «галлюцинирует» субтитры на участках тишины (известный баг — повторяет «спасибо за просмотр»). Помогает VAD (Silero VAD, WebRTC VAD) — отрезает тишину перед прогоном.
  • Шум вокруг. Транспорт, ветер, чужая речь. Помогает шумодав вроде RNNoise или DeepFilterNet перед распознаванием.
  • Суржик. Whisper хорошо знает русский, но если пользователь смешивает русский с английскими терминами, явно укажите language="ru" — иначе модель может уйти в украинский или белорусский.
  • Длинные сообщения. Бейте на куски по 30 секунд через VAD и склеивайте текст с учётом перекрытий.
  • Низкое качество микрофона. Дешёвые гарнитуры через Bluetooth дают сэмпл-рейт 8 кГц после кодеков HFP. Whisper переживает, но WER растёт на 3–5%.

Распознавание спикеров (диаризация)

Для группового voice или интервью полезно отличать «кто говорит». Базовая диаризация:

  • pyannote.audio — open source, точность 5–10% DER на русском.
  • Yandex SpeechKit Speaker Diarization — облачное API.
  • NeMo (NVIDIA) — open source, требует GPU, отличное качество на длинных записях.

Pipeline: STT даёт текст и таймкоды слов, диаризация — таймкоды спикеров; объединяем по пересечению временных интервалов и получаем диалог вида «Спикер 1: …», «Спикер 2: …».

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

Латентность

Восприятие голосового бота сильно зависит от задержки. Целевая планка — менее 3 секунд от конца записи до начала ответа. На что влияет.

  • Размер модели. Distil-Whisper-small справится быстрее, чем Whisper-large.
  • Видеокарта против CPU. GPU быстрее в 5–20 раз.
  • Стриминговое распознавание. Некоторые движки (SaluteSpeech, Yandex SpeechKit, Deepgram) выдают частичный текст уже во время загрузки. Whisper API так не умеет.
  • Параллельные запросы. Модель не масштабируется бесконечно — нужен пул воркеров и очередь.
  • Сетевой round-trip. Облачный STT добавляет 200–500 мс на загрузку файла. На длинных voice это терпимо, на коротких реакциях ощутимо.
  • Холодный старт. На запуск Whisper уходит 3–7 секунд из-за загрузки модели в память. Держите процесс живым.

Приватность и 152-ФЗ

Голос — это биометрические персональные данные, специальная категория по 152-ФЗ. Юридические последствия серьёзнее, чем при работе с обычным текстом.

  • В политике конфиденциальности нужна отдельная строка про обработку голоса, цели и срок хранения.
  • Отдельное письменное согласие на обработку биометрии. В контексте бота — клик с явной формулировкой и логированием.
  • С июня 2025 биометрия для коммерческих целей должна сдаваться в ГИС ЕБС или храниться с дополнительной сертификацией. Для большинства ботов проще не хранить аудио вовсе.
  • Если можно не хранить аудио после распознавания — не храните, оставляйте только текст.
  • Хранение аудио увеличивает риски утечки и требует усиленной защиты: шифрование в покое, доступ только по необходимости, журнал доступа.
  • Для медицинских и финансовых ботов — отдельный аудит и согласие с подписью.

Передача голоса в OpenAI/Google/ElevenLabs — это трансграничная передача ПДн в недружественные страны. Требуется уведомление РКН и юридическая обвязка. На практике большинство студий, работающих с MAX, выбирает Yandex SpeechKit, SaluteSpeech или GigaAM именно по этой причине — данные не покидают РФ.

Стоимость на 1000 пользователей

Допустим, 1000 активных пользователей в день, средний пользователь шлёт 3 голосовых по 15 секунд и получает 3 голосовых ответа по 200 символов.

Облачный сценарий (Yandex SpeechKit STT + TTS).

  • STT: 1000 × 3 × 15 с = 45 000 с = 750 мин × 0.18 RUB = 135 RUB в день.
  • TTS: 1000 × 3 × 200 = 600 000 симв. = 600 × 0.40 RUB = 240 RUB в день.
  • Итого: примерно 375 RUB в день, около 11 000 RUB в месяц на STT/TTS.
  • Плюс LLM (если есть): GigaChat Pro примерно 1500–3000 RUB в день при тех же объёмах.

Self-hosted сценарий (faster-whisper large-v3 + Silero TTS на одной GPU).

  • Аренда GPU-сервера с RTX 4090 (24 ГБ): около 25 000 RUB в месяц.
  • Электричество и обслуживание (если своё железо): около 10 000 RUB в месяц.
  • При нагрузке выше 5000 пользователей в день облако становится дороже железа. Точка перелома — 3000–5000 DAU.

Кеширование и оптимизация

Простые приёмы экономии на STT/TTS.

import hashlib
import json
from redis.asyncio import Redis

redis = Redis(host="localhost")

async def cached_tts(text: str, voice: str = "ermil") -> bytes:
    key = f"tts:{voice}:{hashlib.sha256(text.encode()).hexdigest()}"
    cached = await redis.get(key)
    if cached:
        return cached

    audio = await synthesize(text, voice)
    await redis.set(key, audio, ex=86400 * 30)
    return audio


async def cached_stt(audio_bytes: bytes) -> str:
    key = f"stt:{hashlib.sha256(audio_bytes).hexdigest()}"
    cached = await redis.get(key)
    if cached:
        return json.loads(cached)["text"]

    text = await transcribe(audio_bytes)
    await redis.set(key, json.dumps({"text": text}), ex=86400 * 7)
    return text

Что даёт ощутимую экономию на практике.

  • Кеш TTS. Часто повторяющиеся фразы (приветствие, ошибки, подтверждения) синтезируем один раз, хранится в Redis или на диске. MAX, как и Telegram, позволяет переиспользовать file_id после первой загрузки — отправили один раз, дальше шлём только токен без повторного аплоада.
  • Хеш по voice. Если одно и то же голосовое присылается повторно (часто бывает при пересылках в групповых чатах), считаем sha256 файла, кеш на текст распознавания.
  • Дешёвая модель на коротких voice. До 3 секунд — Whisper-small, дольше — large-v3. Экономия 30–40% GPU-времени без потери UX.
  • Фоновая прогрузка модели. На старте контейнера держим Whisper в памяти, не загружаем по запросу.
  • Батчинг. faster-whisper умеет batch inference; при большом потоке коротких voice экономия времени до 2 раз.

Российские альтернативы для on-prem

Когда облако недоступно по требованиям безопасности (медицина, госструктуры, банки) или невыгодно по цене (5000+ DAU), идут в self-hosted. Российские варианты для MAX-ботов.

  • Yandex SpeechKit on-prem. Контейнер с моделями, разворачивается во внутреннем контуре. Цена обсуждается индивидуально, обычно от 500 000 RUB в год.
  • SaluteSpeech on-prem. Аналогично, доступно через Сберкорус. Хорошо подходит для финансового сектора.
  • GigaAM. Open source от Сбера, бесплатно, требует GPU. Качество на уровне коммерческих сервисов.
  • Vosk. Open source, работает на CPU, точность ниже Whisper (WER 10–15%), но для простых сценариев и embedded достаточно.
  • Silero TTS. Open source, бесплатно, CPU. Идеален для on-prem TTS без бюджета.

Связка GigaAM + Silero TTS на одной GPU полностью закрывает голосовой пайплайн в закрытом контуре без копейки за лицензии.

Тестирование голосового бота

Голосовой бот тестируется сложнее текстового.

  • Юнит-тесты на текстовый поток (после STT) — обычные, как для любого бота.
  • Регрессия STT — заранее записанные wav-файлы и эталонные транскрипты, считаем WER на каждый релиз.
  • Регрессия TTS — слушаем вручную или используем Mean Opinion Score, нет хорошего автомата.
  • E2E — пользовательский сценарий «нажал запись → говорю → жду ответ» прогоняется на стейдже с заранее записанными аудио.
  • Нагрузочные тесты — параллельные voice от 100+ виртуальных пользователей, замеряем p95 латентности и rate ошибок.

Итого

Голосовой бот в MAX — это стандартный пайплайн «приём → декодирование → STT → логика → TTS → отправка», в котором главные риски сидят в качестве распознавания, выборе движка и юридической обвязке вокруг биометрии. Берите Yandex SpeechKit или SaluteSpeech для коммерческого продукта на русском, faster-whisper large-v3 или GigaAM — для on-prem. TTS — Yandex SpeechKit или Silero. Обязательно VAD против тишины, явное language="ru", кеш частых ответов через Redis и переиспользование file_id в MAX. Считайте экономику до запуска: на 5000+ DAU собственная GPU дешевле облака. Не храните аудио без явной нужды и согласия — это снимает 90% юридических вопросов с биометрией.

Частые вопросы

Как MAX передаёт голосовые сообщения боту?

Голосовые приходят в апдейте как вложение типа voice — это file_id, duration, mime_type (обычно audio/ogg) и file_size. Аудиофайл — OGG-контейнер с кодеком OPUS, моно, 48 кГц. Скачивается через метод getFile плюс загрузку по полученному file_path. Помимо voice бывает audio (mp3/m4a) и видео-кружки. Голосовой бот обычно поддерживает все три типа, унифицированно конвертируя в один формат для STT. Лимит размера файла для скачивания через Bot API — около 20 МБ; при длинных voice часть случаев упрётся в лимит и потребует клиентской разбивки или прямой загрузки.

Какой STT-движок выбрать для русскоязычного бота в MAX?

Для прототипа — OpenAI Whisper API, минимум кода и около 0.006 USD за минуту. Для продакшна с бюджетом — Yandex SpeechKit или SaluteSpeech, оба заточены под русский с лучшим WER 4–7% и ценой около 0.15–0.18 RUB за минуту, плюс данные не покидают РФ. Для on-prem (медицина, госзакупки, чувствительные данные) — faster-whisper large-v3 или GigaAM на собственном GPU. Для CPU-only сервера берите faster-whisper medium с квантизацией int8. Distil-Whisper компактнее в 6 раз и быстрее в 6 раз с потерей около 1% WER.

Какой TTS-движок брать для ответа голосом?

Для русского коммерческого продукта — Yandex SpeechKit TTS, около 0.40 RUB за 1000 символов, хороший каталог голосов, SSML и эмоции. SaluteSpeech дешевле — около 0.35 RUB за 1000 символов. Для on-prem без бюджета — Silero TTS, запускается на CPU без GPU, бесплатно, среднее качество. Для голосового клонирования (свой бренд-голос) — Coqui XTTS v2 или ElevenLabs с осторожностью к ограничениям и трансграничной передаче ПДн. OpenAI TTS работает с русским удовлетворительно и стоит около 15 USD за 1М символов.

Какие проблемы распознавания речи в MAX-боте?

Долгие паузы — Whisper иногда галлюцинирует субтитры на тишине (повторяет «спасибо за просмотр»), помогает VAD (Silero VAD, WebRTC VAD). Шум вокруг — транспорт, ветер, чужая речь; помогает шумодав вроде RNNoise или DeepFilterNet. Суржик — Whisper хорошо знает русский, но при смешении с английскими терминами явно указывайте language="ru", иначе модель уходит в украинский или белорусский. Длинные сообщения — бейте на куски по 30 секунд через VAD, склеивайте с overlap. Низкое качество микрофона через Bluetooth HFP даёт 8 кГц, WER растёт на 3–5%.

Какая целевая латентность голосового бота в MAX?

Целевая планка — менее 3 секунд от конца записи до начала ответа. На что влияет: размер модели (Distil-Whisper-small быстрее, чем Whisper-large); GPU против CPU (GPU быстрее в 5–20 раз); стриминговое распознавание — SaluteSpeech, Yandex SpeechKit, Deepgram выдают частичный текст уже во время загрузки, Whisper API так не умеет; параллельные запросы — нужен пул воркеров и очередь; сетевой round-trip облачного STT добавляет 200–500 мс; холодный старт Whisper — 3–7 секунд, держите процесс живым в памяти.

Сколько стоит голосовой MAX-бот на 1000 пользователей?

При 1000 DAU, 3 voice по 15 секунд и 3 ответа по 200 символов в день. Облачный сценарий на Yandex SpeechKit: STT около 135 RUB в день, TTS около 240 RUB в день, итого примерно 11 000 RUB в месяц на распознавание и синтез. Плюс LLM (GigaChat Pro) — примерно 1500–3000 RUB в день. Self-hosted на faster-whisper large-v3 плюс Silero TTS на одной GPU RTX 4090: аренда около 25 000 RUB в месяц, электричество около 10 000 RUB. Точка перелома между облаком и железом — 3000–5000 DAU.

Как соблюдать 152-ФЗ при работе с голосом в боте MAX?

Голос — это биометрические персональные данные, специальная категория по 152-ФЗ. В политике конфиденциальности нужна отдельная строка про обработку голоса, цели и срок хранения. Требуется отдельное письменное согласие на обработку биометрии — в контексте бота это клик с явной формулировкой и логированием. С июня 2025 биометрия для коммерческих целей должна сдаваться в ГИС ЕБС или храниться с дополнительной сертификацией; проще не хранить аудио вообще. Передача голоса в OpenAI/Google/ElevenLabs — трансграничная передача ПДн с уведомлением РКН. Большинство студий, работающих с MAX, выбирает Yandex SpeechKit, SaluteSpeech или GigaAM именно поэтому — данные не покидают РФ.