Spaces:
Sleeping
Sleeping
Commit
·
e2fc4a2
1
Parent(s):
c78f8d1
Fix video_service.py
Browse files- app/services/video_service.py +10 -13
app/services/video_service.py
CHANGED
@@ -45,16 +45,15 @@ def generate_video_file(script: str, duration: int = None) -> str:
|
|
45 |
tts = gTTS(text=script, lang='en')
|
46 |
tts.save(audio_path)
|
47 |
|
48 |
-
# Get audio duration
|
49 |
audio = MP3(audio_path)
|
50 |
-
audio_duration = max(audio.info.length, 3.0)
|
51 |
|
52 |
-
# Step
|
53 |
images = fetch_unsplash_images(script, count=3)
|
54 |
if not images:
|
55 |
raise Exception("No images found from Unsplash for the prompt")
|
56 |
|
57 |
-
# Step 3: Create slideshow clips
|
58 |
clips = []
|
59 |
per_image_duration = audio_duration / len(images)
|
60 |
tmp_files = []
|
@@ -70,28 +69,26 @@ def generate_video_file(script: str, duration: int = None) -> str:
|
|
70 |
clip = ImageClip(tmp_file).resize(height=720).set_duration(per_image_duration)
|
71 |
clips.append(clip)
|
72 |
|
73 |
-
|
74 |
-
final_clip = concatenate_videoclips(clips, method="compose")
|
75 |
-
final_clip = final_clip.set_duration(audio_duration)
|
76 |
-
|
77 |
-
# Step 5: Add audio
|
78 |
final_clip = final_clip.set_audio(AudioFileClip(audio_path))
|
79 |
|
80 |
-
#
|
81 |
final_clip.write_videofile(
|
82 |
video_path,
|
83 |
fps=24,
|
84 |
codec="libx264",
|
85 |
audio_codec="aac",
|
86 |
threads=4,
|
87 |
-
preset="ultrafast"
|
|
|
|
|
88 |
)
|
89 |
|
90 |
-
# Cleanup
|
91 |
for file in tmp_files:
|
92 |
try:
|
93 |
os.remove(file)
|
94 |
except:
|
95 |
pass
|
96 |
|
97 |
-
return video_filename
|
|
|
45 |
tts = gTTS(text=script, lang='en')
|
46 |
tts.save(audio_path)
|
47 |
|
48 |
+
# Step 2: Get audio duration
|
49 |
audio = MP3(audio_path)
|
50 |
+
audio_duration = max(audio.info.length, 3.0)
|
51 |
|
52 |
+
# Step 3: Fetch Unsplash images
|
53 |
images = fetch_unsplash_images(script, count=3)
|
54 |
if not images:
|
55 |
raise Exception("No images found from Unsplash for the prompt")
|
56 |
|
|
|
57 |
clips = []
|
58 |
per_image_duration = audio_duration / len(images)
|
59 |
tmp_files = []
|
|
|
69 |
clip = ImageClip(tmp_file).resize(height=720).set_duration(per_image_duration)
|
70 |
clips.append(clip)
|
71 |
|
72 |
+
final_clip = concatenate_videoclips(clips, method="compose").set_duration(audio_duration)
|
|
|
|
|
|
|
|
|
73 |
final_clip = final_clip.set_audio(AudioFileClip(audio_path))
|
74 |
|
75 |
+
# ✅ Use /tmp temp audio to avoid "generated" folder
|
76 |
final_clip.write_videofile(
|
77 |
video_path,
|
78 |
fps=24,
|
79 |
codec="libx264",
|
80 |
audio_codec="aac",
|
81 |
threads=4,
|
82 |
+
preset="ultrafast",
|
83 |
+
temp_audiofile="/tmp/temp-audio.m4a",
|
84 |
+
remove_temp=True
|
85 |
)
|
86 |
|
87 |
+
# Cleanup
|
88 |
for file in tmp_files:
|
89 |
try:
|
90 |
os.remove(file)
|
91 |
except:
|
92 |
pass
|
93 |
|
94 |
+
return video_filename
|