Цель — транслировать аудио и синхронизированное по губам видео в комнату 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
- Отдельная асинхронная задача использует фрагменты мела
- Для каждого фрагмента мела:
Запустить 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. Видео Аватара зависает или «застревает»
- Видео обновляется на несколько кадров
- Затем перестает обновляться, хотя звук продолжается
- Иногда возобновляется позже
- Случайные кадры отображаются синими или смещаются цвета
- Я подозреваю, что возникают проблемы с преобразованием BGR ↔ RGB ↔ RGBA
- Или неинициализированное использование кадров во время тайм-аутов
В журналах показано:
Код: Выделить всё
silero inference is slower than realtime
process memory usage is high
- Звук прерывается или прерывается на полуслове
- Видео и звук расходятся
- Снижение FPS от 25 → 24
- Ограниченный размер очереди мела
- Отключена запись видеофайлов (чистая потоковая передача)
- Перемещен Wav2Lip на графический процессор
- Отключено интенсивное ведение журнала
Кто-нибудь может мне помочь, как решить эту проблему?
Я хочу:
- Плавную синхронизацию губ в реальном времени
- Без зависаний кадров
- Стабильное воспроизведение звука
- Приемлемая задержка (качество может быть немного уменьшено)
Спасибо!!!
Подробнее здесь: https://stackoverflow.com/questions/798 ... dio-breaks
Мобильная версия