Spaces:
Sleeping
Sleeping
| from moviepy.editor import VideoFileClip, AudioFileClip, TextClip, CompositeVideoClip | |
| from moviepy.video.tools.subtitles import SubtitlesClip | |
| import srt | |
| from datetime import timedelta | |
| import os | |
| def export_srt(text, duration=10, words_per_caption=6, output_path="output.srt"): | |
| """ | |
| Converts text into SRT subtitles and saves to output_path. | |
| """ | |
| lines = [] | |
| words = text.split() | |
| start = 0 | |
| index = 1 | |
| while start < len(words): | |
| end = start + words_per_caption | |
| chunk = words[start:end] | |
| content = " ".join(chunk) | |
| start_time = timedelta(seconds=(index - 1) * duration) | |
| end_time = timedelta(seconds=index * duration) | |
| sub = srt.Subtitle(index=index, start=start_time, end=end_time, content=content) | |
| lines.append(sub) | |
| start += words_per_caption | |
| index += 1 | |
| srt_data = srt.compose(lines) | |
| with open(output_path, "w", encoding="utf-8") as f: | |
| f.write(srt_data) | |
| return output_path | |
| def add_subtitles_and_bgm( | |
| video_path, | |
| srt_path, | |
| bgm_path, | |
| output_path="enhanced_output.mp4", | |
| font="Arial-Bold", | |
| font_size=36, | |
| font_color="white", | |
| subtitle_position=("center", "bottom") | |
| ): | |
| """ | |
| Adds subtitles from .srt and background music to the given video. | |
| """ | |
| # Load video | |
| video = VideoFileClip(video_path) | |
| # Parse .srt file | |
| with open(srt_path, "r", encoding="utf-8") as f: | |
| subtitles = list(srt.parse(f.read())) | |
| # Create subtitle clips | |
| def make_textclip(txt): | |
| return TextClip(txt, font=font, fontsize=font_size, color=font_color, stroke_color='black', stroke_width=2) | |
| subtitle_clips = [] | |
| for sub in subtitles: | |
| txt_clip = (make_textclip(sub.content) | |
| .set_position(subtitle_position) | |
| .set_start(sub.start.total_seconds()) | |
| .set_duration((sub.end - sub.start).total_seconds())) | |
| subtitle_clips.append(txt_clip) | |
| # Background music | |
| if os.path.exists(bgm_path): | |
| bgm = AudioFileClip(bgm_path).volumex(0.2) # reduce volume | |
| bgm = bgm.set_duration(video.duration) | |
| final_audio = video.audio.volumex(0.8).audio_fadein(1).audio_fadeout(1).set_duration(video.duration) | |
| final_audio = final_audio.set_audio(bgm) | |
| else: | |
| final_audio = video.audio | |
| final = CompositeVideoClip([video, *subtitle_clips]) | |
| final = final.set_audio(final_audio) | |
| # Export final video | |
| final.write_videofile(output_path, codec="libx264", audio_codec="aac", fps=video.fps) | |
| return output_path | |
| # Aliases for compatibility with streamlit_ui.py | |
| generate_srt_from_text = export_srt | |
| enhance_video_with_subtitles_and_bgm = add_subtitles_and_bgm | |