shorts_factory/MakeVideo2.py

116 lines
4.4 KiB
Python

from tkinter import Tk, Label, Button, Entry, filedialog, messagebox, Listbox, simpledialog, OptionMenu, StringVar
import os
from gtts import gTTS
from moviepy.editor import concatenate_videoclips, AudioFileClip, ImageClip, CompositeVideoClip, TextClip
import tempfile
from datetime import datetime
class VideoProject:
def __init__(self):
self.texts = []
self.images = []
self.background_music = None
self.video_type = "참교육"
def add_text(self, text):
self.texts.append(text)
def add_image(self, image_path):
self.images.append(image_path)
def set_background_music(self, music_path):
self.background_music = music_path
def set_video_type(self, video_type):
self.video_type = video_type
class VideoMakerApp:
def __init__(self, master):
self.master = master
master.title("유튜브 쇼츠 제작기")
self.project = VideoProject()
self.label = Label(master, text="유튜브 쇼츠 제작기에 오신 것을 환영합니다!")
self.label.pack()
self.text_entry = Entry(master)
self.text_entry.pack()
self.add_text_button = Button(master, text="텍스트 추가", command=self.add_text)
self.add_text_button.pack()
self.add_image_button = Button(master, text="이미지 추가", command=self.add_image)
self.add_image_button.pack()
self.add_music_button = Button(master, text="배경음 추가", command=self.add_background_music)
self.add_music_button.pack()
self.type_var = StringVar(master)
self.type_var.set("참교육")
self.type_dropdown = OptionMenu(master, self.type_var, "참교육", "야썰", "어이없음", "감동", command=self.project.set_video_type)
self.type_dropdown.pack()
self.create_video_button = Button(master, text="동영상 만들기", command=self.create_video_with_speech)
self.create_video_button.pack()
self.item_listbox = Listbox(master)
self.item_listbox.pack()
def add_text(self):
text = self.text_entry.get()
if text:
self.project.add_text(text)
self.item_listbox.insert('end', f"텍스트: {text}")
messagebox.showinfo("성공", "텍스트가 추가되었습니다.")
def add_image(self):
file_path = filedialog.askopenfilename()
if file_path:
self.project.add_image(file_path)
self.item_listbox.insert('end', f"이미지: {os.path.basename(file_path)}")
messagebox.showinfo("성공", "이미지가 추가되었습니다.")
def add_background_music(self):
file_path = filedialog.askopenfilename()
if file_path:
self.project.set_background_music(file_path)
messagebox.showinfo("성공", "배경음이 설정되었습니다.")
def create_video_with_speech(self):
clips = []
for text, image_path in zip(self.project.texts, self.project.images):
tts = gTTS(text=text, lang='ko')
temp_file = tempfile.NamedTemporaryFile(delete=False)
tts.save(temp_file.name)
temp_file.close()
audio_clip = AudioFileClip(temp_file.name)
image_clip = ImageClip(image_path).set_duration(audio_clip.duration).set_fps(24)
text_clip = TextClip(text, fontsize=24, color='white').set_position('bottom').set_duration(audio_clip.duration)
composite_clip = CompositeVideoClip([image_clip, text_clip]).set_duration(audio_clip.duration).set_fps(24).set_audio(audio_clip)
clips.append(composite_clip)
os.unlink(temp_file.name)
final_clip = concatenate_videoclips(clips)
if self.project.background_music:
background_audio = AudioFileClip(self.project.background_music).set_duration(final_clip.duration).set_fps(24)
final_clip = final_clip.set_audio(background_audio)
result_dir = "Result"
if not os.path.exists(result_dir):
os.makedirs(result_dir)
today = datetime.now().strftime("%Y%m%d")
file_name = f"{today}_{self.project.video_type}.mp4"
final_path = os.path.join(result_dir, file_name)
final_clip.write_videofile(final_path, fps=24)
messagebox.showinfo("완료", "동영상이 성공적으로 생성되었습니다.")
root = Tk()
my_gui = VideoMakerApp(root)
root.mainloop()