Spaces:
Building
Building
Update app.py
Browse files
app.py
CHANGED
@@ -1,18 +1,12 @@
|
|
1 |
import gradio as gr
|
2 |
-
from tts_module import
|
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 |
-
# 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)
|
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 |
-
|
44 |
-
if text.strip(): # Prioridad al texto escrito directamente
|
45 |
final_text = text
|
46 |
-
elif txt_file is not None:
|
47 |
final_text = txt_file.decode("utf-8")
|
48 |
-
elif prompt.strip():
|
49 |
-
final_text = "Generated text from prompt"
|
50 |
else:
|
51 |
return "No input provided", None
|
52 |
|
53 |
-
|
54 |
-
|
|
|
|
|
|
|
|
|
|
|
55 |
|
56 |
-
|
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")
|