Update app.py
Browse files
app.py
CHANGED
@@ -37,7 +37,10 @@ async def procesar_audio(texto, voz):
|
|
37 |
# Calcular duraci贸n total (intro + contenido + outro)
|
38 |
intro = VideoFileClip(INTRO_VIDEO).duration
|
39 |
outro = VideoFileClip(OUTRO_VIDEO).duration
|
40 |
-
|
|
|
|
|
|
|
41 |
|
42 |
# Preparar m煤sica de fondo en loop
|
43 |
bg_music = AudioSegment.from_mp3(MUSIC_BG) - 10 # 10% volumen
|
@@ -118,7 +121,7 @@ async def procesar_video(
|
|
118 |
video_final = concatenate_videoclips([intro, video_editado, outro])
|
119 |
|
120 |
# Generar audio (m煤sica en loop + TTS despu茅s de intro)
|
121 |
-
audio_mix_path = await procesar_audio(texto_tts, voz_seleccionada
|
122 |
|
123 |
# Combinar video y audio
|
124 |
video_final = video_final.set_audio(AudioFileClip(audio_mix_path))
|
@@ -148,29 +151,34 @@ async def procesar_video(
|
|
148 |
with gr.Blocks() as demo:
|
149 |
gr.Markdown("# Video Editor IA")
|
150 |
gr.Markdown("""
|
151 |
-
**Ejemplo
|
152 |
-
-
|
153 |
-
-
|
154 |
-
- 23s-26s: Outro (video + m煤sica con fade-out)
|
155 |
""")
|
156 |
-
|
157 |
with gr.Tab("Principal"):
|
158 |
-
video_input = gr.Video(label="Subir video (
|
159 |
-
texto_tts = gr.Textbox(label="Texto para TTS",
|
160 |
voz_seleccionada = gr.Dropdown(
|
161 |
label="Voz",
|
162 |
-
choices=["es-ES-AlvaroNeural", "es-MX-BeatrizNeural"]
|
|
|
163 |
)
|
164 |
-
procesar_btn = gr.Button("Generar Video")
|
165 |
-
video_output = gr.Video(label="Resultado")
|
166 |
-
|
167 |
-
with gr.Tab("Ajustes"):
|
168 |
metodo_corte = gr.Radio(
|
169 |
["inteligente", "manual"],
|
170 |
label="M茅todo de corte",
|
171 |
value="inteligente"
|
172 |
)
|
173 |
-
duracion_corte = gr.Slider(1, 60, 10, label="Duraci贸n por corte (solo manual)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
174 |
|
175 |
procesar_btn.click(
|
176 |
procesar_video,
|
|
|
37 |
# Calcular duraci贸n total (intro + contenido + outro)
|
38 |
intro = VideoFileClip(INTRO_VIDEO).duration
|
39 |
outro = VideoFileClip(OUTRO_VIDEO).duration
|
40 |
+
|
41 |
+
# Obtener duraci贸n del video principal
|
42 |
+
video_principal = VideoFileClip("ejemplo.mp4")
|
43 |
+
duracion_total = intro + outro + video_principal.duration
|
44 |
|
45 |
# Preparar m煤sica de fondo en loop
|
46 |
bg_music = AudioSegment.from_mp3(MUSIC_BG) - 10 # 10% volumen
|
|
|
121 |
video_final = concatenate_videoclips([intro, video_editado, outro])
|
122 |
|
123 |
# Generar audio (m煤sica en loop + TTS despu茅s de intro)
|
124 |
+
audio_mix_path = await procesar_audio(texto_tts, voz_seleccionada)
|
125 |
|
126 |
# Combinar video y audio
|
127 |
video_final = video_final.set_audio(AudioFileClip(audio_mix_path))
|
|
|
151 |
with gr.Blocks() as demo:
|
152 |
gr.Markdown("# Video Editor IA")
|
153 |
gr.Markdown("""
|
154 |
+
**Ejemplo preconfigurado:**
|
155 |
+
- Video: `ejemplo.mp4` (duraci贸n aproximada: 20s)
|
156 |
+
- Texto TTS: "Este es un ejemplo de texto sintetizado usando TTS. La m煤sica suena en loop durante todo el video."
|
|
|
157 |
""")
|
158 |
+
|
159 |
with gr.Tab("Principal"):
|
160 |
+
video_input = gr.Video(label="Subir video (opcional)")
|
161 |
+
texto_tts = gr.Textbox(label="Texto para TTS", value="Este es un ejemplo de texto sintetizado usando TTS. La m煤sica suena en loop durante todo el video.")
|
162 |
voz_seleccionada = gr.Dropdown(
|
163 |
label="Voz",
|
164 |
+
choices=["es-ES-AlvaroNeural", "es-MX-BeatrizNeural"],
|
165 |
+
value="es-ES-AlvaroNeural"
|
166 |
)
|
|
|
|
|
|
|
|
|
167 |
metodo_corte = gr.Radio(
|
168 |
["inteligente", "manual"],
|
169 |
label="M茅todo de corte",
|
170 |
value="inteligente"
|
171 |
)
|
172 |
+
duracion_corte = gr.Slider(1, 60, 10, label="Duraci贸n por corte (solo manual)", value=10)
|
173 |
+
procesar_btn = gr.Button("Generar Video")
|
174 |
+
video_output = gr.Video(label="Resultado")
|
175 |
+
|
176 |
+
# EJEMPLO PREDEFINIDO EN EL FOOTER DE GRADIO
|
177 |
+
demo.load(
|
178 |
+
lambda: "ejemplo.mp4",
|
179 |
+
inputs=None,
|
180 |
+
outputs=video_input
|
181 |
+
)
|
182 |
|
183 |
procesar_btn.click(
|
184 |
procesar_video,
|