Аватар Wav2Lip + LiveKit в реальном времени: зависание видео, синие кадры и обрывы звука — как правильно синхронизироватPython

Программы на Python
Ответить
Anonymous
 Аватар Wav2Lip + LiveKit в реальном времени: зависание видео, синие кадры и обрывы звука — как правильно синхронизироват

Сообщение Anonymous »

Я создаю говорящий аватар в реальном времени, используя LiveKit Agents и Wav2Lip.

Цель — транслировать аудио и синхронизированное по губам видео в комнату LiveKit в реальном времени.

Что я пытаюсь создать
Конвейер

Код: Выделить всё

User mic
→ STT
→ LLM
→ TTS
→ mel spectrogram chunks
→ Wav2Lip (GPU)
→ video frames
→ LiveKit video track
  • Аудио транслируется в прямом эфире через LiveKit TTS.
  • Кадры видео генерируются для каждого фрагмента мела с помощью Wav2Lip.
  • Одно изображение аватара (

    Код: Выделить всё

    avatar.png
    ) используется в качестве ввода лица
То, что я реализовал на данный момент
1. Узел аудио (TTS)
  • Я немедленно передаю аудиокадры в LiveKit (низкая задержка)
  • Я буферизирую звук PCM для каждого ответа
  • После завершения TTS я:

    Преобразую PCM → float
  • Пересемплировать до 16 кГц
  • Создать мел-спектрограмму
  • Разбить мел на фрагменты (эквивалент ≈ 24 кадра в секунду)
  • Поместить фрагменты мела в асинхронную очередь для узел аватара

Код: Выделить всё

async for frame in Agent.default.tts_node(self, text, model_settings):
pcm_chunks.append(frame.data)
yield frame  # audio goes live immediately
2. Узел аватара (видео)
  • Отдельная асинхронная задача использует фрагменты мела
  • Для каждого фрагмента мела:

    Запустить datagen(...)
  • Запустить вывод Wav2Lip на графическом процессоре
  • Объединить область рта обратно в кадр аватара
  • Преобразовать кадр в RGBA
  • Переместить кадр в LiveKit с помощью VideoSource.capture_frame

Упрощенный цикл:

Код: Выделить всё

mel_chunk = await avatar_queue.get()

gen = datagen([avatar_frame], [mel_chunk])
img_batch, mel_batch, frames, coords = next(gen)

pred = model(mel_batch, img_batch)
composite frame
video_source.capture_frame(...)
Я ограничиваю размер очереди, чтобы избежать переполнения памяти:

Код: Выделить всё

if avatar_queue.qsize() < 5:
await avatar_queue.put(mel_chunk)
Проблемы, с которыми я столкнулся
1. Видео Аватара зависает или «застревает»
  • Видео обновляется на несколько кадров
  • Затем перестает обновляться, хотя звук продолжается
  • Иногда возобновляется позже
2. Аватар становится синим
  • Случайные кадры отображаются синими или смещаются цвета
  • Я подозреваю, что возникают проблемы с преобразованием BGR ↔ RGB ↔ RGBA
  • Или неинициализированное использование кадров во время тайм-аутов
3. Звук прерывается/заикается
В журналах показано:

Код: Выделить всё

silero inference is slower than realtime
process memory usage is high
Симптомы:
  • Звук прерывается или прерывается на полуслове
  • Видео и звук расходятся
Что я уже пробовал
  • Снижение FPS от 25 → 24
  • Ограниченный размер очереди мела
  • Отключена запись видеофайлов (чистая потоковая передача)
  • Перемещен Wav2Lip на графический процессор
  • Отключено интенсивное ведение журнала
По-прежнему наблюдаются зависания и дрейф.
Кто-нибудь может мне помочь, как решить эту проблему?
Я хочу:
  • Плавную синхронизацию губ в реальном времени
  • Без зависаний кадров
  • Стабильное воспроизведение звука
  • Приемлемая задержка (качество может быть немного уменьшено)
Пожалуйста, кто-нибудь может подсказать мне правильную архитектуру или модель синхронизации.

Спасибо!!!

Подробнее здесь: https://stackoverflow.com/questions/798 ... dio-breaks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»