beer / app.py
gaur3009's picture
Create app.py
6956e92 verified
# Emotional Ad Campaign Generator - AI Pipeline with E-Commerce & Meta Ad Scraper
# === LAYER 1: USER INPUT & INTENT UNDERSTANDING ===
# Tools: Gradio UI + DistilBERT + spaCy NER + T5 for planning
import gradio as gr
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification, T5ForConditionalGeneration, T5Tokenizer
import spacy
intent_classifier = pipeline("text-classification", model="distilbert-base-uncased")
ner_nlp = spacy.load("en_core_web_sm")
t5_model = T5ForConditionalGeneration.from_pretrained("t5-base")
t5_tokenizer = T5Tokenizer.from_pretrained("t5-base")
def parse_input(user_input):
intent = intent_classifier(user_input)[0]['label']
ner_doc = ner_nlp(user_input)
entities = [(ent.text, ent.label_) for ent in ner_doc.ents]
return intent, entities
def plan_campaign(user_input):
input_text = "generate plan: " + user_input
input_ids = t5_tokenizer(input_text, return_tensors="pt").input_ids
output = t5_model.generate(input_ids, max_length=64, num_return_sequences=1)
return t5_tokenizer.decode(output[0], skip_special_tokens=True)
# === LAYER 2: MARKET INSIGHT, AD SCRAPING & VECTOR STORAGE ===
# Tools: Selenium + BeautifulSoup + Sentence-BERT + FAISS (vector db)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
from bs4 import BeautifulSoup
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import os
import json
# Sentence Transformer for vector encoding
ad_model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
# Create FAISS vector database
vector_dim = 384
index = faiss.IndexFlatL2(vector_dim)
ad_texts = []
ad_metadata = []
# Web scraper for Meta Ads Library (mocked for demonstration)
def fetch_meta_ads(keyword):
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get(f"https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=IN&q={keyword}&search_type=keyword")
time.sleep(5)
soup = BeautifulSoup(driver.page_source, "html.parser")
driver.quit()
ad_blocks = soup.find_all("div", class_="_9cd1") # This selector may vary
scraped_ads = [block.get_text(strip=True) for block in ad_blocks]
return scraped_ads
def store_ads_in_vector_db(ad_text_list):
embeddings = ad_model.encode(ad_text_list)
index.add(np.array(embeddings))
ad_texts.extend(ad_text_list)
for ad in ad_text_list:
cta = extract_cta(ad)
tagline = extract_tagline(ad)
ad_metadata.append({"ad": ad, "cta": cta, "tagline": tagline})
# Extract CTA (simple regex or rules)
def extract_cta(ad_text):
lines = ad_text.split('.')
for line in reversed(lines):
if any(word in line.lower() for word in ["buy", "shop now", "click", "try", "order"]):
return line.strip()
return ""
def extract_tagline(ad_text):
return ad_text.split('.')[0].strip()
# === LAYER 3: AD SCRIPT GENERATION ===
# Tools: Prompt-tuned LLMs (GPT-2), emotional tone adapter
from transformers import pipeline as hf_pipeline
script_generator = hf_pipeline("text-generation", model="gpt2")
persona_styles = {
"Gen Z": "funny, sassy, self-aware",
"Minimal": "calm, poetic, clean",
"Bold": "direct, assertive, high contrast"
}
emotion_classifier = pipeline("text-classification", model="j-hartmann/emotion-english-distilroberta-base", return_all_scores=True)
def generate_script(prompt, style):
style_tone = persona_styles.get(style, "")
full_prompt = f"Write a {style_tone} ad copy: {prompt}"
result = script_generator(full_prompt, max_length=100, num_return_sequences=1)[0]['generated_text']
return result
# === LAYER 4: POSTER GENERATION ===
# Tools: Stable Diffusion + CLIP scoring
from diffusers import StableDiffusionPipeline
import torch
poster_pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
poster_pipe = poster_pipe.to("cuda" if torch.cuda.is_available() else "cpu")
def generate_poster(prompt):
image = poster_pipe(prompt).images[0]
return image
# === LAYER 5: TAGLINE & CTA CREATOR ===
def generate_tagline(prompt):
input_prompt = f"Create a short emotional tagline for: {prompt}"
tagline = script_generator(input_prompt, max_length=20, num_return_sequences=1)[0]['generated_text']
return tagline.strip()
# === LAYER 6: FEEDBACK & EDITOR ===
from langchain.prompts import PromptTemplate
def rewrite_prompt(old_prompt, feedback):
template = PromptTemplate.from_template(
"Original prompt: {old}\nFeedback: {fb}\nRewritten prompt:"
)
return template.format(old=old_prompt, fb=feedback)
# === LAYER 7: A/B TESTING & PERFORMANCE ===
import random
def predict_ctr(ad_text):
score = random.uniform(0.1, 0.9)
return round(score, 2)
# === LAYER 8: CAMPAIGN DEPLOYMENT ===
def deploy_campaign(text, platform):
return f"Deployed to {platform}: {text}"
# === INTEGRATION UI (Gradio) ===
def full_campaign_flow(user_input, tone):
intent, entities = parse_input(user_input)
plan = plan_campaign(user_input)
ads_scraped = fetch_meta_ads(user_input)
store_ads_in_vector_db(ads_scraped)
script = generate_script(user_input, tone)
tagline = generate_tagline(user_input)
poster = generate_poster(user_input)
ctr = predict_ctr(script)
return plan, intent, entities, ads_scraped, script, tagline, poster, ctr
demo = gr.Interface(
fn=full_campaign_flow,
inputs=[
gr.Textbox(label="Campaign Description"),
gr.Radio(choices=list(persona_styles.keys()), label="Persona Tone")
],
outputs=[
gr.Text(label="Campaign Plan"),
gr.Text(label="Intent Detected"),
gr.Text(label="Named Entities"),
gr.Text(label="Scraped Competitor Ads"),
gr.Textbox(label="Generated Ad Script"),
gr.Text(label="Generated Tagline"),
gr.Image(label="Generated Poster"),
gr.Number(label="Predicted CTR Score")
],
title="🧠 Emotional Ad Campaign Generator"
)
if __name__ == "__main__":
demo.launch()