128 lines
5.2 KiB
Python
128 lines
5.2 KiB
Python
import tkinter as tk
|
|
from tkinter import ttk, filedialog, messagebox, simpledialog
|
|
from gtts import gTTS
|
|
from moviepy.editor import *
|
|
import os
|
|
from datetime import datetime
|
|
from PIL import Image
|
|
|
|
class VideoCreatorApp:
|
|
def __init__(self, master):
|
|
self.master = master
|
|
self.master.title('Video Creator')
|
|
self.init_ui()
|
|
|
|
# 데이터 관리를 위한 리스트
|
|
self.scripts = []
|
|
self.images = []
|
|
self.actions = []
|
|
self.background_music = None
|
|
|
|
# 임시 및 결과 폴더 확인
|
|
self.temp_folder = "temp"
|
|
self.result_folder = "Result"
|
|
for folder in [self.temp_folder, self.result_folder]:
|
|
if not os.path.exists(folder):
|
|
os.makedirs(folder)
|
|
|
|
def init_ui(self):
|
|
# UI 구성 요소
|
|
self.main_frame = ttk.Frame(self.master)
|
|
self.main_frame.pack(fill=tk.BOTH, expand=True)
|
|
|
|
# 스크립트, 이미지, 액션 목록 및 추가 버튼
|
|
self.list_frame = ttk.Frame(self.main_frame)
|
|
self.list_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
|
|
|
|
self.script_listbox = tk.Listbox(self.list_frame)
|
|
self.script_listbox.pack(fill=tk.X)
|
|
ttk.Button(self.list_frame, text='Add Script', command=self.add_script).pack(fill=tk.X)
|
|
|
|
self.image_listbox = tk.Listbox(self.list_frame)
|
|
self.image_listbox.pack(fill=tk.X)
|
|
ttk.Button(self.list_frame, text='Add Image', command=self.add_image).pack(fill=tk.X)
|
|
|
|
# 액션 추가 예시는 생략
|
|
# self.action_listbox = tk.Listbox(self.list_frame)
|
|
# self.action_listbox.pack(fill=tk.X)
|
|
# ttk.Button(self.list_frame, text='Add Action', command=self.add_action).pack(fill=tk.X)
|
|
|
|
self.preview_frame = ttk.Frame(self.main_frame, width=200)
|
|
self.preview_frame.pack(side=tk.RIGHT, fill=tk.Y)
|
|
self.preview_frame.pack_propagate(False)
|
|
|
|
ttk.Button(self.preview_frame, text='Set Background Music', command=self.set_background_music).pack(fill=tk.X)
|
|
ttk.Button(self.preview_frame, text='Create Video', command=self.create_video).pack(fill=tk.X)
|
|
|
|
def add_script(self):
|
|
script_text = simpledialog.askstring("Input", "Enter your script:")
|
|
if script_text:
|
|
self.scripts.append(script_text)
|
|
self.script_listbox.insert(tk.END, script_text)
|
|
|
|
def add_image(self):
|
|
file_path = filedialog.askopenfilename(filetypes=(("Image files", "*.jpg;*.png;*.gif;*.webp"), ("All files", "*.*")))
|
|
if file_path:
|
|
self.images.append(file_path)
|
|
self.image_listbox.insert(tk.END, file_path)
|
|
|
|
# 배경음악 설정 및 동영상 생성 기능은 위에서 제공한 설명에 따라 구현됩니다.
|
|
# 이 부분의 코드는 이전에 제공된 `create_video_clips` 및 `create_video` 메서드 내용을 참고하여 구현할 수 있습니다.
|
|
|
|
def set_background_music(self):
|
|
file_path = filedialog.askopenfilename(filetypes=(("Audio files", "*.mp3;*.wav"), ("All files", "*.*")))
|
|
if file_path:
|
|
self.background_music = file_path
|
|
messagebox.showinfo("Background Music Set", f"Background music set to: {file_path}")
|
|
|
|
def create_video(self):
|
|
clips = []
|
|
|
|
# 스크립트를 TTS로 변환하고 비디오 클립으로 추가
|
|
for script in self.scripts:
|
|
tts = gTTS(script, lang='ko')
|
|
tts_file = os.path.join(self.temp_folder, "tts.mp3")
|
|
tts.save(tts_file)
|
|
|
|
audioclip = AudioFileClip(tts_file)
|
|
txt_clip = TextClip(script, fontsize=24, color='white', bg_color='black', size=audioclip.size)
|
|
txt_clip = txt_clip.set_duration(audioclip.duration)
|
|
clip = CompositeVideoClip([txt_clip.set_pos('center')], size=audioclip.size).set_audio(audioclip)
|
|
clips.append(clip)
|
|
|
|
# 이미지를 비디오 클립으로 추가
|
|
for image in self.images:
|
|
img_clip = ImageClip(image).set_duration(3) # 예시로 3초 동안 표시
|
|
img_clip = resize(img_clip, height=720) # 이미지 크기 조정
|
|
clips.append(img_clip)
|
|
|
|
# 모든 클립을 하나의 비디오로 결합
|
|
final_clip = concatenate_videoclips(clips, method="compose")
|
|
|
|
# 배경음악 추가
|
|
if self.background_music:
|
|
background_music = AudioFileClip(self.background_music)
|
|
final_clip = final_clip.set_audio(background_music)
|
|
|
|
# Result 폴더 내 오늘 날짜로 시작하는 파일들의 개수를 세어 n 구하기
|
|
today_str = datetime.now().strftime("%Y-%m-%d")
|
|
existing_files = glob.glob(os.path.join(self.result_folder, f"{today_str}_*.mp4"))
|
|
file_number = len(existing_files) + 1
|
|
|
|
# 최종 비디오 파일 이름 설정
|
|
output_filename = f"{today_str}_{file_number:03d}.mp4"
|
|
output_path = os.path.join(self.result_folder, output_filename)
|
|
|
|
# 비디오 파일 저장
|
|
final_clip.write_videofile(output_path, fps=24)
|
|
|
|
messagebox.showinfo("Success", f"Video created successfully: {output_filename}")
|
|
|
|
def main():
|
|
root = tk.Tk()
|
|
app = VideoCreatorApp(root)
|
|
root.mainloop()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|