DHEIVER commited on
Commit
ab496c0
·
verified ·
1 Parent(s): d7774e8

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -0
app.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import moviepy.editor as mp
3
+ from pydub import AudioSegment
4
+ from pydub.silence import detect_nonsilent
5
+ import tempfile
6
+ import os
7
+
8
+ def process_video(video_path, min_silence_len=1000, silence_thresh=-40):
9
+ """
10
+ Remove segmentos silenciosos do vídeo.
11
+
12
+ Args:
13
+ video_path: Caminho do arquivo de vídeo
14
+ min_silence_len: Duração mínima do silêncio em ms
15
+ silence_thresh: Limite de dB para detectar silêncio
16
+ """
17
+ # Criar diretório temporário para arquivos processados
18
+ temp_dir = tempfile.mkdtemp()
19
+
20
+ # Carregar o vídeo
21
+ video = mp.VideoFileClip(video_path)
22
+
23
+ # Extrair áudio para arquivo temporário
24
+ temp_audio = os.path.join(temp_dir, "temp_audio.wav")
25
+ video.audio.write_audiofile(temp_audio)
26
+
27
+ # Carregar áudio com pydub
28
+ audio = AudioSegment.from_wav(temp_audio)
29
+
30
+ # Detectar segmentos não silenciosos
31
+ nonsilent_ranges = detect_nonsilent(
32
+ audio,
33
+ min_silence_len=min_silence_len,
34
+ silence_thresh=silence_thresh
35
+ )
36
+
37
+ if not nonsilent_ranges:
38
+ return video_path
39
+
40
+ # Converter timestamps para segundos
41
+ nonsilent_ranges_sec = [(start/1000.0, end/1000.0) for start, end in nonsilent_ranges]
42
+
43
+ # Cortar e concatenar segmentos não silenciosos
44
+ clips = [video.subclip(start, end) for start, end in nonsilent_ranges_sec]
45
+ final_clip = mp.concatenate_videoclips(clips)
46
+
47
+ # Salvar vídeo processado
48
+ output_path = os.path.join(temp_dir, "processed_video.mp4")
49
+ final_clip.write_videofile(output_path)
50
+
51
+ # Limpar
52
+ video.close()
53
+ os.remove(temp_audio)
54
+
55
+ return output_path
56
+
57
+ def remove_silence(video, silence_duration, silence_threshold):
58
+ if video is None:
59
+ return None
60
+
61
+ try:
62
+ processed_video = process_video(
63
+ video,
64
+ min_silence_len=int(silence_duration * 1000), # Converter para ms
65
+ silence_thresh=silence_threshold
66
+ )
67
+ return processed_video
68
+ except Exception as e:
69
+ return str(e)
70
+
71
+ # Interface Gradio
72
+ with gr.Blocks(title="Removedor de Silêncio de Vídeos") as app:
73
+ gr.Markdown("# Removedor de Silêncio de Vídeos")
74
+ gr.Markdown("Faça upload de um vídeo e ajuste os parâmetros para remover segmentos silenciosos.")
75
+
76
+ with gr.Row():
77
+ with gr.Column():
78
+ video_input = gr.Video(label="Vídeo de Entrada")
79
+ silence_duration = gr.Slider(
80
+ minimum=0.1,
81
+ maximum=5.0,
82
+ value=1.0,
83
+ step=0.1,
84
+ label="Duração Mínima do Silêncio (segundos)"
85
+ )
86
+ silence_threshold = gr.Slider(
87
+ minimum=-60,
88
+ maximum=-20,
89
+ value=-40,
90
+ step=1,
91
+ label="Limite de Silêncio (dB)"
92
+ )
93
+ process_btn = gr.Button("Processar Vídeo")
94
+
95
+ with gr.Column():
96
+ video_output = gr.Video(label="Vídeo Processado")
97
+
98
+ process_btn.click(
99
+ fn=remove_silence,
100
+ inputs=[video_input, silence_duration, silence_threshold],
101
+ outputs=video_output
102
+ )
103
+
104
+ if __name__ == "__main__":
105
+ app.launch()