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()