gnosticdev commited on
Commit
d80bdda
·
verified ·
1 Parent(s): 51038bd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -27
app.py CHANGED
@@ -16,8 +16,8 @@ import asyncio
16
  Image.ANTIALIAS = Image.Resampling.LANCZOS
17
 
18
  # CONFIGURACIÓN
19
- INTRO_VIDEO = "introvideo.mp4"
20
- OUTRO_VIDEO = "outrovideo.mp4"
21
  MUSIC_BG = "musicafondo.mp3"
22
  FX_SOUND = "fxsound.mp3"
23
  WATERMARK = "watermark.png"
@@ -27,14 +27,17 @@ for file in [INTRO_VIDEO, OUTRO_VIDEO, MUSIC_BG, FX_SOUND, WATERMARK]:
27
  if not os.path.exists(file):
28
  raise FileNotFoundError(f"Falta: {file}")
29
 
30
- async def procesar_audio(texto, voz, duracion_total):
31
  try:
32
  communicate = edge_tts.Communicate(texto, voz)
 
 
 
33
 
34
- # Generar TTS en WAV (formato sin compresión)
35
- with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_wav:
36
- await communicate.save(tmp_wav.name)
37
- tts_audio = AudioSegment.from_wav(tmp_wav.name)
38
 
39
  # Preparar música de fondo en loop
40
  bg_music = AudioSegment.from_mp3(MUSIC_BG) - 10 # 10% volumen
@@ -43,17 +46,12 @@ async def procesar_audio(texto, voz, duracion_total):
43
  bg_music_final = bg_music_loop[:duracion_total*1000].fade_out(3000)
44
 
45
  # Combinar TTS (después de la intro) con música
46
- intro_duration = VideoFileClip(INTRO_VIDEO).duration * 1000 # Duración en ms
47
- audio_final = bg_music_final.overlay(tts_audio, position=intro_duration)
48
 
49
- # Exportar directamente como MP3 con parámetros robustos
50
- with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_mp3:
51
- audio_final.export(
52
- tmp_mp3.name,
53
- format="mp3",
54
- parameters=["-ac", "2", "-ar", "44100", "-b:a", "320k"]
55
- )
56
- return tmp_mp3.name
57
  except Exception as e:
58
  logging.error(f"Error procesando audio: {e}")
59
  raise
@@ -119,11 +117,8 @@ async def procesar_video(
119
  outro = VideoFileClip(OUTRO_VIDEO)
120
  video_final = concatenate_videoclips([intro, video_editado, outro])
121
 
122
- # Calcular duración total para la música
123
- duracion_total = video_final.duration
124
-
125
  # Generar audio (música en loop + TTS después de intro)
126
- audio_mix_path = await procesar_audio(texto_tts, voz_seleccionada, duracion_total)
127
 
128
  # Combinar video y audio
129
  video_final = video_final.set_audio(AudioFileClip(audio_mix_path))
@@ -143,19 +138,24 @@ async def procesar_video(
143
  raise
144
  finally:
145
  # Eliminar archivos temporales
146
- for file in temp_files + [getattr(video_input, 'name', None)]:
147
  try:
148
- if file and os.path.exists(file):
149
- os.remove(file)
150
- except Exception as e:
151
- logging.warning(f"Error eliminando {file}: {e}")
152
 
153
  # Interfaz Gradio
154
  with gr.Blocks() as demo:
155
  gr.Markdown("# Video Editor IA")
 
 
 
 
 
 
156
 
157
  with gr.Tab("Principal"):
158
- video_input = gr.Video(label="Subir video")
159
  texto_tts = gr.Textbox(label="Texto para TTS", lines=3)
160
  voz_seleccionada = gr.Dropdown(
161
  label="Voz",
 
16
  Image.ANTIALIAS = Image.Resampling.LANCZOS
17
 
18
  # CONFIGURACIÓN
19
+ INTRO_VIDEO = "introvideo.mp4" # Duración: 3s
20
+ OUTRO_VIDEO = "outrovideo.mp4" # Duración: 3s
21
  MUSIC_BG = "musicafondo.mp3"
22
  FX_SOUND = "fxsound.mp3"
23
  WATERMARK = "watermark.png"
 
27
  if not os.path.exists(file):
28
  raise FileNotFoundError(f"Falta: {file}")
29
 
30
+ async def procesar_audio(texto, voz):
31
  try:
32
  communicate = edge_tts.Communicate(texto, voz)
33
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_tts:
34
+ await communicate.save(tmp_tts.name)
35
+ tts_audio = AudioSegment.from_wav(tmp_tts.name)
36
 
37
+ # Calcular duración total (intro + contenido + outro)
38
+ intro = VideoFileClip(INTRO_VIDEO).duration
39
+ outro = VideoFileClip(OUTRO_VIDEO).duration
40
+ duracion_total = intro + outro + VideoFileClip(video_input).duration
41
 
42
  # Preparar música de fondo en loop
43
  bg_music = AudioSegment.from_mp3(MUSIC_BG) - 10 # 10% volumen
 
46
  bg_music_final = bg_music_loop[:duracion_total*1000].fade_out(3000)
47
 
48
  # Combinar TTS (después de la intro) con música
49
+ audio_final = bg_music_final.overlay(tts_audio, position=intro*1000)
 
50
 
51
+ # Exportar como MP3 con parámetros robustos
52
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_mix:
53
+ audio_final.export(tmp_mix.name, format="mp3", parameters=["-ac", "2", "-ar", "44100", "-b:a", "320k"])
54
+ return tmp_mix.name
 
 
 
 
55
  except Exception as e:
56
  logging.error(f"Error procesando audio: {e}")
57
  raise
 
117
  outro = VideoFileClip(OUTRO_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, video_input)
122
 
123
  # Combinar video y audio
124
  video_final = video_final.set_audio(AudioFileClip(audio_mix_path))
 
138
  raise
139
  finally:
140
  # Eliminar archivos temporales
141
+ for file in temp_files:
142
  try:
143
+ os.remove(file)
144
+ except:
145
+ pass
 
146
 
147
  # Interfaz Gradio
148
  with gr.Blocks() as demo:
149
  gr.Markdown("# Video Editor IA")
150
+ gr.Markdown("""
151
+ **Ejemplo de timeline generado:**
152
+ - 0s-3s: Intro (video + música)
153
+ - 3s-23s: Contenido editado (video + música + TTS)
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 (ej: 20s de duración)")
159
  texto_tts = gr.Textbox(label="Texto para TTS", lines=3)
160
  voz_seleccionada = gr.Dropdown(
161
  label="Voz",