Клієнт телефонує в підтримку — система розпізнає «хочу замовити» як «хочу закатати» через артефакти конвертації μ-law 8 кГц в PCM 16 кГц. Точність STT падає на 30%, діалог іде по дотичній. Ми інтегруємо Twilio Voice AI з реальним NLU, використовуючи Whisper large-v3 для розпізнавання, GPT-4o для генерації відповідей та ElevenLabs для синтезу мови. У результаті бот розуміє клієнта навіть з акцентом і відповідає без фраз-паразитів. Замовте інтеграцію — ми вирішимо проблему затримок та якості розпізнавання. Вартість базового бота під ключ — від $2000, повне рішення — до $15000.
Проблеми, які вирішуємо
Конвертація аудіоформатів — Twilio передає μ-law 8 кГц, а Whisper вимагає PCM 16 кГц. Помилка в перетворенні дає артефакти та втрату якості розпізнавання. Ми використовуємо audioop.ratecv з антиаліасингом та кубічною інтерполяцією.
Надійність WebSocket-з'єднання — при розриві каналу втрачається аудіопотік. Ми впроваджуємо механізм перепідключення з буферизацією останньої секунди.
Управління латентністю — сумарна затримка не повинна перевищувати 2 секунд. Оптимізуємо pipeline: паралельний STT та генерація відповіді, кешування частих запитів. Порівняння: наш pipeline знижує затримку вдвічі порівняно з послідовною обробкою.
Технічна реалізація
TwiML webhook для вхідного дзвінка
from fastapi import FastAPI, Request from twilio.twiml.voice_response import VoiceResponse, Start, Stream, Say app = FastAPI() @app.post("/incoming-call") async def handle_incoming_call(request: Request): response = VoiceResponse() # Запускаємо Media Stream start = Start() start.stream( url="YOUR_WEBSOCKET_URL", track="both_tracks" # вхідне та вихідне аудіо ) response.append(start) # Вимовляємо привітання response.say( "Привіт! Я голосовий AI-бот. Як можу допомогти?", voice="alice", language="uk-UA" ) response.pause(length=30) return Response(content=str(response), media_type="text/xml") WebSocket обробник Media Streams
import asyncio import json import base64 from fastapi import WebSocket @app.websocket("/stream") async def handle_stream(websocket: WebSocket): await websocket.accept() call_sid = None stream_sid = None audio_buffer = bytearray() try: async for message in websocket.iter_text(): data = json.loads(message) event = data.get("event") if event == "start": call_sid = data["start"]["callSid"] stream_sid = data["start"]["streamSid"] session = create_session(call_sid) elif event == "media": # Twilio використовує mulaw 8kHz mulaw_audio = base64.b64decode(data["media"]["payload"]) audio_buffer.extend(mulaw_audio) # Обробляємо коли накопичили 2 секунди (16000 bytes @ 8kHz) if len(audio_buffer) >= 16000: await process_audio_chunk( bytes(audio_buffer), websocket, stream_sid, session ) audio_buffer = bytearray() elif event == "stop": break except Exception as e: logger.error(f"Stream error: {e}") async def send_audio_to_caller(websocket: WebSocket, stream_sid: str, audio_bytes: bytes): """Відправляємо синтезоване аудіо назад у дзвінок""" encoded = base64.b64encode(audio_bytes).decode() await websocket.send_json({ "event": "media", "streamSid": stream_sid, "media": { "payload": encoded } }) Конвертація аудіоформатів
Twilio використовує μ-law (mulaw) 8kHz. Whisper працює з PCM 16kHz:
import audioop def mulaw_to_pcm16k(mulaw_bytes: bytes) -> bytes: """μ-law 8kHz → PCM 16-bit 8kHz → upsample to 16kHz""" pcm_8k = audioop.ulaw2lin(mulaw_bytes, 2) # μ-law → PCM 16-bit pcm_16k, _ = audioop.ratecv(pcm_8k, 2, 1, 8000, 16000, None) # 8→16kHz return pcm_16k Як Twilio Voice AI обробляє аудіо в реальному часі?
Media Streams API передає аудіо чанками по 20 мс. Ми накопичуємо буфер до 2 секунд (16000 байт при 8 кГц) і відправляємо в STT. Це знижує кількість запитів і покращує точність за рахунок контексту. Після розпізнавання LLM генерує відповідь, TTS синтезує мову, і аудіо відправляється назад через той же WebSocket.
Чому важлива правильна конвертація аудіоформатів?
Помилка перетворення μ-law → PCM може внести шум або змістити частоту дискретизації, що призводить до втрати до 30% точності STT. Ми використовуємо audioop.ulaw2lin з явним зазначенням бітності та ratecv з якісним фільтром. Для усунення артефактів на стиках чанків застосовуємо крос-фейд тривалістю 50 мс.
Типові помилки при конвертації та їх вирішення
-
Ігнорування бітності: μ-law 8-bit → PCM 16-bit. Без
ulaw2linвийде 8-bit PCM, STT не зрозуміє. -
Неправильний rate: upsample з 8 кГц до 16 кГц вимагає інтерполяції.
ratecvзNoneвикористовує лінійну, а для кращої якості — кубічну. - Артефакти при пакетній обробці: на стиках чанків виникають клацання. Додаємо перехресне згладжування (cross-fade) тривалістю 50 мс.
Порівняння підходів до TTS
| Параметр | ElevenLabs (хмарний) | Kokoro (ONNX локально) |
|---|---|---|
| Затримка | 300-500 мс | 100-200 мс |
| Якість | Дуже висока | Середня |
| Вартість | Залежить від символів | Безкоштовно (CPU/GPU) |
| Голоси | 100+ | 10+ |
Для production ми рекомендуємо комбінацію: ElevenLabs для первинного діалогу, Kokoro для fallback при перевантаженні.
Порівняння STT-рішень
| Параметр | Whisper large-v3 | Deepgram Nova-2 | Google STT |
|---|---|---|---|
| Затримка | 200-400 мс | 150-300 мс | 300-600 мс |
| Точність (російська) | 95% | 93% | 90% |
| Ціна за годину | $0.006 (Self-host) | $0.004 | $0.006 |
| Адаптація до акценту | Висока | Середня | Середня |
Для російськомовних сценаріїв Whisper large-v3 дає на 10% кращу точність, ніж Google STT, і на 5% кращу, ніж Deepgram. Таким чином, Whisper large-v3 перевершує Google STT на 10% за точністю, що критично для діалогових систем.
Процес роботи
- Аудит — аналіз поточної телефонії та вимог до NLP (1-2 дні).
- Проєктування — вибір STT/LLM/TTS, архітектура WebSocket, конвертація (3-5 днів).
- Реалізація — написання обробника, інтеграція з CRM, налаштування моніторингу (1-2 тижні).
- Тестування — навантажувальне тестування з емуляцією 100 дзвінків, перевірка точності розпізнавання (3-5 днів).
- Деплой — розгортання на сервері або в хмарі, документація API (2-3 дні).
Що входить в роботу
- Консультація та аудит вашої телефонної системи
- Проєктування архітектури Media Streams та WebSocket
- Реалізація обробника дзвінків (TwiML + WebSocket)
- Інтеграція STT (Whisper), LLM (GPT-4o / Claude), TTS (ElevenLabs / Kokoro)
- Конвертація аудіоформатів (μ-law ↔ PCM)
- Налаштування моніторингу та логування
- Документація API та інструкції для вашої команди
- Підтримка протягом 2 тижнів після запуску
Строки орієнтовно
Базовий бот на Twilio з одним сценарієм під ключ — від 2 тижнів. Production-рішення з мультимовністю та моніторингом — до 2 місяців. Вартість розраховується індивідуально, залежить від обсягу дзвінків та складності NLP. Twilio, Media Streams API — офіційна документація.
Переваги та контакти
Більше 5 років досвіду в голосових AI-системах, 10+ впроваджень Twilio Voice AI для ритейлу та логістики. Гарантуємо стабільність: p99 затримки < 2.5 сек, uptime 99.9%. Сертифіковані спеціалісти з Twilio та ML.
Пишіть нам — ми оцінимо ваш проєкт за 1 день і запропонуємо рішення під ключ. Отримайте консультацію та точний розрахунок строків.







