File size: 3,081 Bytes
53cc24b
 
 
0c56f63
263fa33
 
0c56f63
 
 
 
 
263fa33
0c56f63
 
263fa33
 
0c56f63
263fa33
53cc24b
 
 
 
263fa33
53cc24b
0c56f63
53cc24b
263fa33
 
0c56f63
 
 
53cc24b
 
0c56f63
 
53cc24b
 
 
 
 
 
 
 
 
 
 
 
 
 
263fa33
53cc24b
 
 
 
 
263fa33
53cc24b
0c56f63
53cc24b
263fa33
0c56f63
 
53cc24b
0c56f63
 
53cc24b
 
 
263fa33
 
53cc24b
 
 
0c56f63
263fa33
53cc24b
 
0c56f63
 
 
53cc24b
0c56f63
 
53cc24b
 
 
0c56f63
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
import gradio as gr
import subprocess
import os

# Não precisamos mais de nenhuma função de setup, clone ou pip install aqui!
# O Dockerfile já cuidou de tudo.

def run_inference_app(video_file, seed_num):
    if video_file is None:
        return None, "Por favor, envie um arquivo de vídeo."
    
    # O app roda de dentro do diretório /app/SeedVR, então os caminhos são relativos
    input_folder = "inputs"
    os.makedirs(input_folder, exist_ok=True)
    
    # O Gradio nos dá um caminho temporário, vamos movê-lo para um local conhecido
    input_video_path = os.path.join(input_folder, os.path.basename(video_file.name))
    os.rename(video_file.name, input_video_path)
        
    output_folder = "outputs"
    os.makedirs(output_folder, exist_ok=True)
    
    # Comando de inferência. O ambiente conda já está "ativado" graças ao Dockerfile.
    command = [
        "torchrun", "--nproc-per-node=4",
        "projects/inference_seedvr2_3b.py",
        "--video_path", input_folder,
        "--output_dir", output_folder,
        "--seed", str(seed_num),
        "--res_h", "320",
        "--res_w", "512",
    ]

    log_output = "Iniciando a inferência...\n" + ' '.join(command) + "\n\n"
    
    try:
        process = subprocess.Popen(
            command,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            encoding='utf-8'
        )

        while True:
            line = process.stdout.readline()
            if not line:
                break
            log_output += line
            print(line.strip())
            yield None, log_output

        process.wait()

        if process.returncode != 0:
            raise RuntimeError("O script de inferência falhou. Verifique os logs.")
        
        result_files = [os.path.join(output_folder, f) for f in os.listdir(output_folder) if f.endswith('.mp4')]
        if not result_files:
            return None, log_output + "\n\nERRO: Nenhum vídeo foi gerado."
            
        return result_files, log_output + "\n\nInferência concluída com sucesso!"

    except Exception as e:
        error_message = f"{log_output}\n\nOcorreu um erro: {str(e)}"
        return None, error_message

with gr.Blocks() as demo:
    gr.Markdown("# 🚀 Inferência SeedVR2 com Ambiente Conda")
    gr.Markdown("Este ambiente foi construído com Conda usando um Dockerfile para máxima estabilidade.")

    with gr.Row():
        with gr.Column(scale=1):
            video_input = gr.File(label="Vídeo de Entrada")
            seed_input = gr.Number(label="Seed", value=123)
            run_button = gr.Button("Gerar Vídeo", variant="primary")
        with gr.Column(scale=2):
            gallery_output = gr.Gallery(label="Vídeo de Saída", show_label=True)
            log_display = gr.Textbox(label="Logs de Execução", lines=15, interactive=False, autoscroll=True)
            
    run_button.click(
        fn=run_inference_app,
        inputs=[video_input, seed_input],
        outputs=[gallery_output, log_display]
    )

demo.launch()