File size: 5,191 Bytes
bd2f353
0fc70c3
11cf479
d627392
79ec25e
d627392
 
 
8aca7f6
 
 
 
 
 
 
 
d627392
49487f1
8aca7f6
 
49487f1
c3dd560
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bd2f353
8aca7f6
bd2f353
d627392
bd2f353
2f4dbe2
 
bd2f353
d627392
 
 
49487f1
 
 
 
 
 
79ec25e
49487f1
bd2f353
d627392
bd2f353
8aca7f6
b24dca3
 
79ec25e
8a67596
c5ad3c6
8a67596
d627392
8aca7f6
cef6ce0
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
import gradio as gr
import subprocess
import os

def generate(video, audio, checkpoint, no_smooth, resize_factor, pad_top, pad_bottom, pad_left, pad_right, save_as_video):
    if video is None or audio is None or checkpoint is None:
        return "Пожалуйста, загрузите видео/изображение и аудио файл, а также выберите чекпойнт."

    # Отладка: проверка текущей директории и наличия inference.py
    print(f"Текущая рабочая директория: {os.getcwd()}")
    print(f"Содержимое текущей директории: {os.listdir('.')}")
    print(f"Проверка наличия 'inference.py': {os.path.exists('inference.py')}")

    # Используем пути к файлам напрямую
    video_path = video  # Строка с путем к видео
    audio_path = audio  # Строка с путем к аудио

    # Логирование путей для отладки
    print(f"Путь к видео: {video_path}")
    print(f"Путь к аудио: {audio_path}")

    # Создание директории 'outputs' для сохранения выходного видео
    output_dir = "outputs"
    os.makedirs(output_dir, exist_ok=True)

    # Определение выходного файла
    output_path = os.path.join(output_dir, "output.mp4")
    print(f"Путь к выходному файлу: {output_path}")

    # Подготовка аргументов для инференса
    args = [
        "--checkpoint_path", f"checkpoints/{checkpoint}.pth",
        "--segmentation_path", "checkpoints/face_segmentation.pth",
        "--enhance_face", "gfpgan",
        "--face", video_path,
        "--audio", audio_path,
        "--outfile", output_path,
        "--resize_factor", str(resize_factor),
        "--pads", str(pad_top), str(pad_bottom), str(pad_left), str(pad_right)
    ]

    if no_smooth:
        args.append("--nosmooth")

    if save_as_video:
        args.append("--save_as_video")

    try:
        # Вызов команды инференса без изменения рабочей директории
        cmd = ["python", "inference.py"] + args
        print(f"Запуск инференса с командой: {' '.join(cmd)}")
        subprocess.run(cmd, check=True)
    except subprocess.CalledProcessError as e:
        print(f"Ошибка при выполнении команды: {e}")
        return f"Произошла ошибка при обработке: {e}"

    # Проверка наличия выходного файла
    if not os.path.exists(output_path):
        print("Выходной файл не существует.")
        return "Не удалось создать выходное видео."

    # Возвращаем путь к выходному файлу
    print(f"Выходной файл создан по пути: {output_path}")
    return output_path  # Gradio автоматически обработает путь и выведет видео

# Корректная структура Gradio Blocks
with gr.Blocks() as ui:
    gr.Markdown("## Wav2Lip - Синхронизация губ в видео")
    with gr.Row():
        video = gr.File(label="Видео или Изображение", type="filepath")
        audio = gr.File(label="Аудио", type="filepath")
        with gr.Column():
            checkpoint = gr.Radio(["wav2lip", "wav2lip_gan"], label="Чекпойнт", value="wav2lip_gan")
            no_smooth = gr.Checkbox(label="Без сглаживания", value=False)
            resize_factor = gr.Slider(minimum=1, maximum=4, step=1, label="Фактор изменения размера", value=1)
    with gr.Row():
        with gr.Column():
            pad_top = gr.Slider(minimum=0, maximum=50, step=1, value=0, label="Отступ сверху")
            pad_bottom = gr.Slider(minimum=0, maximum=50, step=1, value=10, label="Отступ снизу (рекомендуется 20 для включения подбородка)")
            pad_left = gr.Slider(minimum=0, maximum=50, step=1, value=0, label="Отступ слева")
            pad_right = gr.Slider(minimum=0, maximum=50, step=1, value=0, label="Отступ справа")
            save_as_video = gr.Checkbox(label="Сохранять как видео", value=True)  # Новый элемент управления
            generate_btn = gr.Button("Сгенерировать")
        with gr.Column():
            result = gr.Video(label="Результат")

    # Вызов метода .click() внутри контекста gr.Blocks()
    generate_btn.click(
        generate, 
        inputs=[video, audio, checkpoint, no_smooth, resize_factor, pad_top, pad_bottom, pad_left, pad_right, save_as_video], 
        outputs=result,
        concurrency_limit=1  # Устанавливаем лимит на количество одновременно выполняемых операций
    )

# Запуск приложения
ui.launch(debug=True)