Голосовое сообщение — самый ленивый и самый быстрый способ написать боту. Пользователь не набирает длинный запрос на ходу, в перчатках, с ребёнком на руках или за рулём — он зажимает кнопку микрофона и говорит. А бот превращает аудио в текст и пускает его в обычный пайплайн. 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 USD | 1–3 с | 5–8% | Нет |
| Whisper large-v3 (локально) | Хорошо | Только GPU | 0.5–2 с (GPU) | 5–8% | Да |
| faster-whisper (CTranslate2) | Хорошо | CPU/GPU | 0.3–1 с (GPU) | 5–8% | Да |
| Distil-Whisper | Удовл. | Только GPU | 0.1–0.5 с | 6–9% | Да |
| Yandex SpeechKit | Отлично | около 0.18 RUB | 0.5–1.5 с | 4–7% | Гибрид |
| SaluteSpeech (Сбер) | Отлично | около 0.15 RUB | 0.5–1.5 с | 4–7% | Гибрид |
| Google Speech-to-Text | Хорошо | около 0.024 USD | 1–2 с | 5–8% | Нет |
| Azure Speech | Хорошо | около 1 USD за час | 1–2 с | 5–8% | Контейнер |
| GigaAM (Сбер, open) | Отлично | Только GPU | 0.3–1 с | 4–7% | Да |
| Vosk | Удовл. | CPU/GPU | 0.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 | Цена | Качество | Эмоции/SSML | On-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 именно поэтому — данные не покидают РФ.