116 lines
4.4 KiB
Python
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()
|