SadTalker-API / app.py
akin23's picture
Update app.py
33f8d7c verified
import gradio as gr
import subprocess
import os
import requests
from datetime import datetime
# 🔽 Dosya yoksa Hugging Face'ten indir
def download_if_missing(url, local_path):
if not os.path.exists(local_path):
print(f"⬇️ İndiriliyor: {url}")
r = requests.get(url)
r.raise_for_status()
with open(local_path, "wb") as f:
f.write(r.content)
else:
print(f"✅ Zaten var: {local_path}")
# 📦 Tüm model dosyalarını indir
def fetch_all_checkpoints():
os.makedirs("checkpoints", exist_ok=True)
base_url = "https://huggingface.co/akin23/SadTalker-Checkpoints/resolve/main"
files = [
"facevid2vid_00189-model_aa",
"facevid2vid_00189-model_bb",
"facevid2vid_00189-model_cc",
"facevid2vid_00189-model_dd",
"facevid2vid_00189-model_ee",
"epoch_20.pth",
"mapping_00109-model.pth.tar",
"mapping_00229-model.pth.tar",
"auido2exp_00300-model.pth",
"auido2pose_00140-model.pth",
"shape_predictor_68_face_landmarks.dat"
]
for filename in files:
url = f"{base_url}/{filename}"
local_path = f"checkpoints/{filename}"
download_if_missing(url, local_path)
# 🔧 facevid2vid parçalarını birleştir
def merge_model_parts():
parts = [
"checkpoints/facevid2vid_00189-model_aa",
"checkpoints/facevid2vid_00189-model_bb",
"checkpoints/facevid2vid_00189-model_cc",
"checkpoints/facevid2vid_00189-model_dd",
"checkpoints/facevid2vid_00189-model_ee"
]
output_file = "checkpoints/facevid2vid_00189-model.pth.tar"
if not os.path.exists(output_file):
with open(output_file, "wb") as out:
for part in parts:
with open(part, "rb") as p:
out.write(p.read())
print("✅ Model parçaları birleştirildi.")
else:
print("🟡 Birleştirilmiş dosya zaten var.")
# 🧩 Dosyaları indir ve birleştir
fetch_all_checkpoints()
merge_model_parts()
# 🔁 Ana video üretim fonksiyonu
def generate_video(source_image, driven_audio):
output_dir = "results"
os.makedirs(output_dir, exist_ok=True)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
result_path = f"{output_dir}/video_{timestamp}.mp4"
cmd = f"python inference.py --driven_audio {driven_audio} --source_image {source_image} --result_dir {output_dir} --enhancer gfpgan --pose_style 45 --still --preprocess full"
subprocess.run(cmd, shell=True)
return result_path
# 🎛️ Gradio arayüzü
demo = gr.Interface(
fn=generate_video,
inputs=[
gr.Image(type="filepath", label="Source Image"),
gr.Audio(type="filepath", label="Driven Audio")
],
outputs=gr.Video(label="Generated Video")
)
# 🚀 Başlat
demo.launch()