Към съдържанието

Клиентско изживяване

800-те милисекунди зад гласов агент, който звучи нормално

Осемстотин милисекунди, разделени между codec, VAD, ASR, LLM и TTS. Колко струва реално всеки етап и кой допълнителен етап плаща български гласов агент.

Публикувано
Четене
8 мин
Стъпва на
Публикувани latency данни на доставчици и телеком стандарти, плюс собствената ни архитектурна работа — още не сме пуснали български гласов агент в продукция

Всяко демо на гласов агент звучи добре. Демото върви на микрофона на лаптопа, с широколентов звук, един говорещ, без опашка и без CRM. Продукцията върви по телефонна линия на 8kHz към система, която трябва да провери нещо, преди изобщо да отговори.

Разликата между двете преживявания не е в интелигентността. Тя е 800 милисекунди и вече е похарчена, докато екипът още спори кой модел да използва.

800ms е праг на възприятие, а не цел за производителност

Паузите между репликите в човешки разговор са средно около 500ms. След горе-долу 800ms слушащият престава да чува пауза и започва да чува проблем — лоша връзка, човек, който не е разбрал, или машина.

Затова работната цел в продукция е медиана на voice-to-voice latency от 800ms, измерена от последната сричка на обаждащия се до първата чута сричка обратно, при p95 под 1500ms. Второто число има по-голямо значение от първото. Над около 1,2s на p50 хората започват да говорят върху агента, това задейства логиката за прекъсване, агентът спира и започва отначало — и разговорът се разпада по-бързо, отколкото самата стойност на latency подсказва.

Публикуваната разбивка на Daily/Pipecat разпределя бюджета приблизително така:

  • прихващане на микрофона и мрежа навътре: 50–100ms
  • voice activity detection и решение за край на репликата: 50–100ms
  • финализиране на speech-to-text: 100–200ms
  • LLM time to first token: 80–100ms
  • TTS time to first byte: 80–100ms
  • буфериране при възпроизвеждане навън: 50–100ms

Съберете средните стойности и сте на тавана. В този бюджет няма луфт за нищо, което не е изброено.

Кодекът харчи част от бюджета, преди стекът ви да чуе звука

Телефонният звук е G.711 µ-law, 8kHz, моно. Twilio Media Streams го доставя като base64-кодиран суров µ-law през WebSocket без файлови хедъри и позволява точно един двупосочен поток на разговор — тоест ако сте разчитали на втори поток за паралелна транскрипция, няма да го получите. DTMF по този поток е само входящ.

Теснолентовият звук не е само въпрос на latency. Той е въпрос на точност, който се превръща във въпрос на latency. Беззвучните съгласни се сливат, поредиците от цифри се размиват и ASR връща хипотези с по-ниска увереност, които логиката ви после трябва да потвърди — а това струва цяла допълнителна реплика, около 3–4 секунди, не 40 милисекунди. Най-евтиният начин да взривите бюджета си е да спестите 50ms в пайплайна и да ги похарчите за „бихте ли повторили последните четири цифри“.

Endpointing е най-голямото перо по избор, а стандартната му стойност е грешна

Решението кога обаждащият се е свършил да говори е най-настройваният параметър в гласовия AI и се настройва срещу истински компромис, а не се оптимизира.

Параметърът endpointing на Deepgram е с подразбираща се стойност 10ms тишина. Никой не пуска това в продукция: при 10ms агентът прекъсва всеки, който си поеме дъх. Реалните стекове я презаписват и я комбинират с utterance_end_ms и vad_events. Моделът Flux на Deepgram, направен специално за разпознаване на смяна на реплика при гласови агенти, излага решението директно като eot_threshold (0,5–1,0, по подразбиране 0,7), eager_eot_threshold (0,3–0,9) и eot_timeout_ms (по подразбиране 5000).

Типичното забавяне при край на изказване е 200–500ms. Под около 250ms агентът започва да реже хората по средата на изречението — особено онези, които правят пауза, докато четат номер от сметка. Над 500ms целият разговор се усеща бавен, независимо колко бърз е моделът.

Тук отива по-голямата част от усилието по настройка и си струва да се каже направо: избирате между агент, който прекъсва, и агент, който изостава. Няма стойност, която да избегне и двете.

Едно последователно CRM обръщение струва повече от модела

Time to first token е 80–150ms без tool call и 200–500ms с такъв. Всяко следващо последователно обръщение към CRM или билинг система добавя 300–800ms.

Две верижни справки — първо идентификация на клиента, после изтегляне на фактурата му — сами по себе си изяждат целия voice-to-voice бюджет и никакъв избор на модел не го връща. Решенията са архитектурни, не на ниво модел: prefetch по номера на обаждащия се още при вдигане, така че профилът да е в контекста преди първата реплика; паралелно, а не последователно изпълнение на независимите справки; и агент, който изрича истинско потвърждение, докато справката тече, вместо да буферира тишина.

Последното е разликата между система, която се усеща бърза, и система, която е бърза. Това не е едно и също, а клиентът оценява само едното.

Българският плаща етап, който английският стек няма

Ето конкретното ограничение, което променя архитектурата, а не настройките.

Deepgram Flux — моделът с вградено разпознаване на смяна на реплика — поддържа английски плюс девет езика: испански, френски, немски, хинди, руски, португалски, японски, италиански и нидерландски. Българският не е сред тях. Българският е поддържан от Nova-3 и Nova-2, а откъм синтез — от ElevenLabs Multilingual v2, Flash v2.5 и v3.

Последицата е структурна. Английският агент може да остави ASR да отговаря за endpointing. Българският не може и затова върви със Silero VAD плюс отделен семантичен модел за край на реплика редом с Nova-3 — допълнителен компонент в горещия път, със собствено inference време, върху най-тясния етап от бюджета. Планирайте българския етап за смяна на реплика в горния край на диапазона 50–100ms, не в долния, и си върнете разликата другаде.

Word error rate утежнява картината. Публикуваните диапазони са 5–8% при чист широколентов английски, 8–15% при английски по телефон на 8kHz и 12–25% при български по телефон, когато включите фамилии и буквено-цифрови низове. 20% WER върху десетцифрен ЕГН не е проблем с транскрипцията, а проблем с бизнес процеса.

Затова идентификацията трябва да минава през клавиатурата, с ASR като резервен вариант и цикъл за прочитане обратно за потвърждение — никога само през ASR. Заредете keyterm boosting с реалните имена на продукти и тарифи и със списък с български фамилии. И измерете базов WER върху записите на самия клиент, преди някой да е обещал процент на автоматизирано обслужване, защото този процент стои надолу по веригата след WER и да го обещаете преди него е гадаене.

Barge-in е проблем с изчистване на буфери, а „да“ го влошава

Когато клиентът прекъсне, агентът обикновено вече е изпратил няколко секунди аудио в буфер надолу по веригата. Спирането на генерацията не спира възпроизвеждането. Трябва изрично да изхвърлите това, което чака на опашката — съобщението clear при Twilio, interrupt() при LiveKit — иначе агентът говори върху човека, който току-що го е прекъснал.

После идва ехото. При високоговорител без acoustic echo cancellation агентът чува собствения си глас, приема го за реч и прекъсва сам себе си. Talk-over процент над около 3% от продължителността на разговора е сигналът, че едно от двете е счупено.

Българската особеност е реална и, доколкото можем да преценим, не се решава със стандартните контроли. В английския потвърждаващите междуметия са лексически отделни: „mhm“ и „uh-huh“ никога не са отговор на въпрос, затова ignoreBackchannel и евристики по брой думи като min_words на LiveKit могат да ги филтрират безопасно. В българския „да“ е едновременно най-честото потвърждаващо междуметие и утвърдителният отговор на всеки въпрос за потвърждение, който агентът задава. Филтър, който го игнорира, изхвърля истински отговори; филтър, който го зачита, позволява на всяко „аха“ да отреже агента. Работещият компромис е контекстен — потискайте едносрични потвърждения навсякъде освен непосредствено след въпрос за потвърждение — и той трябва да се измери върху вашите собствени разговори, а не да се предполага.

Къде този бюджет престава да е интересният проблем

Latency е ограничението, което решава дали агентът е използваем. Рядко е ограничението, което решава дали си струва да бъде построен.

Изходящата тарифа на Twilio към български мобилни номера е около 0,2109 USD на минута срещу 0,0331 USD към стационарни. Терминацията, а не inference-ът, доминира себестойността на българския гласов агент. Четиридесет милисекунди, отнети от TTS, са инженерно удовлетворение; една минута, свалена от средното време за обработка на обаждане, е бизнес обосновката.

И едно правило, което заслужава да влезе в runbook-а преди пускане: когато p95 voice-to-voice премине прага под натоварване, агентът прехвърля към опашката вместо да поднася тримесекундни паузи. Времето на изчакване е познато преживяване. Агент, който е станал бавен, е счупен агент.

Нека сме ясни какво е тази статия. Още не сме пуснали български гласов агент в продукция — доставената ни работа е европейски маркетплейс за автомобили, платформа за агенция за AI автоматизация, речникът на Министерството на образованието и науката на beron.mon.bg и автоматизация на имейл маркетинга за козметична марка. Това е бюджетът, към който бихме държали един такъв проект, и първото нещо, което бихме измерили върху вашите записи. Не е case study и предпочитаме да го кажем сега, отколкото да го откриете по-късно.

Абстрактна топла светлина върху тъмен фон

Това ли е проблемът, с който живеете?

Ако този текст описва вашата ситуация, най-бързата следваща стъпка е разговор с човека, който го е написал.

30 минути, без ангажимент, а каквото стигнем, остава при вас.