File size: 3,802 Bytes
aff0a09
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
102
103
104
105
106
107
108
109
110
111
112
113
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