Update app.py
Browse files
app.py
CHANGED
@@ -38,7 +38,7 @@ def eliminar_archivo_tiempo(ruta, delay=1800):
|
|
38 |
from threading import Timer
|
39 |
Timer(delay, eliminar).start()
|
40 |
|
41 |
-
async def procesar_audio(texto, voz, duracion_video, audio_original):
|
42 |
temp_files = []
|
43 |
try:
|
44 |
logging.info("Iniciando procesamiento de audio")
|
@@ -82,17 +82,11 @@ async def procesar_audio(texto, voz, duracion_video, audio_original):
|
|
82 |
|
83 |
audio_final = CompositeAudioClip(audios).set_duration(duracion_video)
|
84 |
logging.info("Audio procesado exitosamente")
|
85 |
-
return audio_final
|
86 |
|
87 |
except Exception as e:
|
88 |
logging.error(f"Fallo en procesamiento de audio: {str(e)}")
|
89 |
raise
|
90 |
-
finally:
|
91 |
-
for file in temp_files:
|
92 |
-
try:
|
93 |
-
os.remove(file)
|
94 |
-
except Exception as e:
|
95 |
-
logging.warning(f"Error limpiando {file}: {e}")
|
96 |
|
97 |
def aplicar_glitch(video_clip):
|
98 |
def glitch_effect(frame):
|
@@ -107,21 +101,22 @@ def aplicar_glitch(video_clip):
|
|
107 |
return video_clip.fl_image(glitch_effect)
|
108 |
|
109 |
async def procesar_fragmento(chunk, texto_tts, voz_seleccionada, start_time):
|
|
|
110 |
try:
|
111 |
audio_original = chunk.audio
|
112 |
duracion_chunk = chunk.duration
|
113 |
|
114 |
# Si el chunk es demasiado corto, devolver sin procesar
|
115 |
if duracion_chunk <= 18:
|
116 |
-
audio_final = await procesar_audio(
|
117 |
texto_tts,
|
118 |
voz_seleccionada,
|
119 |
duracion_chunk,
|
120 |
audio_original
|
121 |
)
|
122 |
-
return chunk.set_audio(audio_final)
|
123 |
|
124 |
-
audio_final = await procesar_audio(
|
125 |
texto_tts,
|
126 |
voz_seleccionada,
|
127 |
duracion_chunk,
|
@@ -159,20 +154,14 @@ async def procesar_fragmento(chunk, texto_tts, voz_seleccionada, start_time):
|
|
159 |
|
160 |
video_chunk = concatenate_videoclips(segments, method="compose")
|
161 |
video_chunk = video_chunk.set_audio(audio_final)
|
162 |
-
return video_chunk
|
163 |
|
164 |
except Exception as e:
|
165 |
logging.error(f"Fallo procesando fragmento: {str(e)}")
|
166 |
raise
|
167 |
-
finally:
|
168 |
-
try:
|
169 |
-
chunk.close()
|
170 |
-
audio_original.close()
|
171 |
-
audio_final.close()
|
172 |
-
except:
|
173 |
-
pass
|
174 |
|
175 |
async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
|
176 |
try:
|
177 |
logging.info("Iniciando procesamiento de video")
|
178 |
video_original = VideoFileClip(video_input, target_resolution=(720, 1280))
|
@@ -189,8 +178,9 @@ async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
189 |
processed_clips = []
|
190 |
for i, (start_time, chunk) in enumerate(chunks):
|
191 |
logging.info(f"Procesando chunk {i+1}/{len(chunks)}")
|
192 |
-
processed_chunk = await procesar_fragmento(chunk, texto_tts, voz_seleccionada, start_time)
|
193 |
processed_clips.append(processed_chunk)
|
|
|
194 |
|
195 |
# Combinar chunks
|
196 |
final_video = concatenate_videoclips(processed_clips, method="compose")
|
@@ -226,11 +216,17 @@ async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
226 |
raise
|
227 |
finally:
|
228 |
try:
|
|
|
229 |
video_original.close()
|
230 |
intro.close()
|
231 |
outro.close()
|
232 |
-
|
233 |
-
|
|
|
|
|
|
|
|
|
|
|
234 |
|
235 |
# Interfaz Gradio
|
236 |
with gr.Blocks() as demo:
|
|
|
38 |
from threading import Timer
|
39 |
Timer(delay, eliminar).start()
|
40 |
|
41 |
+
async def procesar_audio(texto, voz, duracion_video, audio_original=None):
|
42 |
temp_files = []
|
43 |
try:
|
44 |
logging.info("Iniciando procesamiento de audio")
|
|
|
82 |
|
83 |
audio_final = CompositeAudioClip(audios).set_duration(duracion_video)
|
84 |
logging.info("Audio procesado exitosamente")
|
85 |
+
return audio_final, temp_files # Retornamos los archivos temporales para limpieza
|
86 |
|
87 |
except Exception as e:
|
88 |
logging.error(f"Fallo en procesamiento de audio: {str(e)}")
|
89 |
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
|
91 |
def aplicar_glitch(video_clip):
|
92 |
def glitch_effect(frame):
|
|
|
101 |
return video_clip.fl_image(glitch_effect)
|
102 |
|
103 |
async def procesar_fragmento(chunk, texto_tts, voz_seleccionada, start_time):
|
104 |
+
temp_files = []
|
105 |
try:
|
106 |
audio_original = chunk.audio
|
107 |
duracion_chunk = chunk.duration
|
108 |
|
109 |
# Si el chunk es demasiado corto, devolver sin procesar
|
110 |
if duracion_chunk <= 18:
|
111 |
+
audio_final, temp_files = await procesar_audio(
|
112 |
texto_tts,
|
113 |
voz_seleccionada,
|
114 |
duracion_chunk,
|
115 |
audio_original
|
116 |
)
|
117 |
+
return chunk.set_audio(audio_final), temp_files
|
118 |
|
119 |
+
audio_final, temp_files = await procesar_audio(
|
120 |
texto_tts,
|
121 |
voz_seleccionada,
|
122 |
duracion_chunk,
|
|
|
154 |
|
155 |
video_chunk = concatenate_videoclips(segments, method="compose")
|
156 |
video_chunk = video_chunk.set_audio(audio_final)
|
157 |
+
return video_chunk, temp_files
|
158 |
|
159 |
except Exception as e:
|
160 |
logging.error(f"Fallo procesando fragmento: {str(e)}")
|
161 |
raise
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162 |
|
163 |
async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
164 |
+
temp_files = []
|
165 |
try:
|
166 |
logging.info("Iniciando procesamiento de video")
|
167 |
video_original = VideoFileClip(video_input, target_resolution=(720, 1280))
|
|
|
178 |
processed_clips = []
|
179 |
for i, (start_time, chunk) in enumerate(chunks):
|
180 |
logging.info(f"Procesando chunk {i+1}/{len(chunks)}")
|
181 |
+
processed_chunk, chunk_temp_files = await procesar_fragmento(chunk, texto_tts, voz_seleccionada, start_time)
|
182 |
processed_clips.append(processed_chunk)
|
183 |
+
temp_files.extend(chunk_temp_files)
|
184 |
|
185 |
# Combinar chunks
|
186 |
final_video = concatenate_videoclips(processed_clips, method="compose")
|
|
|
216 |
raise
|
217 |
finally:
|
218 |
try:
|
219 |
+
# Cerrar recursos solo después de completar todo el procesamiento
|
220 |
video_original.close()
|
221 |
intro.close()
|
222 |
outro.close()
|
223 |
+
for file in temp_files:
|
224 |
+
try:
|
225 |
+
os.remove(file)
|
226 |
+
except Exception as e:
|
227 |
+
logging.warning(f"Error limpiando {file}: {e}")
|
228 |
+
except Exception as e:
|
229 |
+
logging.warning(f"Error al cerrar recursos: {str(e)}")
|
230 |
|
231 |
# Interfaz Gradio
|
232 |
with gr.Blocks() as demo:
|