Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,7 +6,6 @@ from moviepy.editor import *
|
|
6 |
import edge_tts
|
7 |
import gradio as gr
|
8 |
from pydub import AudioSegment
|
9 |
-
import math # <-- M贸dulo faltante
|
10 |
|
11 |
# Configuraci贸n de Logs
|
12 |
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
@@ -15,10 +14,10 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(
|
|
15 |
INTRO_VIDEO = "introvideo.mp4"
|
16 |
OUTRO_VIDEO = "outrovideo.mp4"
|
17 |
MUSIC_BG = "musicafondo.mp3"
|
18 |
-
FX_GLITCH = "glitch.mp4" #
|
19 |
EJEMPLO_VIDEO = "ejemplo.mp4"
|
20 |
|
21 |
-
# Validar existencia de archivos
|
22 |
for file in [INTRO_VIDEO, OUTRO_VIDEO, MUSIC_BG, FX_GLITCH, EJEMPLO_VIDEO]:
|
23 |
if not os.path.exists(file):
|
24 |
logging.error(f"Falta archivo necesario: {file}")
|
@@ -58,13 +57,13 @@ async def procesar_audio(texto, voz, duracion_video):
|
|
58 |
|
59 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_bg:
|
60 |
bg_music.export(tmp_bg.name, format="mp3")
|
61 |
-
bg_audio = AudioFileClip(tmp_bg.name).volumex(0.
|
62 |
temp_files.append(tmp_bg.name)
|
63 |
|
64 |
# Combinar audios
|
65 |
audio_final = CompositeAudioClip([
|
66 |
bg_audio.set_duration(duracion_video),
|
67 |
-
tts_audio.volumex(0.
|
68 |
]).set_duration(duracion_video)
|
69 |
|
70 |
return audio_final
|
@@ -80,15 +79,18 @@ async def procesar_audio(texto, voz, duracion_video):
|
|
80 |
logging.warning(f"Error limpiando {file}: {e}")
|
81 |
|
82 |
def agregar_glitch(video, intervalo=40):
|
83 |
-
"""Agrega glitch cada X segundos
|
84 |
-
|
85 |
-
|
|
|
86 |
|
87 |
-
# Crear
|
88 |
glitches = []
|
89 |
-
for t in range(intervalo, math.ceil(
|
90 |
-
|
|
|
91 |
|
|
|
92 |
return CompositeVideoClip([video] + glitches)
|
93 |
|
94 |
async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
@@ -98,7 +100,7 @@ async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
98 |
outro = VideoFileClip(OUTRO_VIDEO)
|
99 |
video_original = VideoFileClip(video_input)
|
100 |
|
101 |
-
# Duraci贸n
|
102 |
duracion_video = video_original.duration
|
103 |
|
104 |
# Procesar audio
|
@@ -107,10 +109,13 @@ async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
107 |
# Agregar glitch al video original
|
108 |
video_con_glitch = agregar_glitch(video_original, intervalo=40)
|
109 |
|
110 |
-
# Combinar con
|
|
|
|
|
|
|
111 |
video_final = concatenate_videoclips(
|
112 |
[intro, video_con_glitch, outro],
|
113 |
-
method="chain"
|
114 |
)
|
115 |
|
116 |
# Renderizar video final
|
@@ -119,7 +124,7 @@ async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
119 |
tmp.name,
|
120 |
codec="libx264",
|
121 |
audio_codec="aac",
|
122 |
-
fps=
|
123 |
threads=4,
|
124 |
verbose=False
|
125 |
)
|
|
|
6 |
import edge_tts
|
7 |
import gradio as gr
|
8 |
from pydub import AudioSegment
|
|
|
9 |
|
10 |
# Configuraci贸n de Logs
|
11 |
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
|
|
|
14 |
INTRO_VIDEO = "introvideo.mp4"
|
15 |
OUTRO_VIDEO = "outrovideo.mp4"
|
16 |
MUSIC_BG = "musicafondo.mp3"
|
17 |
+
FX_GLITCH = "glitch.mp4" # Glitch con su duraci贸n original
|
18 |
EJEMPLO_VIDEO = "ejemplo.mp4"
|
19 |
|
20 |
+
# Validar existencia de archivos
|
21 |
for file in [INTRO_VIDEO, OUTRO_VIDEO, MUSIC_BG, FX_GLITCH, EJEMPLO_VIDEO]:
|
22 |
if not os.path.exists(file):
|
23 |
logging.error(f"Falta archivo necesario: {file}")
|
|
|
57 |
|
58 |
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_bg:
|
59 |
bg_music.export(tmp_bg.name, format="mp3")
|
60 |
+
bg_audio = AudioFileClip(tmp_bg.name).volumex(0.15)
|
61 |
temp_files.append(tmp_bg.name)
|
62 |
|
63 |
# Combinar audios
|
64 |
audio_final = CompositeAudioClip([
|
65 |
bg_audio.set_duration(duracion_video),
|
66 |
+
tts_audio.volumex(0.85).set_start(0)
|
67 |
]).set_duration(duracion_video)
|
68 |
|
69 |
return audio_final
|
|
|
79 |
logging.warning(f"Error limpiando {file}: {e}")
|
80 |
|
81 |
def agregar_glitch(video, intervalo=40):
|
82 |
+
"""Agrega glitch cada X segundos SIN modificar el video original"""
|
83 |
+
glitch = VideoFileClip(FX_GLITCH) # Usar duraci贸n real del glitch
|
84 |
+
duracion_glitch = glitch.duration
|
85 |
+
duracion_video = video.duration
|
86 |
|
87 |
+
# Crear glitches en intervalos
|
88 |
glitches = []
|
89 |
+
for t in range(intervalo, math.ceil(duracion_video), intervalo):
|
90 |
+
glitch_clip = glitch.set_start(t).set_pos("center")
|
91 |
+
glitches.append(glitch_clip)
|
92 |
|
93 |
+
# Superponer glitches al video original
|
94 |
return CompositeVideoClip([video] + glitches)
|
95 |
|
96 |
async def procesar_video(video_input, texto_tts, voz_seleccionada):
|
|
|
100 |
outro = VideoFileClip(OUTRO_VIDEO)
|
101 |
video_original = VideoFileClip(video_input)
|
102 |
|
103 |
+
# Duraci贸n del video editado (sin intro/outro)
|
104 |
duracion_video = video_original.duration
|
105 |
|
106 |
# Procesar audio
|
|
|
109 |
# Agregar glitch al video original
|
110 |
video_con_glitch = agregar_glitch(video_original, intervalo=40)
|
111 |
|
112 |
+
# Combinar video con glitch y audio
|
113 |
+
video_con_glitch = video_con_glitch.set_audio(audio_final)
|
114 |
+
|
115 |
+
# Concatenar intro + video + outro
|
116 |
video_final = concatenate_videoclips(
|
117 |
[intro, video_con_glitch, outro],
|
118 |
+
method="chain" # Concatenaci贸n secuencial
|
119 |
)
|
120 |
|
121 |
# Renderizar video final
|
|
|
124 |
tmp.name,
|
125 |
codec="libx264",
|
126 |
audio_codec="aac",
|
127 |
+
fps=video_original.fps, # Mantener FPS original
|
128 |
threads=4,
|
129 |
verbose=False
|
130 |
)
|