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 |
)
|