import random import subprocess import os import gradio as gr import shutil class VideoProcessor: def __init__(self, segment_length): self.segment_length = segment_length def process(self, video, audio, progress): self._temp_dizinlerini_baslat() video_segmentleri, audio_segmentleri = self._segmentleri_kes(video, audio) islenmis_segmentler = self._segmentleri_isle(video_segmentleri, audio_segmentleri, progress) cikis_dosyasi = self._videolari_birlestir(islenmis_segmentler) self._gecici_dosyalari_temizle(video_segmentleri + audio_segmentleri) return cikis_dosyasi def _temp_dizinlerini_baslat(self): for dizin in ['temp/audio', 'temp/video']: shutil.rmtree(dizin, ignore_errors=True) os.makedirs(dizin, exist_ok=True) def _segmentleri_kes(self, video_dosyasi, audio_dosyasi): video_segmentleri = self._video_segmentlerini_kes(video_dosyasi) audio_segmentleri = self._audio_segmentlerini_kes(audio_dosyasi) return video_segmentleri, audio_segmentleri def _video_segmentlerini_kes(self, video_dosyasi): temp_dizin = 'temp/audio' segment_sablonu = f"{temp_dizin}/{random.randint(0,1000)}_%03d.mp4" komut = ["ffmpeg", "-i", video_dosyasi, "-c", "copy", "-f", "segment", "-segment_time", str(self.segment_length), segment_sablonu] subprocess.run(komut, check=True) return [segment_sablonu % i for i in range(len(os.listdir(temp_dizin)))] def _audio_segmentlerini_kes(self, audio_dosyasi): temp_dizin = 'temp/video' segment_sablonu = f"{temp_dizin}/{random.randint(0,1000)}_%03d.mp3" komut = ["ffmpeg", "-i", audio_dosyasi, "-f", "segment", "-segment_time", str(self.segment_length), segment_sablonu] subprocess.run(komut, check=True) return [segment_sablonu % i for i in range(len(os.listdir(temp_dizin)))] def _segmentleri_isle(self, video_segmentleri, audio_segmentleri, progress): islenmis_segmentler = [] for i, (video_seg, audio_seg) in progress.tqdm(enumerate(zip(video_segmentleri, audio_segmentleri))): islenmis_cikti = self._segmenti_isle(video_seg, audio_seg, i) islenmis_segmentler.append(islenmis_cikti) return islenmis_segmentler def _segmenti_isle(self, video_seg, audio_seg, i): cikis_dosyasi = f"results/{random.randint(10,100000)}_{i}.mp4" komut = ["python", "inference.py", "--face", video_seg, "--audio", audio_seg, "--outfile", cikis_dosyasi] subprocess.run(komut, check=True) return cikis_dosyasi def _videolari_birlestir(self, video_segmentleri): cikis_dosyasi = f"results/output_{random.randint(0,1000)}.mp4" with open("segments.txt", "w") as dosya: for segment in video_segmentleri: dosya.write(f"file '{segment}'\n") komut = ["ffmpeg", "-f", "concat", "-i", "segments.txt", "-c", "copy", cikis_dosyasi] subprocess.run(komut, check=True) return cikis_dosyasi def _gecici_dosyalari_temizle(self, dosya_listesi): for dosya_yolu in dosya_listesi: if os.path.isfile(dosya_yolu): os.remove(dosya_yolu) with gr.Blocks( title="Ses Tabanlı Dudak Senkronizasyonu", theme=gr.themes.Base( primary_hue=gr.themes.colors.green, font=["Source Sans Pro", "Arial", "sans-serif"], font_mono=['JetBrains mono', "Consolas", 'Courier New'] ), ) as demo: with gr.Row(): gr.Markdown("# Ses Tabanlı Dudak Senkronizasyonu") with gr.Row(): with gr.Column(): with gr.Row(): seg = gr.Number( label="Segment uzunluğu (Saniye), 0 için bölme yapılmaz") with gr.Row(): with gr.Column(): v = gr.Video(label='Kaynak Yüz') with gr.Column(): a = gr.Audio( type='filepath', label='Hedef Ses') with gr.Row(): btn = gr.Button(value="Sentezle",variant="primary") with gr.Row(): gr.Examples( label="Yüz Örnekleri", examples=[ os.path.join(os.path.dirname(__file__), "examples/face/1.mp4"), os.path.join(os.path.dirname(__file__), "examples/face/2.mp4"), os.path.join(os.path.dirname(__file__), "examples/face/3.mp4"), os.path.join(os.path.dirname(__file__), "examples/face/4.mp4"), os.path.join(os.path.dirname(__file__), "examples/face/5.mp4"), ], inputs=[v], fn=VideoProcessor(0).process, ) with gr.Row(): gr.Examples( label="Ses Örnekleri", examples=[ os.path.join(os.path.dirname(__file__), "examples/audio/1.wav"), os.path.join(os.path.dirname(__file__), "examples/audio/2.wav"), ], inputs=[a], fn=VideoProcessor(0).process, ) with gr.Column(): o = gr.Video(label="Çıkış Videosu") btn.click(fn=VideoProcessor(0).process, inputs=[seg