File size: 5,714 Bytes
15d5db5
 
 
 
 
0205607
15d5db5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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