Spaces:
Build error
Build error
| 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() | |