Отрицательная задержка voice AI: часы браузера и сервера
Если отчёт показывает отрицательную сетевую задержку, сначала проверьте часы. Разность timestamp браузера и timestamp сервера не обязательно измеряет передачу: устройства могут иметь разное абсолютное время. Переключение часов или неверная единица измерения дополнительно искажают результат.
Отделите событие от длительности
В учебном примере сервер отправил аудио с отметкой 10:00:00.500, а браузер зарегистрировал получение в 10:00:00.300. Получилось минус двести миллисекунд. Это не доказательство мгновенной передачи: браузерные часы могли отставать. Часовой пояс в отображении тоже нельзя путать с единым представлением времени.
| Измерение | Основание |
|---|---|
| Вызов TTS на сервере | Начало и конец одним локальным монотонным таймером |
| От получения звука до старта в браузере | Один локальный таймер браузера |
| Полный клиентский цикл запроса | Начало и конец на клиенте |
| Односторонняя передача между узлами | Согласованные часы и оценка погрешности |
Используйте монотонный таймер для интервала
Для интервалов внутри Python-процесса подходит time.monotonic(): его опорная точка не предназначена для календарной даты, поэтому сохраняют разность двух чтений. Нельзя отправить одно такое значение другому устройству и вычесть его из чужого таймера. В браузере похожую локальную задачу решает performance.now(); точность и доступность зависят от среды.
Для склейки событий храните идентификатор звонка, реплики, этап и источник отметки. Явно обозначайте единицы. Число в секундах и число в миллисекундах могут выглядеть правдоподобно после неверного преобразования, особенно на графике с автоматической шкалой.
Проверьте измерение искусственным сдвигом
В тестовых журналах прибавьте к абсолютным клиентским отметкам несколько секунд. Правильно рассчитанная локальная длительность должна остаться прежней. Если сумма этапов меняется, расчёт смешивает разные часы. Отдельно проверьте пропавшее событие: отсутствие отметки не означает нулевую длительность.
Полный клиентский интервал включает транспорт и локальную обработку; его нельзя без дополнительных данных объявить чистой сетевой задержкой. В отчёте показывайте, какая часть измерена непосредственно, какая вычислена, а какая неизвестна. Такой контракт помогает сравнивать версии без ложного улучшения из-за смены машины или часов.
Этот разбор подготовлен Latorn. Если вы уже знаете основы Python и API и хотите практиковать такие решения системно, сравните программу платного курса Voice AI Agents PRO со своей задачей. Открытый пример выше можно проверить самостоятельно; он не заменяет полный проект.
Технические источники: Python monotonic clock, MDN performance.now. Учебные ситуации и числа в статье придуманы для объяснения механизма.
Следующий шаг: Голосовые AI-агенты: диагностика диалога и аудио. По смежным вопросам: Аудиоочередь voice AI растёт: как найти backpressure, Обрыв звонка voice AI: как восстановить статус операции.
