После перебивания возвращается старый TTS: поздние аудиочанки
Очередь аудио уже очищена, но через мгновение бот снова произносит кусок старого ответа. Возможная причина — поздние чанки: они находились в сети или обработчике во время отмены и попали в очередь после её очистки. Повторная очистка скрывает симптом, но не задаёт правило приёма.
Разделите реплику и отдельный аудиопакет
В учебном приложении каждому ответу назначают поколение: A, затем B. После перебивания A становится недействительным. Каждый асинхронный обработчик сохраняет поколение, для которого работал. Перед добавлением данных он сверяет его с текущим поколением воспроизведения. Это проектный контракт приложения, а не универсальное имя поля любого TTS SDK.
| Событие | Ожидаемое поведение |
|---|---|
| В очередь поступает A1 | Принять, пока A активно |
| Пользователь перебивает A | Инвалидировать A и остановить его воспроизведение |
| Из сети приходит A2 | Отклонить устаревший чанк |
| Начинается B, приходит B1 | Принять новый звук |
Проверка поколения должна находиться у границы передачи в аудиовыход. Если её выполнить раньше, между проверкой и записью может произойти отмена. Уточните модель конкурентности: один event loop, блокировка или иной механизм должен сохранять выбранный порядок перехода состояния и записи.
Сделайте гонку воспроизводимой
Замените внешний TTS управляемым источником. Сначала выдайте A1, затем задержите A2. Выполните перебивание, запустите B и только после этого освободите A2. Проверьте список реально отправленных чанков: запоздавший A2 отсутствует, B1 остаётся. Иначе исправление может случайно очищать уже новую реплику.
Отдельно проверьте повторную отмену, завершение A до отмены и ошибку остановки провайдера. Запрос отмены внешнего потока может не гарантировать немедленное прекращение всех callbacks. Локальный фильтр состояния нужен независимо от того, когда завершится удалённый запрос.
Проверьте границу внешнего буфера
Чанк, уже переданный телефонному провайдеру, нельзя убрать из локальной очереди. Для двустороннего Twilio Media Streams предусмотрены сообщения clear и mark; их назначение следует сверять отдельно от отмены генерации. Локальный журнал приёма, журнал отправки и слышимый результат — три разных доказательства.
Описанный тест проверяет порядок событий в приложении. После него нужен контрольный звонок с реальным аудиотрактом: задержки и буферы внешней системы в локальной модели не воспроизводятся полностью.
Этот разбор подготовлен Latorn. Если вы уже знаете основы Python и API и хотите практиковать такие решения системно, сравните программу платного курса Voice AI Agents PRO со своей задачей. Открытый пример выше можно проверить самостоятельно; он не заменяет полный проект.
Технические источники: Twilio media messages, LiveKit interruption handling. Учебные ситуации и числа в статье придуманы для объяснения механизма.
Следующий шаг: Голосовые AI-агенты: диагностика диалога и аудио. По смежным вопросам: Голосовой бот путает номера и даты: как подтверждать данные, Голосовой агент шипит или молчит: проверьте формат аудио.
