Клієнт телефонує в підтримку — система розпізнає «хочу замовити» як «хочу закатати» через артефакти конвертації μ-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 день і запропонуємо рішення під ключ. Отримайте консультацію та точний розрахунок строків.







