Дизайн voice-агента
STT/TTS выбор, turn-taking, latency budget < 800ms, interruption handling, recovery от mishear, персона в голосе.
Спроектируй voice-агента {{agent_name}} для {{use_case}}, язык {{language}}. Голосовой UX — НЕ текстовый чат с TTS сверху. Это другой жанр.
Шаг 1 · Latency budget — главный constraint
Человеческий разговор: ~200ms между turns. Если агент молчит > 1 секунды — пользователь думает "висит" и начинает повторять.
Целевой end-to-end (от конца речи user до начала речи agent):
- Conversational: < 800ms (премиум)
- Acceptable: < 1500ms
- Painful: > 2000ms — пользователи уходят
Разложение бюджета:
| Этап | Бюджет | Что съедает |
|---|---|---|
| STT (audio → text) | 150-300ms | streaming vs batch |
| LLM (text → text) | 200-500ms | TTFT, не TTL |
| TTS (text → audio) | 150-300ms | streaming TTS |
| Network RTT | 50-100ms | edge proximity |
Ключевой трюк: streaming на каждом этапе. Не ждать полного STT — слать частичные транскрипты в LLM. Не ждать полного LLM-ответа — слать первые слова в TTS как только сгенерировались.
Шаг 2 · STT — выбор
| Провайдер | Latency | Качество | Когда |
|---|---|---|---|
| Deepgram Nova | ~150ms streaming | высокое, multi-lang | дефолт для real-time |
| Whisper (OpenAI) | 500-1500ms | топ для accents, но batch | non-real-time, дешёвый offline |
| AssemblyAI Universal | ~200ms | высокое, диаризация | если нужны speaker labels |
| Native cloud (Azure / Google) | 200-400ms | хорошее | если уже в их стеке |
Чек-лист STT:
- Streaming mode (не batch)
- VAD (voice activity detection) встроен или внешний
- Endpointing — как агент понимает "user closed mouth"
- Custom vocabulary для domain terms (бренды, аббревиатуры)
Шаг 3 · TTS — выбор
| Провайдер | TTFB | Качество голоса | Когда |
|---|---|---|---|
| ElevenLabs Flash | ~75ms | премиум, эмоции | дефолт для UX-first |
| Cartesia Sonic | ~90ms | очень быстрый, хороший | low-latency приоритет |
| OpenAI TTS-1 / TTS-HD | 300-800ms | хороший, но slow start | non-conversational |
| Native cloud | 200-500ms | средний | бюджет, объём |
Чек-лист TTS:
- Streaming output (audio chunks по мере генерации)
- Голос подходит к персоне ({{use_case}})
- SSML support для пауз, акцентов
- Multi-lang если нужно
Шаг 4 · Turn-taking
Кто говорит когда — это не таймер, это сигналы:
- Endpoint detection: user закончил → ~500ms тишины + VAD. Слишком короткое окно → агент режет пользователя. Слишком длинное → "почему молчит?"
- Barge-in: user заговорил поверх агента → агент немедленно прерывает TTS, начинает слушать. Без этого UX мёртв.
- Filler turns: если LLM думает > 500ms — отыграть короткое "hm, let me check" чтобы не было тишины.
Шаг 5 · Mishear recovery
STT ошибается. Стратегии:
- Confidence threshold: если transcript confidence < 0.7 → "Sorry, you said {{best_guess}}?" с просьбой подтвердить.
- Numbers/dates fortification: "12" может быть "20". Для критичных данных — повторное подтверждение: "Confirming: twelve, one-two?"
- Spell-out fallback: для имён, email, кодов — попросить произнести по буквам.
- Context grounding: если user сказал что-то невозможное в контексте задачи — переспросить, не интерпретировать вслепую.
Шаг 6 · Interruption handling
User перебивает — это норма в voice. Состояния:
- Agent speaking → barge-in detected → stop TTS, clear audio buffer, listen.
- Сохрани partial output: что агент успел сказать — добавь в conversation log как "[partial]".
- Don't replay: не повторяй то что уже сказал, продолжи с того места где прервали (или измени курс если user сказал "stop", "no", "wait").
Шаг 7 · Персона в голосе
Voice = personality умножается на 10. Решения:
- Tempo: warm-conversational (slower) vs efficient (faster). Match {{use_case}}.
- Tone words в system prompt: "speak warmly, use contractions, vary sentence length". LLM генерирует текст под TTS.
- No markdown / no lists в outputs: TTS читает звёздочки буквально. Промпт: "respond as natural speech, never use bullet points or markdown".
- Sentence length: короткие, parsable on ear. Не > 20 слов в предложении.
Anti-patterns
- ❌ Batch STT в real-time use case → 2s latency, разговор мёртв.
- ❌ Markdown в TTS → "asterisk asterisk hello asterisk asterisk".
- ❌ TTS целого ответа перед playback → user слышит первый звук через 3s.
- ❌ No barge-in → user перебивает, агент продолжает 30 секунд в пустоту.
- ❌ Длинные предложения с подчинениями → не parseable на слух, user теряется.
- ❌ Тишина при thinking → "висит ли он? повторить?"
- ❌ Игнорирование confidence от STT → агент уверенно отвечает на misheard query → wrong answer.
- ❌ One-size persona → support и outbound sales требуют разных голосов и темпа.
- ❌ No fallback на text/keypad → если voice фейлит подряд, дай escape.
Output
Voice agent spec:
- Latency budget table (каждый этап + общий target).
- Stack: STT / LLM / TTS с обоснованием.
- Turn-taking rules (endpoint, barge-in, fillers).
- Persona description (tempo, tone, voice ID).
- Recovery flows: mishear, low confidence, interruption.
- System prompt patterns для voice-friendly output.
- Метрики: time-to-first-audio, interruption rate, mishear rate, session length.
Полный UX-аудит сайта
Эвристическая оценка по Нильсену + проверка ключевых сценариев. На выходе — приоритизированный список проблем.
Конверсионный аудит формы регистрации
Карта трения по форме регистрации + 10 фиксов с ожидаемым импактом. Не «сделать красиво», а «убрать конкретное препятствие».
Mobile-friendly аудит (375px)
Аудит мобильной версии на iPhone SE: тач-таргеты, скролл, попапы, tap-vs-hover, input zoom.