Spaces:
Paused
Paused
Create app.py
Browse files
app.py
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ============================================================================
|
| 2 |
+
# CONTENTFORGE AI - GRADIO APP
|
| 3 |
+
# Complete multi-modal AI platform on HuggingFace Spaces
|
| 4 |
+
# ============================================================================
|
| 5 |
+
|
| 6 |
+
import gradio as gr
|
| 7 |
+
import torch
|
| 8 |
+
from transformers import (
|
| 9 |
+
T5Tokenizer, T5ForConditionalGeneration,
|
| 10 |
+
Qwen2VLForConditionalGeneration, Qwen2VLProcessor,
|
| 11 |
+
AutoProcessor, MusicgenForConditionalGeneration
|
| 12 |
+
)
|
| 13 |
+
from peft import PeftModel
|
| 14 |
+
from qwen_vl_utils import process_vision_info
|
| 15 |
+
from diffusers import StableDiffusionPipeline
|
| 16 |
+
from PIL import Image
|
| 17 |
+
import numpy as np
|
| 18 |
+
|
| 19 |
+
device = "cuda" if torch.cuda.is_available() else "cpu"
|
| 20 |
+
print(f"π₯οΈ Using device: {device}")
|
| 21 |
+
|
| 22 |
+
# ============================================================================
|
| 23 |
+
# MODEL LOADING
|
| 24 |
+
# ============================================================================
|
| 25 |
+
|
| 26 |
+
print("π¦ Loading models... This takes 2-3 minutes on first run.")
|
| 27 |
+
|
| 28 |
+
# 1. T5 Summarization Model
|
| 29 |
+
print("π Loading T5 model...")
|
| 30 |
+
t5_tokenizer = T5Tokenizer.from_pretrained("Bashaarat1/t5-small-arxiv-summarizer")
|
| 31 |
+
t5_model = T5ForConditionalGeneration.from_pretrained(
|
| 32 |
+
"Bashaarat1/t5-small-arxiv-summarizer"
|
| 33 |
+
).to(device)
|
| 34 |
+
t5_model.eval()
|
| 35 |
+
print("β
T5 loaded!")
|
| 36 |
+
|
| 37 |
+
# 2. Qwen VLM Q&A Model (with LoRA)
|
| 38 |
+
print("π€ Loading Qwen2-VL model...")
|
| 39 |
+
qwen_base = Qwen2VLForConditionalGeneration.from_pretrained(
|
| 40 |
+
"Qwen/Qwen2-VL-2B-Instruct",
|
| 41 |
+
device_map="auto",
|
| 42 |
+
torch_dtype=torch.bfloat16
|
| 43 |
+
)
|
| 44 |
+
qwen_model = PeftModel.from_pretrained(
|
| 45 |
+
qwen_base,
|
| 46 |
+
"Bashaarat1/qwen2-v1-2b-scienceqa-lora-expl"
|
| 47 |
+
)
|
| 48 |
+
qwen_processor = Qwen2VLProcessor.from_pretrained("Qwen/Qwen2-VL-2B-Instruct")
|
| 49 |
+
qwen_model.eval()
|
| 50 |
+
print("β
Qwen loaded!")
|
| 51 |
+
|
| 52 |
+
# 3. MusicGen Model
|
| 53 |
+
print("π΅ Loading MusicGen model...")
|
| 54 |
+
music_processor = AutoProcessor.from_pretrained("Bashaarat1/fine-tuned-musicgen-small")
|
| 55 |
+
music_model = MusicgenForConditionalGeneration.from_pretrained(
|
| 56 |
+
"Bashaarat1/fine-tuned-musicgen-small"
|
| 57 |
+
).to(device)
|
| 58 |
+
music_model.eval()
|
| 59 |
+
print("β
MusicGen loaded!")
|
| 60 |
+
|
| 61 |
+
# 4. Stable Diffusion Model
|
| 62 |
+
print("π¨ Loading Stable Diffusion model...")
|
| 63 |
+
sd_pipe = StableDiffusionPipeline.from_pretrained(
|
| 64 |
+
"stabilityai/stable-diffusion-2-1",
|
| 65 |
+
torch_dtype=torch.float16 if device == "cuda" else torch.float32,
|
| 66 |
+
safety_checker=None
|
| 67 |
+
).to(device)
|
| 68 |
+
print("β
Stable Diffusion loaded!")
|
| 69 |
+
|
| 70 |
+
print("π All models loaded successfully!\n")
|
| 71 |
+
|
| 72 |
+
# ============================================================================
|
| 73 |
+
# INFERENCE FUNCTIONS
|
| 74 |
+
# ============================================================================
|
| 75 |
+
|
| 76 |
+
def summarize_text(text, max_length=128):
|
| 77 |
+
"""Summarize text using fine-tuned T5"""
|
| 78 |
+
if not text.strip():
|
| 79 |
+
return "β οΈ Please enter some text to summarize."
|
| 80 |
+
|
| 81 |
+
try:
|
| 82 |
+
inputs = t5_tokenizer(
|
| 83 |
+
f"summarize: {text}",
|
| 84 |
+
return_tensors="pt",
|
| 85 |
+
max_length=512,
|
| 86 |
+
truncation=True
|
| 87 |
+
).to(device)
|
| 88 |
+
|
| 89 |
+
with torch.no_grad():
|
| 90 |
+
outputs = t5_model.generate(
|
| 91 |
+
**inputs,
|
| 92 |
+
max_length=max_length,
|
| 93 |
+
min_length=30,
|
| 94 |
+
num_beams=4,
|
| 95 |
+
early_stopping=True
|
| 96 |
+
)
|
| 97 |
+
|
| 98 |
+
summary = t5_tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 99 |
+
|
| 100 |
+
return f"π **Summary:**\n\n{summary}\n\n---\n*Original: {len(text.split())} words β Summary: {len(summary.split())} words*"
|
| 101 |
+
|
| 102 |
+
except Exception as e:
|
| 103 |
+
return f"β Error: {str(e)}"
|
| 104 |
+
|
| 105 |
+
def answer_question(question, image=None):
|
| 106 |
+
"""Answer question with optional image using Qwen VLM"""
|
| 107 |
+
if not question.strip():
|
| 108 |
+
return "β οΈ Please enter a question."
|
| 109 |
+
|
| 110 |
+
try:
|
| 111 |
+
# Prepare messages
|
| 112 |
+
if image is not None:
|
| 113 |
+
# Convert numpy array to PIL Image if needed
|
| 114 |
+
if isinstance(image, np.ndarray):
|
| 115 |
+
image = Image.fromarray(image).convert('RGB')
|
| 116 |
+
|
| 117 |
+
messages = [{
|
| 118 |
+
"role": "user",
|
| 119 |
+
"content": [
|
| 120 |
+
{"type": "image", "image": image},
|
| 121 |
+
{"type": "text", "text": question}
|
| 122 |
+
]
|
| 123 |
+
}]
|
| 124 |
+
else:
|
| 125 |
+
messages = [{
|
| 126 |
+
"role": "user",
|
| 127 |
+
"content": [{"type": "text", "text": question}]
|
| 128 |
+
}]
|
| 129 |
+
|
| 130 |
+
# Process inputs
|
| 131 |
+
text_prompt = qwen_processor.apply_chat_template(
|
| 132 |
+
messages,
|
| 133 |
+
tokenize=False,
|
| 134 |
+
add_generation_prompt=True
|
| 135 |
+
)
|
| 136 |
+
|
| 137 |
+
if image is not None:
|
| 138 |
+
img_inputs, _ = process_vision_info(messages)
|
| 139 |
+
inputs = qwen_processor(
|
| 140 |
+
text=[text_prompt],
|
| 141 |
+
images=img_inputs,
|
| 142 |
+
return_tensors="pt"
|
| 143 |
+
).to(device)
|
| 144 |
+
else:
|
| 145 |
+
inputs = qwen_processor(
|
| 146 |
+
text=[text_prompt],
|
| 147 |
+
return_tensors="pt"
|
| 148 |
+
).to(device)
|
| 149 |
+
|
| 150 |
+
# Generate answer
|
| 151 |
+
with torch.no_grad():
|
| 152 |
+
outputs = qwen_model.generate(**inputs, max_new_tokens=200)
|
| 153 |
+
|
| 154 |
+
answer = qwen_processor.batch_decode(
|
| 155 |
+
outputs[:, inputs.input_ids.size(1):],
|
| 156 |
+
skip_special_tokens=True
|
| 157 |
+
)[0].strip()
|
| 158 |
+
|
| 159 |
+
return f"π‘ **Answer:**\n\n{answer}"
|
| 160 |
+
|
| 161 |
+
except Exception as e:
|
| 162 |
+
return f"β Error: {str(e)}"
|
| 163 |
+
|
| 164 |
+
def generate_image(prompt, negative_prompt="", num_steps=25):
|
| 165 |
+
"""Generate image using Stable Diffusion"""
|
| 166 |
+
if not prompt.strip():
|
| 167 |
+
return None, "β οΈ Please enter an image description."
|
| 168 |
+
|
| 169 |
+
try:
|
| 170 |
+
with torch.no_grad():
|
| 171 |
+
image = sd_pipe(
|
| 172 |
+
prompt,
|
| 173 |
+
negative_prompt=negative_prompt,
|
| 174 |
+
num_inference_steps=num_steps,
|
| 175 |
+
guidance_scale=7.5
|
| 176 |
+
).images[0]
|
| 177 |
+
|
| 178 |
+
return image, f"β
**Image generated!**\n\n*Prompt: {prompt}*"
|
| 179 |
+
|
| 180 |
+
except Exception as e:
|
| 181 |
+
return None, f"β Error: {str(e)}"
|
| 182 |
+
|
| 183 |
+
def generate_music(prompt, duration=10):
|
| 184 |
+
"""Generate music using MusicGen"""
|
| 185 |
+
if not prompt.strip():
|
| 186 |
+
return None, "β οΈ Please enter a music description."
|
| 187 |
+
|
| 188 |
+
try:
|
| 189 |
+
inputs = music_processor(
|
| 190 |
+
text=[prompt],
|
| 191 |
+
padding=True,
|
| 192 |
+
return_tensors="pt"
|
| 193 |
+
).to(device)
|
| 194 |
+
|
| 195 |
+
# Calculate max_new_tokens based on duration (roughly 50 tokens per second)
|
| 196 |
+
max_tokens = int(duration * 50)
|
| 197 |
+
|
| 198 |
+
with torch.no_grad():
|
| 199 |
+
audio_values = music_model.generate(**inputs, max_new_tokens=max_tokens, do_sample=True)
|
| 200 |
+
|
| 201 |
+
sampling_rate = music_model.config.audio_encoder.sampling_rate
|
| 202 |
+
audio_data = audio_values[0, 0].cpu().numpy()
|
| 203 |
+
|
| 204 |
+
return (sampling_rate, audio_data), f"β
**Music generated!**\n\n*Prompt: {prompt}*\n*Duration: ~{duration} seconds*"
|
| 205 |
+
|
| 206 |
+
except Exception as e:
|
| 207 |
+
return None, f"β Error: {str(e)}"
|
| 208 |
+
|
| 209 |
+
# ============================================================================
|
| 210 |
+
# GRADIO UI
|
| 211 |
+
# ============================================================================
|
| 212 |
+
|
| 213 |
+
# Custom CSS
|
| 214 |
+
custom_css = """
|
| 215 |
+
.gradio-container {
|
| 216 |
+
font-family: 'Inter', sans-serif;
|
| 217 |
+
}
|
| 218 |
+
.tab-nav button {
|
| 219 |
+
font-size: 16px;
|
| 220 |
+
font-weight: 500;
|
| 221 |
+
}
|
| 222 |
+
"""
|
| 223 |
+
|
| 224 |
+
# Create Gradio app
|
| 225 |
+
with gr.Blocks(title="ContentForge AI", theme=gr.themes.Soft(), css=custom_css) as demo:
|
| 226 |
+
|
| 227 |
+
gr.Markdown("""
|
| 228 |
+
# π¨ ContentForge AI
|
| 229 |
+
|
| 230 |
+
**Multi-modal AI platform for education and social media content generation**
|
| 231 |
+
|
| 232 |
+
Powered by state-of-the-art fine-tuned models:
|
| 233 |
+
- π Fine-tuned T5 (+46% improvement)
|
| 234 |
+
- π€ Qwen2-VL with LoRA for science Q&A
|
| 235 |
+
- π¨ Stable Diffusion 2.1
|
| 236 |
+
- π΅ Fine-tuned MusicGen
|
| 237 |
+
""")
|
| 238 |
+
|
| 239 |
+
with gr.Tabs():
|
| 240 |
+
# ====================================================================
|
| 241 |
+
# EDUCATION TOOLS
|
| 242 |
+
# ====================================================================
|
| 243 |
+
with gr.Tab("π Education Tools"):
|
| 244 |
+
gr.Markdown("## AI-powered tools for learning and research")
|
| 245 |
+
|
| 246 |
+
with gr.Tab("π Text Summarizer"):
|
| 247 |
+
gr.Markdown("### Summarize academic papers, articles, and long texts")
|
| 248 |
+
|
| 249 |
+
with gr.Row():
|
| 250 |
+
with gr.Column():
|
| 251 |
+
sum_input = gr.Textbox(
|
| 252 |
+
label="Text to Summarize",
|
| 253 |
+
placeholder="Paste your academic paper, article, or long text here...",
|
| 254 |
+
lines=10
|
| 255 |
+
)
|
| 256 |
+
sum_length = gr.Slider(
|
| 257 |
+
minimum=50,
|
| 258 |
+
maximum=200,
|
| 259 |
+
value=128,
|
| 260 |
+
step=10,
|
| 261 |
+
label="Summary Length (words)"
|
| 262 |
+
)
|
| 263 |
+
sum_button = gr.Button("πͺ Generate Summary", variant="primary", size="lg")
|
| 264 |
+
|
| 265 |
+
with gr.Column():
|
| 266 |
+
sum_output = gr.Markdown(label="Summary")
|
| 267 |
+
|
| 268 |
+
gr.Examples(
|
| 269 |
+
examples=[
|
| 270 |
+
["We present a novel approach to neural network optimization using adaptive learning rates. Our method dynamically adjusts the learning rate based on gradient statistics during training. Experiments on ImageNet show 15% improvement over standard SGD with minimal computational overhead. The proposed technique can be easily integrated into existing deep learning frameworks and requires no additional hyperparameter tuning."],
|
| 271 |
+
["Climate change is causing unprecedented shifts in global weather patterns. Rising temperatures are leading to more frequent extreme weather events, including hurricanes, droughts, and floods. Scientists warn that immediate action is needed to mitigate these effects and prevent catastrophic consequences. Renewable energy sources like solar and wind power offer sustainable alternatives to fossil fuels."]
|
| 272 |
+
],
|
| 273 |
+
inputs=sum_input
|
| 274 |
+
)
|
| 275 |
+
|
| 276 |
+
sum_button.click(
|
| 277 |
+
fn=summarize_text,
|
| 278 |
+
inputs=[sum_input, sum_length],
|
| 279 |
+
outputs=sum_output
|
| 280 |
+
)
|
| 281 |
+
|
| 282 |
+
with gr.Tab("π€ Q&A Assistant"):
|
| 283 |
+
gr.Markdown("### Ask questions with optional image support")
|
| 284 |
+
|
| 285 |
+
with gr.Row():
|
| 286 |
+
with gr.Column():
|
| 287 |
+
qa_question = gr.Textbox(
|
| 288 |
+
label="Your Question",
|
| 289 |
+
placeholder="Ask anything...",
|
| 290 |
+
lines=3
|
| 291 |
+
)
|
| 292 |
+
qa_image = gr.Image(
|
| 293 |
+
label="Upload Image (Optional)",
|
| 294 |
+
type="pil"
|
| 295 |
+
)
|
| 296 |
+
qa_button = gr.Button("π¬ Get Answer", variant="primary", size="lg")
|
| 297 |
+
|
| 298 |
+
with gr.Column():
|
| 299 |
+
qa_output = gr.Markdown(label="Answer")
|
| 300 |
+
|
| 301 |
+
gr.Examples(
|
| 302 |
+
examples=[
|
| 303 |
+
["What is machine learning?", None],
|
| 304 |
+
["Explain photosynthesis in simple terms.", None],
|
| 305 |
+
["How does gravity work?", None]
|
| 306 |
+
],
|
| 307 |
+
inputs=[qa_question, qa_image]
|
| 308 |
+
)
|
| 309 |
+
|
| 310 |
+
qa_button.click(
|
| 311 |
+
fn=answer_question,
|
| 312 |
+
inputs=[qa_question, qa_image],
|
| 313 |
+
outputs=qa_output
|
| 314 |
+
)
|
| 315 |
+
|
| 316 |
+
# ====================================================================
|
| 317 |
+
# SOCIAL MEDIA TOOLS
|
| 318 |
+
# ====================================================================
|
| 319 |
+
with gr.Tab("π¨ Social Media Tools"):
|
| 320 |
+
gr.Markdown("## Create stunning content for your audience")
|
| 321 |
+
|
| 322 |
+
with gr.Tab("πΌοΈ Image Generator"):
|
| 323 |
+
gr.Markdown("### Generate professional images from text descriptions")
|
| 324 |
+
|
| 325 |
+
with gr.Row():
|
| 326 |
+
with gr.Column():
|
| 327 |
+
img_prompt = gr.Textbox(
|
| 328 |
+
label="Image Description",
|
| 329 |
+
placeholder="Describe the image you want to generate...",
|
| 330 |
+
lines=3
|
| 331 |
+
)
|
| 332 |
+
img_negative = gr.Textbox(
|
| 333 |
+
label="Negative Prompt (Optional)",
|
| 334 |
+
placeholder="What to avoid (e.g., blur, low quality, distorted)",
|
| 335 |
+
lines=2
|
| 336 |
+
)
|
| 337 |
+
img_steps = gr.Slider(
|
| 338 |
+
minimum=10,
|
| 339 |
+
maximum=50,
|
| 340 |
+
value=25,
|
| 341 |
+
step=5,
|
| 342 |
+
label="Quality (inference steps)"
|
| 343 |
+
)
|
| 344 |
+
img_button = gr.Button("π¨ Generate Image", variant="primary", size="lg")
|
| 345 |
+
|
| 346 |
+
with gr.Column():
|
| 347 |
+
img_output = gr.Image(label="Generated Image")
|
| 348 |
+
img_status = gr.Markdown()
|
| 349 |
+
|
| 350 |
+
gr.Examples(
|
| 351 |
+
examples=[
|
| 352 |
+
["A serene mountain landscape at sunset, photorealistic, 4k, highly detailed"],
|
| 353 |
+
["A futuristic cityscape with neon lights, cyberpunk style, digital art"],
|
| 354 |
+
["Abstract colorful geometric patterns, modern art, vibrant colors"]
|
| 355 |
+
],
|
| 356 |
+
inputs=img_prompt
|
| 357 |
+
)
|
| 358 |
+
|
| 359 |
+
img_button.click(
|
| 360 |
+
fn=generate_image,
|
| 361 |
+
inputs=[img_prompt, img_negative, img_steps],
|
| 362 |
+
outputs=[img_output, img_status]
|
| 363 |
+
)
|
| 364 |
+
|
| 365 |
+
with gr.Tab("π΅ Music Generator"):
|
| 366 |
+
gr.Markdown("### Generate royalty-free music from text descriptions")
|
| 367 |
+
|
| 368 |
+
with gr.Row():
|
| 369 |
+
with gr.Column():
|
| 370 |
+
music_prompt = gr.Textbox(
|
| 371 |
+
label="Music Description",
|
| 372 |
+
placeholder="Describe the music you want (mood, genre, instruments)...",
|
| 373 |
+
lines=3
|
| 374 |
+
)
|
| 375 |
+
music_duration = gr.Slider(
|
| 376 |
+
minimum=5,
|
| 377 |
+
maximum=20,
|
| 378 |
+
value=10,
|
| 379 |
+
step=5,
|
| 380 |
+
label="Duration (seconds)"
|
| 381 |
+
)
|
| 382 |
+
music_button = gr.Button("πΌ Generate Music", variant="primary", size="lg")
|
| 383 |
+
|
| 384 |
+
with gr.Column():
|
| 385 |
+
music_output = gr.Audio(label="Generated Music")
|
| 386 |
+
music_status = gr.Markdown()
|
| 387 |
+
|
| 388 |
+
gr.Examples(
|
| 389 |
+
examples=[
|
| 390 |
+
["upbeat electronic dance music with energetic drums"],
|
| 391 |
+
["calm piano melody, relaxing and peaceful"],
|
| 392 |
+
["epic orchestral music with powerful strings and brass"]
|
| 393 |
+
],
|
| 394 |
+
inputs=music_prompt
|
| 395 |
+
)
|
| 396 |
+
|
| 397 |
+
music_button.click(
|
| 398 |
+
fn=generate_music,
|
| 399 |
+
inputs=[music_prompt, music_duration],
|
| 400 |
+
outputs=[music_output, music_status]
|
| 401 |
+
)
|
| 402 |
+
|
| 403 |
+
gr.Markdown("""
|
| 404 |
+
---
|
| 405 |
+
|
| 406 |
+
**About ContentForge AI**
|
| 407 |
+
|
| 408 |
+
This platform demonstrates the power of fine-tuned AI models for practical applications:
|
| 409 |
+
- **Education**: Help students learn faster with AI-powered summarization and Q&A
|
| 410 |
+
- **Social Media**: Create professional content without expensive tools
|
| 411 |
+
|
| 412 |
+
All models are fine-tuned for specific tasks to deliver superior performance.
|
| 413 |
+
|
| 414 |
+
*Built with β€οΈ using Gradio and Transformers*
|
| 415 |
+
""")
|
| 416 |
+
|
| 417 |
+
# Launch the app
|
| 418 |
+
if __name__ == "__main__":
|
| 419 |
+
demo.launch()
|