seawolf2357's picture
Update app.py
e73ed34 verified
from langchain_community.llms import HuggingFacePipeline
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
from components import caption_chain, tag_chain
from components import pexels, utils
import os, gc
import gradio as gr
from moviepy.editor import VideoFileClip, concatenate_videoclips
# ๋ชจ๋ธ๊ณผ ํ† ํฌ๋‚˜์ด์ € ๋กœ๋“œ
model = AutoModelForSeq2SeqLM.from_pretrained("declare-lab/flan-alpaca-large")
tokenizer = AutoTokenizer.from_pretrained("declare-lab/flan-alpaca-large")
# ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •
pipe = pipeline(
'text2text-generation',
model=model,
tokenizer=tokenizer,
max_length=120
)
# HuggingFacePipeline์„ ์‚ฌ์šฉํ•˜์—ฌ LLM ์ดˆ๊ธฐํ™”
local_llm = HuggingFacePipeline(pipeline=pipe)
# ์ฒด์ธ ๊ตฌ์„ฑ
llm_chain = caption_chain.chain(llm=local_llm)
sum_llm_chain = tag_chain.chain(llm=local_llm)
# Pexels API ํ‚ค
pexels_api_key = os.getenv('pexels_api_key')
def pred(product_name, orientation):
# ๋น„๋””์˜ค ๋ฐฉํ–ฅ๊ณผ ํ•ด์ƒ๋„ ์„ค์ •
if orientation == "Shorts/Reels/TikTok (1080 x 1920)":
orientation = "portrait"
height = 1920
width = 1080
elif orientation == "Youtube Videos (1920 x 1080)":
orientation = "landscape"
height = 1080
width = 1920
else:
orientation = "square"
height = 1080
width = 1080
# ๋น„๋””์˜ค ์ƒ์„ฑ ๋ฐ ๋ฌธ์žฅ ์ถ”์ถœ
folder_name, sentences = pexels.generate_videos(product_name, pexels_api_key, orientation, height, width, llm_chain, sum_llm_chain)
gc.collect()
# ํด๋” ๋‚ด ๋น„๋””์˜ค ํŒŒ์ผ ๋ชฉ๋ก ์ƒ์„ฑ
video_files = [os.path.join(folder_name, f) for f in os.listdir(folder_name) if f.endswith('.mp4')]
if not video_files: # ๋น„๋””์˜ค ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜
return ["No videos were generated. Please check the input and try again.", ""]
# ๋น„๋””์˜ค ํŒŒ์ผ ๊ฒฐํ•ฉ
video_path = combine_videos(video_files, folder_name)
if not video_path or not os.path.exists(video_path): # ๋น„๋””์˜ค ๊ฒฐํ•ฉ์— ์‹คํŒจํ•˜๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ˜ํ™˜
return ["Failed to combine videos.", ""]
return ["\n".join(sentences), video_path]
def combine_videos(video_files, output_folder):
if not video_files:
print("No video files to combine.")
return "" # ๋นˆ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
clips = [VideoFileClip(vf) for vf in video_files]
final_clip = concatenate_videoclips(clips)
output_path = os.path.join(output_folder, "final_video.mp4")
final_clip.write_videofile(output_path)
return output_path
# Gradio ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ • ๋ฐ ๋Ÿฐ์นญ
with gr.Blocks() as demo:
gr.Markdown(
"""
# Ads Generator
Create video ads based on your product name using AI
### Note: the video generation takes about 2-4 minutes
"""
)
dimension = gr.Dropdown(
["Shorts/Reels/TikTok (1080 x 1920)", "Facebook/Youtube Videos (1920 x 1080)", "Square (1080 x 1080)"],
label="Video Dimension", info="Choose dimension"
)
product_name = gr.Textbox(label="Product name")
captions = gr.Label(label="Captions")
video = gr.Video()
btn = gr.Button("Submit")
btn.click(pred, inputs=[product_name, dimension], outputs=[captions, video])
# ์—ฌ๊ธฐ์— ์ถ”๊ฐ€์ ์ธ Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# Gradio ์•ฑ ์‹คํ–‰
demo.launch()