LivePortrait / app.py
Desident's picture
Create app.py
212208f verified
Raw
History Blame Contribute Delete
4.52 kB
import os
import sys
import subprocess
import cv2
import gradio as gr
from huggingface_hub import snapshot_download
# 1. Автоматичне завантаження всіх ONNX-ваг для LivePortrait
st.info if "streamlit" in sys.modules else print("Завантаження чекпоінтів FasterLivePortrait...")
checkpoint_dir = "./checkpoints"
if not os.path.exists(checkpoint_dir):
snapshot_download(repo_id="warmshao/FasterLivePortrait", local_dir=checkpoint_dir)
# Додаємо кастомні ліби у шлях, якщо клонуємо репозиторій локально
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')))
# Імпортуємо головний конвеєр FasterLivePortrait
# (Примітка: для роботи цього імпорту у корені мають лежати скрипти з репозиторію warmshao/FasterLivePortrait)
from src.pipelines.live_portrait_pipeline import LivePortraitPipeline
class LivePortraitAnimator:
def __init__(self):
# Налаштування конфігу під ONNX GPU інференс
self.pipeline = LivePortraitPipeline(
config_path="src/config/inference.yaml",
checkpoint_dir="./checkpoints",
mode="onnx", # Працюємо строго в ONNX-GPU режимі
device_id=0 # Активуємо твою CUDA карту на PRO акаунті
)
def animate(self, source_image_path, driving_video_path, stitching=True, relative_motion=True):
if not source_image_path or not driving_video_path:
return None
output_dir = "./animations"
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, "liveportrait_result.mp4")
# Запуск нативного 3D-таргетингу емоцій
self.pipeline.execute(
source_image=source_image_path,
driving_video=driving_video_path,
output_path=output_path,
stitching=stitching, # Безшовне вшивання обличчя назад у кадр
relative=relative_motion, # Перенос відносних рухів (тримає геометрію обличчя-джерела)
flag_crop=True # Автоматичне фокусування та кроп обличчя
)
return output_path
# Ініціалізація синглтона аніматора
animator = LivePortraitAnimator()
# 4. Побудова UI на Gradio (ідеально підходить для паралельного відображення Video/Image)
def create_ui():
with gr.Blocks(title="LivePortrait Studio PRO") as demo:
gr.Markdown("# 🎭 LivePortrait Studio — Емоційний Аніматор Обличчя (PRO GPU)")
gr.Markdown("Перенесення живої міміки, поглядів та емоцій з будь-якого driving-відео на фото-джерело.")
with gr.Row():
with gr.Column():
source_img = gr.Image(label="Завантажте фото обличчя (Source Image)", type="filepath")
driving_vid = gr.Video(label="Завантажте емоційне відео (Driving Video)", format="mp4")
with gr.Accordion("Просунуті налаштування маскування", open=False):
stitching_toggle = gr.Checkbox(label="Безшовне вшивання (Stitching)", value=True)
relative_toggle = gr.Checkbox(label="Відносний рух м'язів (Relative Motion)", value=True)
submit_btn = gr.Button("🚀 Запустити 3D Анімацію", variant="primary")
with gr.Column():
output_vid = gr.Video(label="Результат у кінематографічній якості (MP4)")
submit_btn.click(
fn=animator.animate,
inputs=[source_img, driving_vid, stitching_toggle, relative_toggle],
outputs=output_vid
)
return demo
if __name__ == "__main__":
demo = create_ui()
# Запуск Gradio всередині контейнера Hugging Face Spaces
demo.launch(server_name="0.0.0.0", server_port=7860)