Інтеграція Vonage (Nexmo) для голосового AI: WebSocket, NCCO

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Інтеграція Vonage (Nexmo) для голосового AI: WebSocket, NCCO
Середній
від 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

Інтеграція Vonage (Nexmo) для голосового AI

При розробці голосового AI-асистента ключова складність — організація real-time аудіостріму з мінімальною затримкою. Дзвінок має оброблятися в реальному часі: кожна зайва мілісекунда призводить до втрати контексту та погіршення користувацького досвіду. Vonage Voice API (колишній Nexmo) пропонує інтерфейс на основі WebSocket для прямої передачі аудіо, але налаштування вимагає глибокого розуміння NCCO та протоколів потокової передачі. Ми, як інтегратори з багаторічним досвідом, реалізували десятки проєктів на цьому стеку — від простих IVR до мультимовних асистентів із перекладом. Наші клієнти отримують стабільне з'єднання з latency p99 менше 500 мс і гарантованим uptime 99,9%.

Чому Vonage краще Twilio для голосового AI?

Vonage виграє за трьома параметрами. SIP-інтеграція на рівні API — не потрібні додаткові шлюзи. Покриття номерів у Європі щільніше: 70+ країн проти 50 у Twilio. Тарифи на вихідні дзвінки в середньому нижчі при обсягах >1000 хвилин/міс, що дає відчутну економію бюджету — до 35% на великих проєктах.

Параметр Vonage Twilio
Протокол стріму WebSocket (PCM 16-bit 16kHz) WebSocket (μ-law/opus)
NCCO JSON-керування дзвінком TwiML (XML)
SIP interop Вбудована підтримка Через Elastic SIP Trunk
Європейські номери 70+ країн 50+ країн
Тарифи Конкурентні Вищі при великих обсягах

Основні NCCO дії для голосового AI

Дія Призначення Приклад
talk Синтез мовлення (TTS) Привітання, підказки
stream Потокове аудіо (наприклад, музика) Утримання дзвінка
input Збір DTMF або голосового введення Вибір опції меню
connect Переадресація на WebSocket або SIP З'єднання з AI
record Запис розмови Контроль якості

Налаштування WebSocket-обробника для низької затримки

База — FastAPI + WebSocket. Приймаємо NCCO через /answer, стрімимо аудіо на /voice-stream/. Всередині — конвеєр: VAD (напр. Silero VAD) → ASR (Whisper або власний) → NLP (RAG / LLM) → TTS. Весь трафік залишається на вашому сервері, що важливо для безпеки та дотримання специфікації WebSocket.

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/answer")
async def answer_call(uuid: str, conversation_uuid: str):
    """NCCO для вхідного дзвінка"""
    return JSONResponse([
        {
            "action": "talk",
            "text": "Вітаю! Я голосовий асистент.",
            "language": "uk-UA",
            "style": 4
        },
        {
            "action": "connect",
            "endpoint": [{
                "type": "websocket",
                "uri": f"wss://api.yourapp.com/voice-stream/{uuid}",
                "content-type": "audio/l16;rate=16000",
                "headers": {"call_id": uuid}
            }]
        }
    ])

@app.post("/events")
async def call_events(request: Request):
    data = await request.json()
    status = data.get("status")
    if status in ["completed", "failed"]:
        await cleanup_session(data.get("uuid"))
    return JSONResponse({"status": "ok"})

WebSocket обробник

from fastapi import WebSocket

@app.websocket("/voice-stream/{call_id}")
async def voice_stream(websocket: WebSocket, call_id: str):
    await websocket.accept()
    session = VoiceSession(call_id)

    try:
        async for message in websocket.iter_bytes():
            # Vonage надсилає PCM 16-bit 16kHz
            pcm_audio = message

            # Обробляємо аудіо через наш AI pipeline
            response_text = await process_audio(pcm_audio, session)

            if response_text:
                audio_response = await synthesize(response_text)
                await websocket.send_bytes(audio_response)

    except Exception as e:
        logger.error(f"WebSocket error: {e}")
    finally:
        await session.finalize()

Надсилання подій та керування дзвінком

import vonage

client = vonage.Client(key=VONAGE_KEY, secret=VONAGE_SECRET)
voice = vonage.Voice(client)

def transfer_to_agent(call_uuid: str, agent_number: str):
    """Переведення на оператора"""
    voice.update_call(call_uuid, {
        "action": "transfer",
        "destination": {
            "type": "ncco",
            "ncco": [{
                "action": "connect",
                "endpoint": [{"type": "phone", "number": agent_number}]
            }]
        }
    })

Як забезпечити відмовостійкість WebSocket?

При падінні з'єднання контекст діалогу може бути втрачено. Використовуємо Redis для зберігання стану сесії — при перепідключенні відновлюємо історію. Експоненційна затримка реконнекту (1,2,4,8 сек) знижує навантаження на API. Такий підхід застосовується в проєктах з критичним SLA. Додатково налаштовуємо keepalive з інтервалом 10 секунд, щоб уникнути розриву від Vonage. NCCO documentation рекомендує завжди задавати timeout для дій, щоб дзвінок не завис при тривалій обробці.

Процес роботи: від ідеї до продакшену

  1. Аналітика — аудит вашої телефонії, узгодження сценаріїв (IVR, outbound, голосовий бот).
  2. Проєктування — схема дзвінків, вибір AI-моделей, навантажувальне тестування.
  3. Реалізація — пишемо NCCO, WebSocket-обробник, підключаємо ML-компоненти.
  4. Тестування — симуляція дзвінків, перевірка latency (p99 <300 мс), стрес-тест до 100 одночасних з'єднань.
  5. Деплой — контейнеризація, моніторинг (Prometheus + Grafana), налаштування будь-якої хмари або bare-metal.
  6. Підтримка — оновлення моделей, ротація ключів, цілодобовий моніторинг, SLA на відновлення 4 години.

Що входить в роботу

  • Документація: NCCO-конфіги, архітектура рішення, інструкції для операторів.
  • Код інтеграції (FastAPI + WebSocket + AI-пайплайн) на ваш репозиторій.
  • Тестові сценарії: 20+ кейсів (зайнято, немає відповіді, переведення, DTMF).
  • Навчання вашої команди: 2–3 сесії по 2 години.
  • Моніторинг та алертинг (Uptime 99.99%, latency p99, error rate).

Типові помилки при інтеграції Vonage

  • NCCO без timeout — якщо AI довго відповідає, дзвінок зависає. Завжди ставте timeout: 15.
  • Ігнорування event-колбеків — Vonage надсилає події ringing, answered, completed. Якщо не обробляти failed, не очистите сесію.
  • Один WebSocket на всі дзвінки — для кожного uuid створюйте окреме з'єднання. Використовуйте asyncio або multiprocessing.
  • Відсутність keepalive — Vonage розриває WebSocket через 30 секунд бездіяльності. Відправляйте ping кожні 10 секунд.

Для відновлення контексту при розриві WebSocket використовуйте механізм перепідключення з експоненційною затримкою. При розриві зберігайте стан сесії в Redis, щоб при новому з'єднанні відновити діалог. Це особливо важливо для проєктів з вимогою zero downtime.

Строки та вартість

Базова інтеграція (один сценарій, одна мова) — від 2 тижнів. Повноцінний production (мультимовний, з навантаженням, моніторингом) — 1.5–2 місяці. Вартість розраховується індивідуально і залежить від складності сценаріїв, кількості мов та вимог до продуктивності. Ми гарантуємо прозорий кошторис після безкоштовного аудиту вашої поточної телефонії. Замовте аудит — оцінимо проєкт за 2 робочі дні, ви отримаєте детальний план і розрахунок строків. Отримайте консультацію, щоб обговорити ваш сценарій використання Vonage Voice API.

Досвід: понад 30 успішних інтеграцій, сертифіковані інженери з Vonage та Twilio, гарантія SLA на всі проєкти.

Розпізнавання та синтез мовлення: перша лінія проблеми

Ми стикаємося із замовником, який має 40 000 годин записів кол-центру й хоче транскрибувати їх за тиждень — це типова задача розпізнавання мови ASR. Штатний хмарний 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 обрізає короткі вставки. Рішення — збільшити min_duration_on до 0.3 та додати overlap detection через pyannote-overlap-detection.

Клонування голосу — латентність чи якість. XTTS v2 (Coqui) дає натуральний голос, але при потоковій генерації stream_chunk_size=20 перший аудіочанк прилітає через 1.4–2.0 с — неприйнятно для інтерактивних сценаріїв. StyleTTS2 та Kokoro швидші, але вимагають точного підготовки референсного аудіо. Ми навчилися вирішувати цю дилему за допомогою гібридного підходу: на старті використовуємо Silero TTS (50–100 мс TTFB), а після отримання перших 3 секунд аудіо перемикаємо на XTTS для кращої натуральності.

Як вибрати ASR-модель під ваші дані?

Модель WER (українська, чистий запис) WER (PSTN, кодек G.711) Швидкість інференсу (фактор real-time) Вартість інференсу (1 год аудіо, A10G)
Whisper large-v3 8–10% 25–35% ~0.1x (55 с на 40 хв) ~$0.50
Whisper medium 12–15% 30–40% ~0.3x ~$0.15
Wav2Vec2 XLSR-53 15–18% 28–35% ~0.8x ~$0.08
Whisper large-v3 + fine-tune 4–7% 10–15% ~0.1x ~$0.50

faster-whisper (CTranslate2) швидший за оригінальний Whisper у 4 рази при однаковому WER. Для продакшену ми завжди використовуємо його.

Практичний приклад: fine-tuning Whisper на доменній лексиці

Фінтех-компанія з 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.50 за годину аудіо, що в 6 разів дешевше за хмарне рішення. Проєкт виконано за 6 тижнів, включаючи підготовку даних і валідацію.

Техніка fine-tuning описана в офіційній документації Whisper на Hugging Face.

Як донавчити 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 обов’язково заморожуйте 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. Ми гарантуємо, що підібрана модель відповідатиме вашим вимогам до латентності та якості — це підтверджено на 50+ реалізованих проєктах.

Наш досвід та гарантії

10+ років досвіду в NLP та speech processing. 50+ успішних проєктів для fintech, telecom, медицини. Сертифіковані моделі (Model Card + bias audit). Ми гарантуємо зниження WER до цільового рівня, інакше повертаємо кошти.

Що входить у роботу з нами?

Клієнт отримує:

  • Документацію: model card, інструкцію з розгортання, API-специфікацію (OpenAPI 3.0)
  • Код: готові скрипти для інференсу, пайплайни обробки (Docker Compose + Kubernetes маніфести за потреби)
  • Доступи: до self-hosted інстансів, графіки моніторингу (Grafana + Prometheus)
  • Навчання: 2 сесії для вашої команди (налаштування, експлуатація, troubleshooting)

Ми також надаємо сертифікат відповідності моделі (Model Card + bias report), що підсилює довіру до рішення.

Процес роботи та терміни

  1. Аудит-сесія – беремо 2–4 години ваших записів, проганяємо через кілька моделей, вимірюємо WER/CER, дивимося на розподіл помилок (лексичні, акустичні, мова). Займає 1–2 дні.
  2. Вибір архітектури – під ваш throughput: один GPU для 1000 хв/день або кластер з балансувальником для 100 000+ хв/день.
  3. Реалізація – Docker-контейнер з FastAPI або Triton Inference Server для батчованого інференсу. Інтеграція з чергою Kafka.
  4. Тестування – A/B тест на продакшн-даних, порівняння з baseline (Google/Azure STT).
  5. Деплой – CI/CD (GitHub Actions + ArgoCD), моніторинг (Grafana + WER/CER алерти).

Терміни:

  • Базова інтеграція готової моделі – 1–2 тижні.
  • Fine-tuning з підготовкою даних та валідацією – 4–8 тижнів.
  • Повна розробка голосового пайплайну (ASR + діаризація + TTS + моніторинг) – 2–4 місяці.

Зв'яжіться з нами для безкоштовної консультації — оцінимо ваш проєкт за 2 дні. Або замовте пілотний fine-tuning на 20 годинах ваших даних і отримайте перші результати вже за 2 тижні.