-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
122 lines (103 loc) · 4.55 KB
/
main.py
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
114
115
116
117
118
119
120
121
122
import warnings
import os
import shlex
from config.config import Config
from implementation.bing import BingImageGenerator
from implementation.eleven_labs_tts import ElevenLabsTTS
from implementation.movie_py_mixer import MoviePyMixer
from implementation.movie_py_assembler import MoviePyAssembler
from utils.file_utility import FileUtility
from utils.console_utility import Console
warnings.filterwarnings("ignore")
from implementation.chatgpt import ChatGPTParagraphSplitter, ChatGPTImagePromptGenerator
def generate_paragraph(input_text):
Console.info('Generating Paragraphs')
paragraph_splitter = ChatGPTParagraphSplitter(input_text)
return paragraph_splitter.split_data()
def prompt_vi(paragraphs):
if Console.ask('Would you like to verify/edit the paragraphs?(y/n)').lower() == 'y':
paragraph_data = '\n\n'.join(paragraphs)
FileUtility.write_file_data(Config.TEMP_FILE, paragraph_data)
os.system('vi {}'.format(shlex.quote(Config.TEMP_FILE)))
if Console.ask('Would you like to continue?(y/n)').lower() == 'y':
paragraphs = FileUtility.read_file_data(Config.TEMP_FILE).split('\n\n')
else:
exit(0)
FileUtility.delete_file(Config.TEMP_FILE)
return paragraphs
def generate_image_prompts(paragraphs, total_images, person_name, conclusion):
Console.info('Generating Image Prompts')
image_prompt_generator = ChatGPTImagePromptGenerator(paragraphs)
prompts, merged_paragraphs = image_prompt_generator.generate_prompt(total_images)
merged_paragraphs.append([conclusion])
if person_name is not None:
prompts.append(person_name)
else:
new_prompt, _ = ChatGPTImagePromptGenerator(conclusion).generate_prompt(1)
prompts.append(new_prompt[0])
return prompts, merged_paragraphs
def generate_images(image_prompts):
Console.info('Generating Images')
generated_images = []
image_generator = BingImageGenerator()
i = 1
n = len(image_prompts)
for prompt in image_prompts:
Console.info('Generating Image : ({}/{})'.format(i, n))
generated_images.append(image_generator.generate_image(prompt))
i += 1
return generated_images
def generate_audio(merged_paragraphs):
Console.info('Generating Audio')
audio_generator = ElevenLabsTTS()
generated_audio = []
i = 1
n = len(merged_paragraphs)
for merged_paragraph in merged_paragraphs:
audio_list = []
Console.info('Generating Audio - Progress : ({}/{})'.format(i, n))
for paragraph in merged_paragraph:
audio_list.append(audio_generator.generate_audio(paragraph))
generated_audio.append(audio_list)
i += 1
return generated_audio
def generate_video(generated_images, generated_audio):
video_list = [Config.INPUT_INTRO_VIDEO]
Console.info('Generating Video')
video_mixer = MoviePyMixer()
for i in range(0, len(generated_images)):
image_pos = 0
for audio_path in generated_audio[i]:
image_path = os.path.join(generated_images[i], '{}.jpeg'.format(
image_pos % Config.BING_IMAGE_CREATOR_RESULTS_LEN))
video_list.append(video_mixer.convert(image_path, audio_path))
image_pos += 1
return video_list
def generate_final_video(video_list):
Console.info('Generating Final Video')
video_assembler = MoviePyAssembler()
return video_assembler.assemble(video_list)
def main():
FileUtility.create_directory(Config.CURRENT_OUTPUT_DIR)
input_text = FileUtility.read_file_data(Config.INPUT_STORY)
conclusion = FileUtility.read_file_data(Config.INPUT_CONCLUSION)
person_name = None
if Console.ask('Is this story about a famous person?(y/n)').lower() == 'y':
person_name = Console.ask('Enter the name of the person')
total_images = int(Console.ask('Enter the number of images requests to send : '))
paragraphs = generate_paragraph(input_text)
paragraphs = prompt_vi(paragraphs)
image_prompts, merged_paragraphs = generate_image_prompts(paragraphs, total_images, person_name, conclusion)
generated_images = generate_images(image_prompts)
generated_audio = generate_audio(merged_paragraphs)
video_list = generate_video(generated_images, generated_audio)
final_video = generate_final_video(video_list)
Console.info('Final Video : {}'.format(final_video))
os.system('cvlc {}'.format(shlex.quote(final_video)))
if __name__ == "__main__":
try:
main()
except (KeyboardInterrupt, OSError, Exception) as ex:
Console.error(ex)
finally:
ElevenLabsTTS.save_cache()