gnosticdev commited on
Commit
aa29714
verified
1 Parent(s): 2cbc556

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -28
app.py CHANGED
@@ -1,18 +1,12 @@
1
  import gradio as gr
2
- from tts_module import list_voices, text_to_speech
3
- from pexels_api import search_pexels # Aseg煤rate de que este archivo est茅 correctamente configurado
4
  from moviepy.editor import AudioFileClip, VideoFileClip, CompositeAudioClip
5
  import asyncio
6
  import os
7
  import requests
8
  import tempfile
9
 
10
- # Obtener lista de voces disponibles
11
- async def get_voices():
12
- voices = await list_voices()
13
- return list(voices.keys())
14
-
15
- # Ajustar m煤sica de fondo
16
  def adjust_background_music(video_duration, music_file):
17
  from moviepy.editor import AudioFileClip, concatenate_audioclips
18
  music = AudioFileClip(music_file)
@@ -22,39 +16,38 @@ def adjust_background_music(video_duration, music_file):
22
  music = concatenate_audioclips(music_clips)
23
  if music.duration > video_duration:
24
  music = music.subclip(0, video_duration)
25
- music = music.volumex(0.2) # Reducir volumen al 20%
26
  return music
27
 
28
- # Combinar audio, video y m煤sica
29
  def combine_audio_video(audio_file, video_clip, music_clip=None):
30
  audio_clip = AudioFileClip(audio_file)
31
  final_clip = video_clip.set_audio(audio_clip)
32
-
33
  if music_clip:
34
  final_clip = final_clip.set_audio(CompositeAudioClip([audio_clip, music_clip]))
35
-
36
  output_path = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4").name
37
  final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
38
  return output_path
39
 
40
- # Funci贸n principal
41
  def process_input(text, txt_file, mp3_file, prompt, selected_voice):
42
  try:
43
- # Paso 1: Obtener el texto final
44
- if text.strip(): # Prioridad al texto escrito directamente
45
  final_text = text
46
- elif txt_file is not None: # Luego al archivo .txt
47
  final_text = txt_file.decode("utf-8")
48
- elif prompt.strip(): # Finalmente, usar el prompt para generar texto
49
- final_text = "Generated text from prompt" # Placeholder
50
  else:
51
  return "No input provided", None
52
 
53
- # Paso 2: Convertir texto a voz con edge_tts
54
- audio_file = asyncio.run(text_to_speech(final_text, selected_voice))
 
 
 
 
 
55
 
56
- # Paso 3: Buscar videos en Pexels
57
- query = final_text.split(".")[0] # Usar la primera oraci贸n como consulta
58
  try:
59
  video_links = search_pexels(query, num_results=1)
60
  if not video_links:
@@ -62,27 +55,22 @@ def process_input(text, txt_file, mp3_file, prompt, selected_voice):
62
  except Exception as e:
63
  return f"Error al buscar videos en Pexels: {e}", None
64
 
65
- # Descargar el primer video encontrado
66
  video_response = requests.get(video_links[0])
67
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as tmp_video:
68
  tmp_video.write(video_response.content)
69
  video_clip = VideoFileClip(tmp_video.name)
70
 
71
- # Paso 4: Ajustar la m煤sica de fondo
72
  if mp3_file is not None:
73
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
74
  else:
75
  music_clip = None
76
 
77
- # Paso 5: Combinar todos los elementos
78
  final_video = combine_audio_video(audio_file, video_clip, music_clip)
79
-
80
  return final_video
81
 
82
  except Exception as e:
83
  return f"Error durante el procesamiento: {e}", None
84
 
85
- # Interfaz Gradio
86
  with gr.Blocks() as demo:
87
  gr.Markdown("# Text-to-Video Generator")
88
  with gr.Row():
@@ -92,7 +80,7 @@ with gr.Blocks() as demo:
92
  mp3_file_input = gr.File(label="Upload background music (.mp3)", file_types=[".mp3"])
93
  prompt_input = gr.Textbox(label="Or enter a prompt to generate text")
94
  voices = asyncio.run(get_voices())
95
- voice_dropdown = gr.Dropdown(choices=voices, label="Select Voice")
96
 
97
  with gr.Column():
98
  output_video = gr.Video(label="Generated Video")
 
1
  import gradio as gr
2
+ from tts_module import get_voices, text_to_speech
3
+ from pexels_api import search_pexels
4
  from moviepy.editor import AudioFileClip, VideoFileClip, CompositeAudioClip
5
  import asyncio
6
  import os
7
  import requests
8
  import tempfile
9
 
 
 
 
 
 
 
10
  def adjust_background_music(video_duration, music_file):
11
  from moviepy.editor import AudioFileClip, concatenate_audioclips
12
  music = AudioFileClip(music_file)
 
16
  music = concatenate_audioclips(music_clips)
17
  if music.duration > video_duration:
18
  music = music.subclip(0, video_duration)
19
+ music = music.volumex(0.2)
20
  return music
21
 
 
22
  def combine_audio_video(audio_file, video_clip, music_clip=None):
23
  audio_clip = AudioFileClip(audio_file)
24
  final_clip = video_clip.set_audio(audio_clip)
 
25
  if music_clip:
26
  final_clip = final_clip.set_audio(CompositeAudioClip([audio_clip, music_clip]))
 
27
  output_path = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4").name
28
  final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac")
29
  return output_path
30
 
 
31
  def process_input(text, txt_file, mp3_file, prompt, selected_voice):
32
  try:
33
+ if text.strip():
 
34
  final_text = text
35
+ elif txt_file is not None:
36
  final_text = txt_file.decode("utf-8")
37
+ elif prompt.strip():
38
+ final_text = "Generated text from prompt"
39
  else:
40
  return "No input provided", None
41
 
42
+ if not selected_voice:
43
+ return "Por favor, seleccione una voz v谩lida.", None
44
+
45
+ try:
46
+ audio_file = asyncio.run(text_to_speech(final_text, selected_voice))
47
+ except Exception as e:
48
+ return f"Error con la voz seleccionada: {e}", None
49
 
50
+ query = final_text.split(".")[0]
 
51
  try:
52
  video_links = search_pexels(query, num_results=1)
53
  if not video_links:
 
55
  except Exception as e:
56
  return f"Error al buscar videos en Pexels: {e}", None
57
 
 
58
  video_response = requests.get(video_links[0])
59
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as tmp_video:
60
  tmp_video.write(video_response.content)
61
  video_clip = VideoFileClip(tmp_video.name)
62
 
 
63
  if mp3_file is not None:
64
  music_clip = adjust_background_music(video_clip.duration, mp3_file.name)
65
  else:
66
  music_clip = None
67
 
 
68
  final_video = combine_audio_video(audio_file, video_clip, music_clip)
 
69
  return final_video
70
 
71
  except Exception as e:
72
  return f"Error durante el procesamiento: {e}", None
73
 
 
74
  with gr.Blocks() as demo:
75
  gr.Markdown("# Text-to-Video Generator")
76
  with gr.Row():
 
80
  mp3_file_input = gr.File(label="Upload background music (.mp3)", file_types=[".mp3"])
81
  prompt_input = gr.Textbox(label="Or enter a prompt to generate text")
82
  voices = asyncio.run(get_voices())
83
+ voice_dropdown = gr.Dropdown(choices=list(voices.keys()), label="Select Voice")
84
 
85
  with gr.Column():
86
  output_video = gr.Video(label="Generated Video")