Spaces:
Sleeping
Sleeping
File size: 3,208 Bytes
dc61d50 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
import os
from utils.create_subtitles import hex_to_ffmpeg_color, create_subtitles
from utils.transcribe_audio import transcribe_audio
from utils.video_to_audio import extract_audio
import subprocess
def generate_rumble_clips(customization_options, output_directory="./data/rumble/clips"):
customization_options['font_color'] = hex_to_ffmpeg_color(customization_options['font_color'])
audio_file_path = "./data/rumble/audio.mp3"
subtitle_file = "./data/rumble/subtitles.srt"
clips = []
for idx, clip in enumerate(customization_options['clips']):
# Generate the clip
video_clip_path = cut_video(customization_options['video_url'], clip.start, clip.end, output_directory, idx)
clip.clip_link = video_clip_path
clips.append(clip)
# Generate the subtitles
extract_audio(video_clip_path, audio_file_path)
transcription = transcribe_audio(audio_file_path)
create_subtitles(transcription, subtitle_file)
# Add the subtitle to the video
subtitle_video_clip = add_subtitle(video_clip_path, subtitle_file, customization_options)
# Add the text to the video
video_with_text = add_text_to_video(subtitle_video_clip, customization_options)
video_sped_up = speed_up_video(video_with_text)
clip.clip_link = video_sped_up
return clips
def cut_video(input_url, start_time, end_time, output_directory, idx):
output_filepath = os.path.join(output_directory, f'output_clip_{idx}.mp4')
command = [
'ffmpeg',
'-i', input_url,
'-ss', start_time,
'-to', end_time,
'-y', output_filepath
]
subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return output_filepath
def add_subtitle(video_path, subtitle_file, customization_options):
output_filepath = video_path.replace('.mp4', '_with_subtitle.mp4')
subtitle_cmd = [
"ffmpeg",
"-i", video_path,
"-vf", f"subtitles={subtitle_file}:force_style='Fontsize={customization_options['font_size']},PrimaryColour={customization_options['font_color']},Fontname={customization_options['font_family']},MarginV=50'",
"-c:a", "copy",
'-y', output_filepath
]
subprocess.run(subtitle_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return output_filepath
def add_text_to_video(video_path, customization_options):
output_filepath = video_path.replace('.mp4', '_with_text.mp4')
text_cmd = [
"ffmpeg",
"-i", video_path,
'-vf', f'drawtext=text=\'{customization_options["credit"]}\':fontcolor=white:fontsize={customization_options["credit_size"]}:box=1:[email protected]:boxborderw=5:x=(w-text_w)/2:y=h-text_h-10',
"-c:a", "copy",
'-y', output_filepath
]
subprocess.run(text_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return output_filepath
def speed_up_video(video_path):
output_filepath = video_path.replace('.mp4', '_sped_up.mp4')
speed_up_cmd = [
"ffmpeg",
"-i", video_path,
"-filter:v", "setpts=0.66*PTS", # Speed up by 1.5x (1/1.5 = 0.6666)
"-filter:a", "atempo=1.5", # Speed up audio as well
"-c:v", "libx264", "-c:a", "aac",
"-strict", "experimental",
"-y", output_filepath
]
subprocess.run(speed_up_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
return output_filepath |