Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -2,7 +2,7 @@ import os
|
|
2 |
import random
|
3 |
import requests
|
4 |
import gradio as gr
|
5 |
-
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip,
|
6 |
from moviepy.audio.fx.all import audio_loop
|
7 |
import edge_tts
|
8 |
import asyncio
|
@@ -21,7 +21,7 @@ def run_async(coro):
|
|
21 |
loop.close()
|
22 |
return result
|
23 |
|
24 |
-
# Load local text generation model
|
25 |
try:
|
26 |
generator = pipeline("text-generation", model="mistralai/Mistral-7B-Instruct-v0.2", device="cpu")
|
27 |
except Exception as e:
|
@@ -53,7 +53,7 @@ def generate_script(prompt, custom_text=None):
|
|
53 |
except Exception as e:
|
54 |
print(f"Error generating script: {e}")
|
55 |
|
56 |
-
# Fallback mock response
|
57 |
if "recetas" in prompt.lower():
|
58 |
return """
|
59 |
1. Tacos al pastor: Jugosa carne marinada con piña.
|
@@ -75,19 +75,6 @@ async def generate_voice(text, output_file="output.mp3"):
|
|
75 |
await communicate.save(output_file)
|
76 |
return output_file
|
77 |
|
78 |
-
# Generate subtitles
|
79 |
-
def generate_subtitles(text, duration, fps=24):
|
80 |
-
words = text.split()
|
81 |
-
avg_duration = duration / len(words)
|
82 |
-
subtitles = []
|
83 |
-
for i, word in enumerate(words):
|
84 |
-
start_time = i * avg_duration
|
85 |
-
end_time = (i + 1) * avg_duration
|
86 |
-
subtitle = TextClip(word, fontsize=30, color='white', bg_color='black', size=(1280, 100), font='Arial')
|
87 |
-
subtitle = subtitle.set_position(('center', 'bottom')).set_duration(avg_duration).set_fps(fps)
|
88 |
-
subtitles.append(subtitle)
|
89 |
-
return subtitles
|
90 |
-
|
91 |
# Download and trim video
|
92 |
def download_and_trim_video(url, duration, output_path):
|
93 |
response = requests.get(url, stream=True)
|
@@ -138,15 +125,11 @@ def create_video(prompt, custom_text, music_file):
|
|
138 |
if music_file:
|
139 |
music = AudioFileClip(music_file.name)
|
140 |
music = audio_loop(music, duration=video_duration)
|
141 |
-
|
142 |
else:
|
143 |
-
|
144 |
-
|
145 |
-
# Add subtitles
|
146 |
-
subtitles = generate_subtitles(script, video_duration)
|
147 |
-
final_clip = CompositeVideoClip([final_clip] + subtitles)
|
148 |
|
149 |
-
# Write final video
|
150 |
final_clip.write_videofile(output_video, codec="libx264", audio_codec="aac", fps=24)
|
151 |
|
152 |
# Clean up
|
|
|
2 |
import random
|
3 |
import requests
|
4 |
import gradio as gr
|
5 |
+
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip, CompositeVideoClip
|
6 |
from moviepy.audio.fx.all import audio_loop
|
7 |
import edge_tts
|
8 |
import asyncio
|
|
|
21 |
loop.close()
|
22 |
return result
|
23 |
|
24 |
+
# Load local text generation model
|
25 |
try:
|
26 |
generator = pipeline("text-generation", model="mistralai/Mistral-7B-Instruct-v0.2", device="cpu")
|
27 |
except Exception as e:
|
|
|
53 |
except Exception as e:
|
54 |
print(f"Error generating script: {e}")
|
55 |
|
56 |
+
# Fallback mock response
|
57 |
if "recetas" in prompt.lower():
|
58 |
return """
|
59 |
1. Tacos al pastor: Jugosa carne marinada con piña.
|
|
|
75 |
await communicate.save(output_file)
|
76 |
return output_file
|
77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
# Download and trim video
|
79 |
def download_and_trim_video(url, duration, output_path):
|
80 |
response = requests.get(url, stream=True)
|
|
|
125 |
if music_file:
|
126 |
music = AudioFileClip(music_file.name)
|
127 |
music = audio_loop(music, duration=video_duration)
|
128 |
+
final_clip = final_clip.set_audio(music.set_duration(video_duration))
|
129 |
else:
|
130 |
+
final_clip = final_clip.set_audio(audio)
|
|
|
|
|
|
|
|
|
131 |
|
132 |
+
# Write final video (no subtitles to avoid ImageMagick error)
|
133 |
final_clip.write_videofile(output_video, codec="libx264", audio_codec="aac", fps=24)
|
134 |
|
135 |
# Clean up
|