Spaces:
Runtime error
Runtime error
| 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 | |