Spaces:
Sleeping
Sleeping
from utils.create_subtitles import hex_to_ffmpeg_color, create_subtitles | |
from utils.transcribe_audio import transcribe_audio | |
from utils.text_to_speech import text_to_speech | |
import subprocess | |
import os | |
def generate_minecraft_subtitles(customization_options, subtitles): | |
customization_options['font_color'] = hex_to_ffmpeg_color(customization_options['font_color']) | |
audio_file_path = "./data/minecraft/audio.mp3" | |
subtitle_file = "./data/minecraft/subtitles.srt" | |
background_video_path = customization_options['background_video'] | |
output_directory = "./data/minecraft/videos" | |
text_to_speech(subtitles, audio_file_path) | |
transcription = transcribe_audio(audio_file_path) | |
create_subtitles(transcription, subtitle_file) | |
audio_output_video_path = background_video_operations(background_video_path, audio_file_path, output_directory) | |
subtitle_output_path = add_subtitle(audio_output_video_path, subtitle_file, customization_options, output_directory) | |
result_output_path = add_text_to_video(subtitle_output_path, customization_options, output_directory) | |
return result_output_path | |
def background_video_operations(background_video_path, audio_file_path, output_directory): | |
muted_output_filepath = os.path.join(output_directory, 'video_muted.mp4') | |
trimmed_output_filepath = os.path.join(output_directory, 'video_muted_trimmed.mp4') | |
audio_output_video_path = os.path.join(output_directory, 'audio_background_video.mp4') | |
# Mute the background video | |
mute_background_cmd = [ | |
"ffmpeg", | |
"-i", background_video_path, | |
"-af", "volume=0.0", | |
"-c:v", "copy", | |
"-y", muted_output_filepath | |
] | |
subprocess.run(mute_background_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
# Audio duration | |
audio_duration_cmd = [ | |
'ffprobe', | |
'-i', audio_file_path, | |
'-show_entries', | |
'format=duration', | |
'-v', 'quiet', | |
'-of', 'csv=p=0' | |
] | |
audio_duration = float(subprocess.check_output(audio_duration_cmd).decode('utf-8').strip()) | |
# Trim the video to match the duration of the audio | |
trim_video_cmd = [ | |
'ffmpeg', | |
'-i', muted_output_filepath, | |
'-t', str(audio_duration), | |
'-c', 'copy', | |
"-y", trimmed_output_filepath | |
] | |
subprocess.run(trim_video_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
# Place the audio over the video | |
add_audio_cmd = [ | |
'ffmpeg', | |
'-i', trimmed_output_filepath, | |
'-i', audio_file_path, | |
'-c:v', 'copy', | |
'-c:a', 'aac', | |
'-map', '0:v:0', | |
'-map', '1:a:0', | |
'-shortest', | |
'-y', audio_output_video_path | |
] | |
subprocess.run(add_audio_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
return audio_output_video_path | |
def add_subtitle(audio_output_video_path, subtitle_file, customization_options, output_directory): | |
subtitle_video_path = os.path.join(output_directory, 'subtitle_video.mp4') | |
subtitle_cmd = [ | |
"ffmpeg", | |
"-i", audio_output_video_path, | |
"-vf", f"subtitles={subtitle_file}:force_style='Fontsize={customization_options['font_size']},Fontname={customization_options['font_family']},BorderColor=black@{customization_options['border_size']},PrimaryColour={customization_options['font_color']}'", | |
"-c:a", "aac", | |
"-c:v", "libx264", | |
"-y", subtitle_video_path, | |
] | |
subprocess.run(subtitle_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
return subtitle_video_path | |
def add_text_to_video(subtitle_output_path, customization_options, output_directory): | |
result_video_path = os.path.join(output_directory, 'result.mp4') | |
cmd = [ | |
'ffmpeg', | |
'-i', subtitle_output_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)/2', | |
'-codec:a', 'copy', | |
"-y", result_video_path | |
] | |
subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
return result_video_path |