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