Rosetta-AI / subtitles.py
adeeb-khoja's picture
Added Moviepy ImageMagic Path
f5366a3 verified
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
import json
from moviepy.config import change_settings
change_settings({"IMAGEMAGICK_BINARY": "/usr/bin/convert"}) # Adjust the path as necessary
class SubtitlesRenderer(object):
def add_subtitles(self,video_file, subtitle_file, output_file):
# Load subtitle data from JSON
with open(subtitle_file, 'r', encoding='utf-8') as f:
subtitles = json.load(f)
# Load the video
video = VideoFileClip(video_file)
# Initialize an array to store TextClips
text_clips_list = []
# Define the maximum width for the subtitles
max_width = video.size[0] - 40 # Adjust as needed, leaving some padding on the sides
# Create TextClips for each subtitle
for subtitle in subtitles:
text = subtitle['text']
start_time = subtitle['start']
end_time = subtitle['end']
# Create TextClip with subtitle text
txt_clip = TextClip(text, fontsize=28, color='white', font='Arial', method='caption',size=(max_width, None),stroke_color='black',
stroke_width= 0.5, bg_color='black',)
# Set the duration of the subtitle
txt_clip = txt_clip.set_duration(end_time - start_time)
# Position the subtitle at the bottom
txt_clip = txt_clip.set_position(('center', 'bottom'))
# Add TextClip to the array
text_clips_list.append(txt_clip.set_start(start_time))
# Composite all TextClips onto the video
#final_clip = video.fl(compose_text, text_clips_list)
# Composite all TextClips onto the video
final_clip = CompositeVideoClip([video] + text_clips_list)
# Write the result to a file
final_clip.write_videofile(output_file, codec='libx264', fps=video.fps, audio_codec='aac',
ffmpeg_params=["-vf", "format=yuv420p"]) # Add this for compatibility
return output_file
# def compose_text(self,frame, t, text_clips):
# # Select the appropriate TextClips for the current time t
# current_clips = [text_clip for text_clip in text_clips if text_clip.start < t < text_clip.end]
# # Composite the selected TextClips onto the frame
# for clip in current_clips:
# frame = frame.blit(clip.get_frame(t - clip.start), clip.pos)
# return frame
if __name__ == '__main__':
video_file = 'video.mp4'
subtitle_file = 'segments.json'
output_file = 'output_video_with_subtitles.mp4'
renderer = SubtitlesRenderer()
renderer.add_subtitles(video_file, subtitle_file, output_file)