Голосовой AI-ассистент Speech-to-Speech: разработка и внедрение под ключ

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1564 услуг
Голосовой AI-ассистент Speech-to-Speech: разработка и внедрение под ключ
Сложный
от 1 недели до 3 месяцев
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Проблема: задержка в диалоге убивает UX

Мы сталкивались с проектами, где голосовой ассистент отвечал через 3–4 секунды — пользователи просто бросали разговор. Сквозная задержка (end-to-end latency) — главная метрика. Наш опыт показывает: чтобы диалог был естественным, нужно укладываться в 1.5 секунды от конца речи пользователя до начала ответа. Решаем это архитектурой Speech-to-Speech (S2S) без текстовых разрывов. Такая архитектура критична для колл-центров, голосовых помощников в ритейле и медицинских систем — там каждая секунда простоя снижает конверсию или даже ставит под угрозу здоровье пациента. Дополнительно мы внедряем инструменты мониторинга latency по перцентилям p50, p95 и p99, чтобы гарантировать стабильность даже под нагрузкой.

Какие проблемы решает голосовой AI-ассистент Speech-to-Speech?

Главные технические сложности в S2S-pipeline:

  • VAD + endpointing — детекция конца фразы с минимальной задержкой (600–800 мс). Неверный threshold приводит к обрыву речи или пропуску тишины.
  • STT latency — Whisper API даёт 300–600 мс, но добавляет сетевую задержку. Оптимизируем через streaming-режим и буферизацию.
  • TTS streaming — синтез первого чанка за 200–400 мс, но клиент должен воспроизводить на лету. Используем PCM-поток с предзагрузкой.
  • LLM reasoning — GPT-4o-mini отвечает за 200–500 мс, но на сложные запросы уходит больше времени. Ограничиваем контекстное окно и используем few-shot примеры.

Каждая из этих проблем решается выбором правильного инструмента и настройкой под конкретный сценарий. Например, в проекте для телемедицины мы добились p99 latency 1.2 с, комбинируя Silero VAD с локальным Whisper на GPU и streaming TTS. Согласно официальной документации OpenAI по Realtime API, сквозная задержка не превышает 800 мс при использовании серверного VAD.

Как мы строим архитектуру Speech-to-Speech?

Мы строим архитектуру на streaming-компонентах, чтобы минимизировать буферизацию. Базовый пайплайн:

Microphone → VAD → STT → NLU/LLM → TTS → Speaker
                ↑                         ↓
           Endpointing              First audio chunk
           (600–800ms)              (<300ms after TTS start)

Ключевой инсайт: параллельно запускаем TTS после первого чанка STT, а не дожидаемся полной транскрипции. Такой подход снижает общую задержку на 20–30%.

Full pipeline на OpenAI

import asyncio
from openai import AsyncOpenAI
import sounddevice as sd
import numpy as np

client = AsyncOpenAI()

class VoiceAssistant:
    def __init__(self):
        self.conversation_history = []
        self.system_prompt = "Ты полезный голосовой ассистент. Отвечай кратко, 1–3 предложения."

    async def listen_and_respond(self):
        # Запись через VAD
        audio = await self.record_speech()

        # STT
        transcript = await client.audio.transcriptions.create(
            model="whisper-1",
            file=("audio.wav", audio, "audio/wav"),
            language="ru"
        )
        user_text = transcript.text
        print(f"User: {user_text}")

        # LLM
        self.conversation_history.append({"role": "user", "content": user_text})
        response = await client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "system", "content": self.system_prompt}]
                      + self.conversation_history,
        )
        assistant_text = response.choices[0].message.content
        self.conversation_history.append({"role": "assistant", "content": assistant_text})
        print(f"Assistant: {assistant_text}")

        # TTS streaming
        async with client.audio.speech.with_streaming_response.create(
            model="tts-1",
            voice="alloy",
            input=assistant_text,
            response_format="pcm",
        ) as tts_response:
            async for chunk in tts_response.iter_bytes(1024):
                # Воспроизводим чанки по мере поступления
                audio_data = np.frombuffer(chunk, dtype=np.int16)
                sd.play(audio_data.astype(np.float32) / 32768.0, samplerate=24000)
                sd.wait()

OpenAI Realtime API (оптимально для production)

import websockets

async def realtime_voice_assistant():
    url = "wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview"
    headers = {
        "Authorization": f"Bearer {OPENAI_API_KEY}",
        "OpenAI-Beta": "realtime=v1"
    }

    async with websockets.connect(url, extra_headers=headers) as ws:
        # Конфигурация
        await ws.send(json.dumps({
            "type": "session.update",
            "session": {
                "voice": "alloy",
                "instructions": "Ты голосовой ассистент. Отвечай по-русски.",
                "turn_detection": {"type": "server_vad"}
            }
        }))
        # ...обработка событий

Как мы снижаем сквозную задержку?

Критичный фактор — паралельная обработка и выбор правильного алгоритма endpointing. Мы используем webrtcvad с агрессивностью 1 и динамическим таймаутом. В production с Realtime API серверный VAD отрабатывает быстрее клиентского — разница 100–200 мс. Дополнительно кешируем embedding для частых команд (latency p99 снижается на 15%). Согласно официальной документации OpenAI, сквозная задержка не превышает 800 мс. Экономия на операторах колл-центра может достигать 70%.

Какие технологии мы используем?

Компонент Инструменты Задержка (типичная)
VAD webrtcvad, Silero VAD 50–100 мс
STT Whisper-1, Wav2Vec 2.0 300–600 мс
LLM GPT-4o-mini, LLaMA 3 8B 200–500 мс
TTS OpenAI TTS-1, ElevenLabs 200–400 мс
Total классический пайплайн 1.3–2.3 с
Total OpenAI Realtime API 500–800 мс

Для локальной инференции используем ONNX Runtime и vLLM — GPU utilization достигает 85%. Сравнение: классический пайплайн в 2–3 раза медленнее Realtime API, но даёт больше контроля над voice. Стоимость обработки минуты аудио в облаке составляет доли цента.

Процесс работы

  1. Аналитика — замеряем текущую инфраструктуру, требования к voice, SLA (от 2 недель).
  2. Проектирование — выбираем компоненты (OpenAI/локальные), проектируем интеграцию (от 3 дней).
  3. Реализация MVP — базовая цепочка VAD→STT→LLM→TTS с streaming (1 неделя).
  4. Тестирование — A/B тесты с пользователями, замер latency p99, корректировка endpointing (3 дня).
  5. Деплой — настраиваем CI/CD, мониторинг в Grafana, алерты по latency (2 дня).
  6. Оптимизация — fine-tuning whisper для акцентов, LoRA для LLM, TTS голос под бренд (опционально).

Что входит в работу

  • Документация архитектуры и API.
  • Исходный код ассистента с комментариями и тестами.
  • Интеграция с вашей CRM/телефонией через REST.
  • Обучение команды (2–3 часа воркшопа).
  • Поддержка 1 месяц после запуска с гарантией устранения багов.

Сроки ориентировочно

MVP голосового ассистента — от 1 недели. Полноценный production с Realtime API — 2–3 недели. Стоимость рассчитывается индивидуально в зависимости от сложности интеграции и объёма кастомизации. Получите консультацию по вашему проекту — оценим под ключ.

Метрики производительности

Компонент Задержка
VAD + Endpointing 600–800 мс
Whisper-1 API 300–600 мс
GPT-4o-mini 200–500 мс
TTS-1 first chunk 200–400 мс
Итого 1.3–2.3 сек

OpenAI Realtime API: сквозная задержка ~500–800 мс.

Свяжитесь с нами, чтобы получить консультацию и детальный план внедрения. Гарантируем: ваш голосовой ассистент будет отвечать быстрее 1.5 секунд.

Распознавание и синтез речи: ASR, TTS, клонирование голоса

Заказчик приходит с задачей: транскрибировать 40 000 часов колл-центра за неделю. Штатный облачный ASR (Google Speech-to-Text) выдаёт WER 28% на отраслевой лексике и стоит ощутимо дорого при таких объёмах. Задача — снизить WER ниже 10% и перейти на self-hosted инференс.

Типовые проблемы, с которыми приходят

WER не сходится к нужной метрике. Чаще всего виновата не архитектура, а данные: шумные аудио без нормализации уровня (-23 LUFS вместо стандарта), смешанные языки в одном канале, акцент, специфическая доменная лексика. Whisper large-v3 из коробки даёт WER 8–12% на чистом русском и проваливается до 25–35% на записях с PSTN-артефактами и узкополосным кодеком G.711.

Диаризация ломается при больше двух спикеров. pyannote/speaker-diarization-3.1 работает стабильно при 2–3 говорящих, но DER (Diarization Error Rate) растёт с 6% до 18–22% при 5+ участниках конференции. Проблема усугубляется перекрёстными репликами: по умолчанию min_duration_on=0.1 срезает короткие вставки.

Клонирование голоса — латентность или качество. XTTS v2 (Coqui) даёт натуральный голос, но при потоковой генерации stream_chunk_size=20 первый аудиочанк прилетает через 1.4–2.0 с — неприемлемо для интерактивных сценариев. StyleTTS2 и Kokoro быстрее, но требуют точной подготовки референсного аудио.

Как это решается на практике

Базовый стек для production-пайплайна:

  • ASR: openai/whisper-large-v3 или faster-whisper (CTranslate2-бэкенд, x4 скорость vs оригинал)
  • Диаризация: pyannote.audio 3.x + интеграция через whisperx для выравнивания по словам
  • TTS: XTTS v2 для качества, Edge-TTS или Silero для низкой латентности
  • Клонирование: XTTS v2 (3–6 с референсного аудио) или OpenVoice v2

Типичный пайплайн для колл-центра выглядит так: аудио из очереди Kafka → нормализация ffmpeg -af loudnorm до -23 LUFS → faster-whisper с beam_size=5, vad_filter=Truepyannote диаризация → постпроцессинг (пунктуация через deepmultilingualpunctuation) → запись в PostgreSQL с временными метками.

Кейс из практики. Финтех-компания с 12 000 звонков/день. Исходный WER на русском с банковской лексикой — 22% (Google STT). После fine-tuning whisper-medium на 200 часах размеченных записей через Hugging Face transformers + Seq2SeqTrainer с learning_rate=1e-5, warmup_steps=500 — WER упал до 7.3%. Инференс на одной A10G через faster-whisper с compute_type=float16 обрабатывает 40-минутный звонок за 55 секунд. Итоговая стоимость инференса — $0.0008/мин против $0.016/мин у облачного провайдера.

Дообучение Whisper на доменных данных

Когда общая модель не справляется, fine-tuning — первый инструмент. Минимальный датасет для заметного улучшения — 20–30 часов размеченного аудио в целевом домене. Разметку можно получить через итеративный процесс: прогнать через базовую модель → вручную исправить 10–15% ошибок → переобучить → повторить.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

Важно: при fine-tuning Whisper нужно замораживать encoder первые 1000 шагов (model.freeze_encoder()), иначе акустические признаки разъедутся раньше, чем decoder адаптируется к новой лексике.

Синтез речи: выбор под задачу

Модель Латентность (TTFB) Натуральность MOS Клонирование Языки
XTTS v2 1.2–2.0 с 4.1–4.3 Да, 3 с референса 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Да, требует адаптации en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Нет en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Нет ru, en, de, и др.
Edge-TTS ~0.4 с (cloud) 4.0 Нет 100+

Для интерактивных ботов с требованием TTFB < 300 мс — Silero или Kokoro. Для озвучки контента, где важна натуральность — XTTS v2 с потоковой отдачей через WebSocket.

Процесс работы

Начинаем с аудит-сессии: берём 2–4 часа ваших записей, прогоняем через несколько моделей, замеряем WER/CER, смотрим на распределение ошибок по типам (лексические, акустические, язык). Это занимает 1–2 дня и сразу показывает, нужен ли fine-tuning или достаточно пост-обработки.

Далее — выбор архитектуры под ваш throughput: один GPU для 1000 мин/день или кластер с балансировщиком для 100 000+ мин/день. Деплой через Docker-контейнер с FastAPI или Triton Inference Server для батчированного инференса.

Сроки зависят от сложности: базовая интеграция готовой модели — 1–2 недели. Fine-tuning с подготовкой данных и валидацией — 4–8 недель. Полная разработка голосового пайплайна (ASR + диаризация + TTS + мониторинг) — 2–4 месяца.