trann / app.py
traltyaziking's picture
Update app.py
15d5db5
raw
history blame
5.71 kB
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