
Creative Generation Agent
- 193 installs
- 38 repo stars
- Updated January 5, 2026
- qodex-ai/ai-agent-skills
Spin up an agent that drafts copy, visuals briefs, ad variants, or campaign assets with brand guardrails and iterative critique loops.
About
Creative-generation-agent orchestrates LLM-driven creative pipelines: prompt systems, brand voice rules, variant generation for ads and social, structured briefs for designers, and automated revision cycles so teams build reusable agents that output on-brand content at scale.
- Brand-constrained copy and brief generation
- Multi-modal creative workflows
- Iterative critique and revision loops
- Template and style libraries
- Tool-chained asset production
Creative Generation Agent by the numbers
- 193 all-time installs (skills.sh)
- +1 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #628 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/qodex-ai/ai-agent-skills --skill creative-generation-agentAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 193 |
|---|---|
| repo stars | ★ 38 |
| Last updated | January 5, 2026 |
| Repository | qodex-ai/ai-agent-skills ↗ |
What it does
Spin up an agent that drafts copy, visuals briefs, ad variants, or campaign assets with brand guardrails and iterative critique loops.
Files
Creative Generation Agent
Build intelligent agents that generate original creative content across multiple modalities including text, music, images, memes, and podcasts.
Overview
Creative generation combines:
- Content Models: Diffusion models, transformers, GANs
- Prompt Engineering: Guide creative output
- Style Control: Maintain artistic consistency
- Quality Assessment: Evaluate creative output
- Iteration & Refinement: Improve results
Applications
- AI music composition and arrangement
- Automated meme generation
- Podcast script and audio generation
- Creative writing assistance
- Art and image generation
- Video content creation
- Game asset generation
Quick Start
Extract the code examples and utilities from the directories:
- Examples: See `examples/` directory for complete implementations:
- `music_generation.py` - Music generation and audio synthesis
- `meme_generator.py` - Image and text-based meme generation
- `podcast_producer.py` - Podcast script and audio production
- `image_generation.py` - Diffusion-based image generation
- `style_transfer.py` - Neural style transfer
- Utilities: See `scripts/` directory for helper modules:
- `creative_quality_assessment.py` - Quality evaluation
- `audio_effects.py` - Audio effect processing
- `content_moderation.py` - Safety and compliance filtering
Music Generation
1. Symbolic Music Generation
Generate music as MIDI/musical notation. See `examples/music_generation.py`.
Key Classes:
MusicGenerationAgent- Generates melodies and full compositions- Methods:
generate_melody(),generate_full_composition(),generate_harmony()
Usage:
from examples.music_generation import MusicGenerationAgent
agent = MusicGenerationAgent()
melody = agent.generate_melody(
seed_notes=[("C4", 1), ("E4", 1), ("G4", 1)],
length=32,
temperature=0.8
)
composition = agent.generate_full_composition(style="classical", duration_bars=32)2. Audio Synthesis
Generate audio waveforms directly. See `examples/music_generation.py`.
Key Classes:
AudioSynthesisAgent- Synthesizes audio from MIDI and applies effects
Usage:
from examples.music_generation import AudioSynthesisAgent
synth = AudioSynthesisAgent(sample_rate=44100)
audio = synth.synthesize_from_midi(midi_data, duration_seconds=60)
audio = synth.add_effects(audio, effect_type="reverb")
synth.save_audio(audio, "output.wav")Meme Generation
See `examples/meme_generator.py` for complete implementations.
1. Image-Based Meme Generator
Generate memes by applying captions to templates.
Key Classes:
MemeGenerationAgent- Generates image-based memes with captions- Methods:
generate_meme(),generate_caption(),apply_caption_to_template()
Usage:
from examples.meme_generator import MemeGenerationAgent
agent = MemeGenerationAgent()
meme = agent.generate_meme(topic="AI agents", meme_template="drake")
meme.save("output_meme.png")2. Text-Based Meme Generator
Generate text-only memes in various formats.
Key Classes:
TextMemeGenerator- Generates text-based memes- Methods:
generate_text_meme(),generate_joke_meme(),generate_deep_meme()
Usage:
from examples.meme_generator import TextMemeGenerator
generator = TextMemeGenerator()
joke_meme = generator.generate_text_meme(topic="Python programming", format_type="joke")
deep_meme = generator.generate_text_meme(topic="AI", format_type="deep")Podcast Generation
See `examples/podcast_producer.py` for complete implementations.
1. Script Generation
Generate podcast scripts with structure and natural conversation flow.
Key Classes:
PodcastScriptGenerator- Creates scripts from topics- Methods:
generate_episode(),generate_script(),generate_content_segments(),generate_intro(),generate_outro()
Usage:
from examples.podcast_producer import PodcastScriptGenerator
generator = PodcastScriptGenerator()
episode = generator.generate_episode(
topic="Future of AI",
duration_minutes=30,
num_hosts=2
)
print(episode["script"])2. Audio Production
Convert scripts to audio with text-to-speech and effects.
Key Classes:
PodcastAudioProducer- Produces audio from podcast scripts- Methods:
produce_podcast(),text_to_speech(),add_background_music(),add_transitions()
Usage:
from examples.podcast_producer import PodcastAudioProducer
producer = PodcastAudioProducer()
audio = producer.produce_podcast(script_text)Image and Art Generation
See `examples/image_generation.py` and `examples/style_transfer.py`.
1. Diffusion Model Integration
Generate images from text prompts using Stable Diffusion or similar models.
Key Classes:
ImageGenerationAgent- Generates images from text prompts- Methods:
generate_image(),enhance_prompt(),generate_variations()
Usage:
from examples.image_generation import ImageGenerationAgent
agent = ImageGenerationAgent()
image = agent.generate_image(
prompt="A futuristic city with neon lights",
style="cyberpunk",
num_inference_steps=50
)
image.save("generated_image.png")
variations = agent.generate_variations(image, num_variations=4)2. Style Transfer
Transfer artistic style from one image to another.
Key Classes:
StyleTransferAgent- Applies style transfer between images- Methods:
transfer_style(),preprocess_image(),postprocess_image()
Usage:
from examples.style_transfer import StyleTransferAgent
agent = StyleTransferAgent()
stylized = agent.transfer_style(
content_image="photo.jpg",
style_image="monet_painting.jpg"
)Quality Assessment
See `scripts/creative_quality_assessment.py` for complete implementations.
1. Creative Quality Metrics
Evaluate generated content across multiple quality dimensions.
Key Classes:
CreativeQualityAssessor- Assesses quality of all content types- Methods:
assess_content_quality(),assess_music_quality(),assess_meme_quality(),assess_image_quality()
Usage:
from scripts.creative_quality_assessment import CreativeQualityAssessor
assessor = CreativeQualityAssessor()
# Assess music quality
music_assessment = assessor.assess_content_quality(audio, content_type="music")
print(f"Overall score: {music_assessment['overall_score']}")
print(f"Metrics: {music_assessment['metrics']}")
# Assess meme quality
meme_assessment = assessor.assess_content_quality(meme, content_type="meme")
# Assess image quality
image_assessment = assessor.assess_content_quality(image, content_type="image")Best Practices
Content Generation
- ✓ Start with clear style/mood specifications
- ✓ Use temperature wisely (0.7-0.9 for creativity, 0.3-0.5 for consistency)
- ✓ Implement iterative refinement
- ✓ Maintain seed values for reproducibility
- ✓ Test with diverse prompts
Quality Control
- ✓ Assess generated content systematically (see `creative_quality_assessment.py`)
- ✓ Implement human review loops
- ✓ Track quality metrics over time
- ✓ Use feedback to refine models
- ✓ Version different creative styles
Audio Processing
- ✓ Use audio effects wisely (see `audio_effects.py`)
- Reverb for spatial depth
- Compression for dynamic control
- EQ for frequency balance
- Fade in/out for smooth transitions
- ✓ Monitor audio levels to prevent clipping
- ✓ Mix multiple tracks appropriately
Content Moderation
- ✓ Filter inappropriate content (see `content_moderation.py`)
- ✓ Ensure copyright compliance
- ✓ Validate factual accuracy
- ✓ Check for bias in generation
- ✓ Implement safety guidelines
- ✓ Use strict mode for sensitive applications
Implementation Checklist
- [ ] Choose content modality (music, images, text, etc.)
- [ ] Select generation model/framework
- [ ] Implement prompt engineering
- [ ] Set up quality assessment metrics
- [ ] Create iterative refinement loop
- [ ] Build content moderation system
- [ ] Test generation across diverse inputs
- [ ] Optimize for speed/quality tradeoff
- [ ] Implement version control for outputs
- [ ] Document prompting strategies
Resources
Music Generation
- Music Transformer: https://magenta.tensorflow.org/
- MuseNet: https://openai.com/blog/musenet/
- music21: https://web.mit.edu/music21/
Image Generation
- Stable Diffusion: https://huggingface.co/runwayml/stable-diffusion-v1-5
- DALL-E: https://openai.com/dall-e/
- Midjourney: https://www.midjourney.com/
Audio Synthesis
- Jukebox: https://openai.com/research/jukebox
- Chirp: https://deepmind.google/discover/blog/chirp-universal-speech-model/
Video Generation
- Runway: https://runwayml.com/
- Pika: https://pika.art/
"""
Image Generation Agent
Generates images using diffusion models with prompt engineering and style control.
"""
from diffusers import StableDiffusionPipeline
import torch
class ImageGenerationAgent:
"""Generates images from text prompts using Stable Diffusion."""
def __init__(self, model_id="runwayml/stable-diffusion-v1-5"):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.pipeline = StableDiffusionPipeline.from_pretrained(
model_id,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
).to(self.device)
def generate_image(self, prompt, num_inference_steps=50, guidance_scale=7.5, style="realistic"):
"""Generate image from text prompt.
Args:
prompt: Text description of image
num_inference_steps: Number of diffusion steps
guidance_scale: Classifier-free guidance scale
style: Artistic style to apply
Returns:
PIL.Image.Image: Generated image
"""
# Enhance prompt with style
enhanced_prompt = self.enhance_prompt(prompt, style)
# Generate image
image = self.pipeline(
enhanced_prompt,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
height=512,
width=512
).images[0]
return image
def enhance_prompt(self, prompt, style="realistic"):
"""Add style-specific enhancements to prompt.
Args:
prompt: Base prompt
style: Artistic style
Returns:
str: Enhanced prompt
"""
style_modifiers = {
"realistic": "photorealistic, high quality, detailed, 8k",
"anime": "anime style, manga art, beautiful animation",
"oil_painting": "oil painting, renaissance, masterpiece",
"cyberpunk": "cyberpunk, neon, futuristic, digital art",
"watercolor": "watercolor painting, soft colors, artistic"
}
modifier = style_modifiers.get(style, "high quality")
return f"{prompt}, {modifier}"
def generate_variations(self, image, num_variations=4):
"""Generate variations of an existing image.
Args:
image: Seed image
num_variations: Number of variations to create
Returns:
list: List of variation images
"""
variations = []
# Use image as seed
seed_embedding = self.encode_image(image)
for _ in range(num_variations):
variation = self.pipeline(
image=image,
num_inference_steps=30,
strength=0.7 # Strength of modification
).images[0]
variations.append(variation)
return variations
def encode_image(self, image):
"""Encode image to latent space.
Args:
image: Image to encode
Returns:
torch.Tensor: Latent encoding
"""
pass
"""
Meme Generation Agent
Generates memes through image captioning, text-based formats, and style adaptation.
"""
from PIL import Image, ImageDraw, ImageFont
import textwrap
class MemeGenerationAgent:
"""Generates image-based memes with AI captions."""
def __init__(self):
self.image_generator = self.load_image_generator()
self.caption_generator = self.load_caption_generator()
def generate_meme(self, topic, meme_template="drake"):
"""Generate complete meme with caption and template.
Args:
topic: Topic for meme generation
meme_template: Template name to use
Returns:
PIL.Image.Image: Generated meme
"""
# Generate caption
caption = self.generate_caption(topic)
# Get meme template image
template_image = self.get_template(meme_template)
# Apply text to image
meme = self.apply_caption_to_template(template_image, caption)
return meme
def generate_caption(self, topic, style="humorous"):
"""Generate meme caption for given topic.
Args:
topic: Topic for caption
style: Style of humor
Returns:
list: List of caption lines
"""
prompt = f"Generate a funny two-line meme caption about {topic} in {style} style"
caption = self.caption_generator.generate(prompt, max_tokens=100)
return caption.strip().split('\n')[:2]
def get_template(self, template_name):
"""Get meme template image.
Args:
template_name: Name of template
Returns:
PIL.Image.Image: Template image
"""
templates = {
"drake": "templates/drake.jpg",
"loss": "templates/loss.jpg",
"expanding_brain": "templates/expanding_brain.jpg",
"wojak": "templates/wojak.jpg"
}
return Image.open(templates.get(template_name, templates["drake"]))
def apply_caption_to_template(self, image, captions):
"""Apply text captions to meme template.
Args:
image: Template image
captions: List of caption texts
Returns:
PIL.Image.Image: Image with captions
"""
draw = ImageDraw.Draw(image)
font = self.get_font(size=40)
positions = self.calculate_caption_positions(image, len(captions))
for i, caption in enumerate(captions):
text = self.wrap_text(caption, 40)
self.draw_text_with_outline(draw, positions[i], text, font)
return image
def draw_text_with_outline(self, draw, position, text, font, outline_width=2):
"""Draw text with outline for visibility on images.
Args:
draw: PIL ImageDraw object
position: Text position
text: Text to draw
font: Font to use
outline_width: Width of outline
"""
x, y = position
# Draw outline
for adj_x in range(-outline_width, outline_width + 1):
for adj_y in range(-outline_width, outline_width + 1):
draw.text((x + adj_x, y + adj_y), text, fill='black', font=font)
# Draw text
draw.text(position, text, fill='white', font=font)
def wrap_text(self, text, width):
"""Wrap text to specified width.
Args:
text: Text to wrap
width: Maximum width
Returns:
str: Wrapped text
"""
return '\n'.join(textwrap.wrap(text, width=width))
def calculate_caption_positions(self, image, num_captions):
"""Calculate text positions for captions.
Args:
image: Image to position text on
num_captions: Number of captions
Returns:
list: List of (x, y) positions
"""
width, height = image.size
positions = []
if num_captions == 1:
positions.append((20, 20))
elif num_captions == 2:
positions.append((20, 20))
positions.append((20, height - 100))
return positions
def get_font(self, size=40):
"""Get font for text rendering.
Args:
size: Font size
Returns:
PIL.ImageFont: Font object
"""
try:
return ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", size)
except Exception:
return ImageFont.load_default()
def load_image_generator(self):
"""Load image generation model."""
pass
def load_caption_generator(self):
"""Load caption generation model."""
pass
class TextMemeGenerator:
"""Generates text-based memes in various formats."""
def __init__(self):
self.joke_engine = self.load_joke_engine()
self.format_templates = self.load_format_templates()
def generate_text_meme(self, topic, format_type="joke"):
"""Generate text-only meme in specified format.
Args:
topic: Topic for meme
format_type: Type of meme format
Returns:
str: Generated meme text
"""
if format_type == "joke":
return self.generate_joke_meme(topic)
elif format_type == "unexpected":
return self.generate_unexpected_meme(topic)
elif format_type == "deep":
return self.generate_deep_meme(topic)
def generate_joke_meme(self, topic):
"""Generate joke-style meme.
Args:
topic: Topic for joke
Returns:
str: Joke meme
"""
setup = self.joke_engine.generate_setup(topic)
punchline = self.joke_engine.generate_punchline(setup)
return f"Setup: {setup}\nPunchline: {punchline}"
def generate_unexpected_meme(self, topic):
"""Generate meme with unexpected twist.
Args:
topic: Topic for meme
Returns:
str: Unexpected meme
"""
prompt = f"Create a meme with an unexpected twist about {topic}"
meme_text = self.joke_engine.generate(prompt)
return meme_text
def generate_deep_meme(self, topic):
"""Generate deep/philosophical meme.
Args:
topic: Topic for meme
Returns:
str: Deep meme
"""
prompt = f"Generate a deep, philosophical meme about {topic}"
meme_text = self.joke_engine.generate(prompt)
return meme_text
def load_joke_engine(self):
"""Load joke/text generation engine."""
pass
def load_format_templates(self):
"""Load meme format templates."""
pass
"""
Music Generation Agent
Generates music as MIDI/musical notation and provides audio synthesis capabilities.
"""
import music21
from music21 import stream, instrument, note, tempo
import numpy as np
import scipy.io.wavfile as wavfile
from scipy.fft import fft
class MusicGenerationAgent:
"""Generates music using symbolic notation and continuation techniques."""
def __init__(self, model_name="music-transformer"):
self.model = self.load_model(model_name)
def generate_melody(self, seed_notes, length=32, temperature=0.8):
"""Generate melody continuation from seed notes.
Args:
seed_notes: List of tuples (pitch, duration)
length: Total length of melody in notes
temperature: Controls randomness (0.1-1.0)
Returns:
music21.stream.Stream: Generated melody
"""
melody = stream.Stream()
# Add seed notes
for pitch, duration in seed_notes:
melody.append(note.Note(pitch, quarterLength=duration))
# Generate continuation
current_notes = [n for n in melody.flatten().notes]
for _ in range(length - len(seed_notes)):
next_note = self.predict_next_note(current_notes, temperature)
melody.append(next_note)
current_notes.append(next_note)
return melody
def predict_next_note(self, previous_notes, temperature):
"""Predict next note using model.
Args:
previous_notes: List of previous music21 notes
temperature: Sampling temperature
Returns:
music21.note.Note: Predicted next note
"""
context = self.encode_notes(previous_notes[-16:]) # Last 16 notes
logits = self.model.predict(context)
# Apply temperature sampling
probs = self.apply_temperature(logits, temperature)
next_pitch = self.sample_from_distribution(probs)
next_duration = self.sample_duration(probs)
return note.Note(next_pitch, quarterLength=next_duration)
def generate_full_composition(self, style="classical", duration_bars=32):
"""Generate complete musical piece with melody and harmony.
Args:
style: Musical style (e.g., "classical", "jazz", "pop")
duration_bars: Length of composition in bars
Returns:
music21.stream.Score: Complete composition
"""
composition = stream.Score()
# Create instruments
piano_part = stream.Part()
piano_part.append(instrument.Piano())
# Generate melody
melody = self.generate_melody_section(duration_bars)
piano_part.append(melody)
# Generate harmony
harmony = self.generate_harmony(melody)
piano_part.append(harmony)
# Add tempo and structure
composition.append(stream.MetronomeMark(number=120))
composition.append(piano_part)
return composition
def generate_harmony(self, melody):
"""Generate harmonic accompaniment for melody.
Args:
melody: Melodic stream
Returns:
music21.stream.Stream: Harmonic accompaniment
"""
harmony = stream.Stream()
# Analyze melody to find chord progression
chords = self.analyze_melody_harmony(melody)
# Generate accompaniment based on chords
for chord_tones in chords:
harmony.append(chord_tones)
return harmony
def encode_notes(self, notes):
"""Encode notes for model input."""
# Implementation depends on specific model
pass
def apply_temperature(self, logits, temperature):
"""Apply temperature scaling to probabilities.
Args:
logits: Raw model outputs
temperature: Temperature parameter
Returns:
np.ndarray: Probability distribution
"""
scaled = logits / temperature
exp_logits = np.exp(scaled)
return exp_logits / np.sum(exp_logits)
def sample_from_distribution(self, probs):
"""Sample from probability distribution.
Args:
probs: Probability distribution
Returns:
int: Sampled note
"""
return np.random.choice(len(probs), p=probs)
def sample_duration(self, probs):
"""Sample note duration from distribution."""
pass
def load_model(self, model_name):
"""Load the music generation model."""
pass
def analyze_melody_harmony(self, melody):
"""Analyze melody and extract harmonic structure."""
pass
def generate_melody_section(self, duration_bars):
"""Generate a melody section with given duration."""
pass
class AudioSynthesisAgent:
"""Synthesizes audio waveforms from MIDI or other inputs."""
def __init__(self, sample_rate=44100):
self.sample_rate = sample_rate
def synthesize_from_midi(self, midi_data, duration_seconds=60):
"""Convert MIDI to audio waveform.
Args:
midi_data: MIDI note data with start, duration, pitch
duration_seconds: Total audio duration
Returns:
np.ndarray: Audio samples
"""
audio_data = np.zeros(int(self.sample_rate * duration_seconds))
for note in midi_data:
start_time = note['start'] * self.sample_rate
duration = note['duration'] * self.sample_rate
pitch = note['pitch']
# Generate sine wave for note
sine_wave = self.generate_sine_wave(
pitch,
duration,
envelope=self.generate_adsr_envelope(duration)
)
# Add to audio
start_idx = int(start_time)
end_idx = start_idx + len(sine_wave)
audio_data[start_idx:end_idx] += sine_wave * 0.3
return audio_data
def generate_sine_wave(self, frequency, num_samples, envelope=None):
"""Generate sine wave for a specific frequency.
Args:
frequency: Frequency in Hz
num_samples: Number of samples to generate
envelope: Optional amplitude envelope
Returns:
np.ndarray: Generated wave samples
"""
t = np.arange(num_samples) / self.sample_rate
wave = np.sin(2 * np.pi * frequency * t)
if envelope is not None:
wave *= envelope
return wave
def generate_adsr_envelope(self, total_samples, attack=0.1, decay=0.2, sustain=0.6, release=0.1):
"""Generate ADSR (Attack, Decay, Sustain, Release) envelope.
Args:
total_samples: Total envelope length
attack: Attack time ratio
decay: Decay time ratio
sustain: Sustain level
release: Release time ratio
Returns:
np.ndarray: ADSR envelope
"""
attack_samples = int(attack * self.sample_rate)
decay_samples = int(decay * self.sample_rate)
sustain_samples = int(sustain * self.sample_rate)
release_samples = int(release * self.sample_rate)
envelope = []
# Attack
envelope.extend(np.linspace(0, 1, attack_samples))
# Decay
envelope.extend(np.linspace(1, 0.7, decay_samples))
# Sustain
envelope.extend(np.ones(sustain_samples) * 0.7)
# Release
envelope.extend(np.linspace(0.7, 0, release_samples))
# Pad to total length
envelope.extend(np.zeros(total_samples - len(envelope)))
return np.array(envelope[:total_samples])
def add_effects(self, audio, effect_type="reverb"):
"""Apply audio effects to signal.
Args:
audio: Audio samples
effect_type: Type of effect to apply
Returns:
np.ndarray: Audio with effects
"""
if effect_type == "reverb":
return self.add_reverb(audio)
elif effect_type == "chorus":
return self.add_chorus(audio)
elif effect_type == "delay":
return self.add_delay(audio)
return audio
def add_reverb(self, audio, room_size=0.5, delay_ms=50):
"""Add reverb effect to audio.
Args:
audio: Input audio
room_size: Room size parameter
delay_ms: Delay time in milliseconds
Returns:
np.ndarray: Audio with reverb
"""
delay_samples = int(delay_ms * self.sample_rate / 1000)
reverb = audio.copy()
for i in range(1, 5):
delayed = np.zeros_like(audio)
delayed[delay_samples * i:] = audio[:-delay_samples * i]
reverb += delayed * (0.5 ** i)
return reverb / np.max(np.abs(reverb))
def add_chorus(self, audio):
"""Add chorus effect (pitch variation).
Args:
audio: Input audio
Returns:
np.ndarray: Audio with chorus effect
"""
chorus = audio.copy()
# Vary playback speed slightly
speed_variation = 1 + 0.02 * np.sin(np.arange(len(audio)) / self.sample_rate * 2 * np.pi)
chorus_delayed = np.interp(
np.arange(len(audio)) / speed_variation,
np.arange(len(audio)),
audio
)
return (audio + chorus_delayed) / 2
def add_delay(self, audio, delay_ms=200, feedback=0.6):
"""Add delay effect to audio.
Args:
audio: Input audio
delay_ms: Delay time in milliseconds
feedback: Feedback amount
Returns:
np.ndarray: Audio with delay
"""
delay_samples = int(delay_ms * self.sample_rate / 1000)
delayed = np.zeros_like(audio)
delayed[delay_samples:] = audio[:-delay_samples] * feedback
return audio + delayed
def save_audio(self, audio, filename, normalize=True):
"""Save audio to WAV file.
Args:
audio: Audio samples
filename: Output file path
normalize: Whether to normalize audio
"""
if normalize:
audio = audio / np.max(np.abs(audio))
# Convert to 16-bit
audio_int = np.int16(audio * 32767)
wavfile.write(filename, self.sample_rate, audio_int)
"""
Podcast Producer Agent
Generates podcast scripts and produces audio from text-to-speech and audio synthesis.
"""
import numpy as np
class PodcastScriptGenerator:
"""Generates podcast scripts with intro, content segments, and outro."""
def __init__(self):
self.script_model = self.load_script_model()
self.tts_engine = self.load_tts_engine()
def generate_episode(self, topic, duration_minutes=30, num_hosts=2):
"""Generate complete podcast episode with script and audio.
Args:
topic: Podcast topic
duration_minutes: Desired duration in minutes
num_hosts: Number of hosts
Returns:
dict: Contains script, audio, and duration
"""
script = self.generate_script(topic, duration_minutes, num_hosts)
audio = self.convert_to_audio(script)
return {
"script": script,
"audio": audio,
"duration": duration_minutes
}
def generate_script(self, topic, duration_minutes, num_hosts):
"""Generate podcast script with structure.
Args:
topic: Episode topic
duration_minutes: Script duration
num_hosts: Number of hosts
Returns:
str: Complete script
"""
script_parts = []
# Generate intro
intro = self.generate_intro(topic, num_hosts)
script_parts.append(intro)
# Generate main content segments
content_duration = duration_minutes - 5 # Subtract intro/outro
segments = self.generate_content_segments(topic, content_duration, num_hosts)
script_parts.extend(segments)
# Generate outro
outro = self.generate_outro()
script_parts.append(outro)
return '\n\n'.join(script_parts)
def generate_intro(self, topic, num_hosts):
"""Generate podcast introduction.
Args:
topic: Episode topic
num_hosts: Number of hosts
Returns:
str: Intro script
"""
prompt = f"""Generate a podcast intro for a {num_hosts}-host show about: {topic}
Format:
HOST 1: [greeting and topic introduction]
HOST 2: [add enthusiasm and context]
Keep it engaging and conversational."""
return self.script_model.generate(prompt, max_tokens=200)
def generate_content_segments(self, topic, duration_minutes, num_hosts):
"""Generate main discussion content segments.
Args:
topic: Episode topic
duration_minutes: Content duration
num_hosts: Number of hosts
Returns:
list: List of content segments
"""
words_per_minute = 150
total_words = duration_minutes * words_per_minute
segments = []
words_written = 0
# Generate 3-4 main points
points = self.identify_key_points(topic, 3)
for point in points:
segment_words = total_words // len(points)
segment = self.generate_discussion_segment(point, segment_words, num_hosts)
segments.append(segment)
words_written += len(segment.split())
return segments
def generate_discussion_segment(self, point, target_words, num_hosts):
"""Generate back-and-forth discussion segment.
Args:
point: Discussion topic
target_words: Target word count
num_hosts: Number of hosts
Returns:
str: Discussion segment
"""
prompt = f"""Generate a podcast discussion segment about: {point}
Target length: ~{target_words} words
Number of hosts: {num_hosts}
Format as natural back-and-forth conversation between hosts.
Use natural speech patterns and interruptions."""
return self.script_model.generate(prompt, max_tokens=target_words // 4)
def generate_outro(self):
"""Generate podcast outro/closing.
Returns:
str: Outro script
"""
prompt = """Generate a podcast outro that:
1. Summarizes key points
2. Thanks listeners
3. Previews next episode
4. Includes call-to-action"""
return self.script_model.generate(prompt, max_tokens=150)
def identify_key_points(self, topic, num_points):
"""Identify key discussion points for topic."""
pass
def load_script_model(self):
"""Load script generation model."""
pass
def load_tts_engine(self):
"""Load text-to-speech engine."""
pass
def convert_to_audio(self, script):
"""Convert script to audio."""
pass
class PodcastAudioProducer:
"""Produces high-quality audio from podcast scripts."""
def __init__(self):
self.tts_engine = self.load_tts_engine()
from music_generation import AudioSynthesisAgent
self.audio_processor = AudioSynthesisAgent()
def produce_podcast(self, script):
"""Produce audio from podcast script.
Args:
script: Podcast script text
Returns:
np.ndarray: Audio samples
"""
audio_segments = []
# Parse script into speaker segments
segments = self.parse_script(script)
for speaker, text in segments:
# Generate audio for segment
audio = self.text_to_speech(text, speaker)
audio_segments.append(audio)
# Combine segments
full_audio = self.combine_audio_segments(audio_segments)
# Add background music and effects
full_audio = self.add_background_music(full_audio)
full_audio = self.add_transitions(full_audio)
return full_audio
def parse_script(self, script):
"""Parse script into speaker segments.
Args:
script: Script text
Returns:
list: List of (speaker, text) tuples
"""
segments = []
for line in script.split('\n'):
if ':' in line:
speaker, text = line.split(':', 1)
segments.append((speaker.strip(), text.strip()))
return segments
def text_to_speech(self, text, speaker="HOST1", speed=1.0, pitch=1.0):
"""Convert text to speech audio.
Args:
text: Text to synthesize
speaker: Speaker voice
speed: Playback speed
pitch: Pitch adjustment
Returns:
np.ndarray: Audio samples
"""
audio = self.tts_engine.synthesize(text, voice=speaker)
# Adjust speed and pitch
audio = self.adjust_speed(audio, speed)
audio = self.adjust_pitch(audio, pitch)
return audio
def combine_audio_segments(self, segments):
"""Combine audio segments with gaps.
Args:
segments: List of audio arrays
Returns:
np.ndarray: Combined audio
"""
combined = np.concatenate(segments)
return combined
def add_background_music(self, audio):
"""Add background music to podcast.
Args:
audio: Main audio track
Returns:
np.ndarray: Audio with background music
"""
music = self.generate_background_music(len(audio))
music = music * 0.2 # Reduce volume
return audio + music
def add_transitions(self, audio):
"""Add transition sounds between segments.
Args:
audio: Audio data
Returns:
np.ndarray: Audio with transitions
"""
pass
def adjust_speed(self, audio, speed_factor):
"""Adjust playback speed of audio.
Args:
audio: Audio samples
speed_factor: Speed multiplier
Returns:
np.ndarray: Speed-adjusted audio
"""
if speed_factor == 1.0:
return audio
indices = np.arange(0, len(audio)) / speed_factor
return np.interp(indices, np.arange(len(audio)), audio)
def adjust_pitch(self, audio, pitch_factor):
"""Adjust pitch of audio.
Args:
audio: Audio samples
pitch_factor: Pitch multiplier
Returns:
np.ndarray: Pitch-adjusted audio
"""
pass
def generate_background_music(self, duration_samples):
"""Generate ambient background music.
Args:
duration_samples: Length in samples
Returns:
np.ndarray: Generated music
"""
pass
def load_tts_engine(self):
"""Load text-to-speech engine."""
pass
"""
Style Transfer Agent
Transfers artistic styles between images using neural style transfer techniques.
"""
import cv2
class StyleTransferAgent:
"""Applies artistic style from one image to another using neural networks."""
def __init__(self, model_path="models/style_transfer.pth"):
self.model = self.load_model(model_path)
def transfer_style(self, content_image, style_image):
"""Transfer style from one image to another.
Args:
content_image: Path to content image
style_image: Path to style reference image
Returns:
np.ndarray: Stylized image
"""
# Preprocess images
content = self.preprocess_image(content_image)
style = self.preprocess_image(style_image)
# Transfer style
stylized = self.model(content, style)
# Postprocess
output = self.postprocess_image(stylized)
return output
def preprocess_image(self, image_path):
"""Load and preprocess image for style transfer.
Args:
image_path: Path to image file
Returns:
np.ndarray: Preprocessed image
"""
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = image.astype('float32') / 255.0
return image
def postprocess_image(self, image):
"""Postprocess style-transferred image.
Args:
image: Output image from model
Returns:
np.ndarray: Clipped and scaled image
"""
image = (image.clip(0, 1) * 255).astype('uint8')
return image
def load_model(self, model_path):
"""Load the style transfer model.
Args:
model_path: Path to model weights
Returns:
Model instance
"""
pass
Creative Generation Agent - Code Organization
This directory contains the refactored Creative Generation Agent skill with Python code extracted into modular, reusable files.
Directory Structure
creative-generation-agent/
├── README.md # This file
├── SKILL.md # Main skill documentation
├── examples/ # Example implementations
│ ├── music_generation.py # Music composition and audio synthesis
│ ├── meme_generator.py # Image and text-based meme generation
│ ├── podcast_producer.py # Podcast scripting and audio production
│ ├── image_generation.py # Diffusion model image generation
│ └── style_transfer.py # Neural style transfer
└── scripts/ # Utility modules
├── creative_quality_assessment.py # Content quality evaluation
├── audio_effects.py # Audio effect processing
└── content_moderation.py # Safety and compliance filteringQuick Start Guide
Installation
# Install required dependencies
pip install music21 numpy scipy pillow diffusers torch opencv-pythonMusic Generation
Generate melodies and synthesize audio:
from examples.music_generation import MusicGenerationAgent, AudioSynthesisAgent
# Create melody from seed notes
agent = MusicGenerationAgent()
melody = agent.generate_melody(
seed_notes=[("C4", 1), ("E4", 1), ("G4", 1)],
length=32,
temperature=0.8
)
# Synthesize audio
synth = AudioSynthesisAgent()
audio = synth.synthesize_from_midi(midi_data)
audio = synth.add_effects(audio, effect_type="reverb")
synth.save_audio(audio, "output.wav")Meme Generation
Create memes with captions and text:
from examples.meme_generator import MemeGenerationAgent, TextMemeGenerator
# Image-based meme
meme_agent = MemeGenerationAgent()
meme = meme_agent.generate_meme(topic="AI agents", meme_template="drake")
meme.save("meme.png")
# Text-based meme
text_gen = TextMemeGenerator()
joke = text_gen.generate_text_meme(topic="Python", format_type="joke")
print(joke)Podcast Generation
Create podcast scripts and produce audio:
from examples.podcast_producer import PodcastScriptGenerator, PodcastAudioProducer
# Generate script
generator = PodcastScriptGenerator()
episode = generator.generate_episode(
topic="The Future of AI",
duration_minutes=30,
num_hosts=2
)
# Produce audio
producer = PodcastAudioProducer()
audio = producer.produce_podcast(episode["script"])Image Generation
Generate images from text prompts:
from examples.image_generation import ImageGenerationAgent
agent = ImageGenerationAgent()
image = agent.generate_image(
prompt="A futuristic city with neon lights",
style="cyberpunk"
)
image.save("generated.png")
# Create variations
variations = agent.generate_variations(image, num_variations=4)Style Transfer
Apply artistic styles to images:
from examples.style_transfer import StyleTransferAgent
agent = StyleTransferAgent()
stylized = agent.transfer_style(
content_image="photo.jpg",
style_image="monet.jpg"
)Utilities
Quality Assessment
Evaluate content quality:
from scripts.creative_quality_assessment import CreativeQualityAssessor
assessor = CreativeQualityAssessor()
# Assess different content types
music_score = assessor.assess_content_quality(audio, content_type="music")
meme_score = assessor.assess_content_quality(meme, content_type="meme")
image_score = assessor.assess_content_quality(image, content_type="image")
print(f"Overall score: {music_score['overall_score']}")
print(f"Metrics: {music_score['metrics']}")Audio Effects
Apply professional audio effects:
from scripts.audio_effects import AudioEffects
effects = AudioEffects(sample_rate=44100)
# Apply various effects
audio = effects.reverb(audio, room_size=0.5, delay_ms=50)
audio = effects.compression(audio, threshold=0.5, ratio=4)
audio = effects.fade_in(audio, duration_ms=1000)
# Mix multiple tracks
mixed = effects.mix(track1, track2, track3, volumes=[1.0, 0.5, 0.3])Content Moderation
Filter and validate generated content:
from scripts.content_moderation import ContentModerator
moderator = ContentModerator()
# Moderate different content types
text_result = moderator.moderate_content(text, content_type="text", strict=False)
image_result = moderator.moderate_content(image, content_type="image")
meme_result = moderator.moderate_content(meme, content_type="meme", strict=True)
if text_result["passed"]:
print("Content approved")
else:
print(f"Issues: {text_result['issues']}")
# Generate moderation report
report = moderator.get_moderation_report(text_result, format="text")
print(report)Module Overview
examples/music_generation.py
Classes:
MusicGenerationAgent- Symbolic music generation using continuationAudioSynthesisAgent- Audio waveform synthesis with effects
Key Methods:
generate_melody()- Generate melody continuationgenerate_full_composition()- Create complete musical piecesynthesize_from_midi()- Convert MIDI to audioadd_effects()- Apply audio effects (reverb, chorus, delay)
examples/meme_generator.py
Classes:
MemeGenerationAgent- Image-based meme generationTextMemeGenerator- Text-only meme generation
Key Methods:
generate_meme()- Create meme with captiongenerate_caption()- Generate funny captionsapply_caption_to_template()- Add text to imagegenerate_text_meme()- Create text memes in various formats
examples/podcast_producer.py
Classes:
PodcastScriptGenerator- Generate podcast scriptsPodcastAudioProducer- Produce audio from scripts
Key Methods:
generate_episode()- Create complete episodegenerate_script()- Generate script with structuregenerate_content_segments()- Create discussion segmentsproduce_podcast()- Convert script to audio
examples/image_generation.py
Classes:
ImageGenerationAgent- Text-to-image generation using diffusion models
Key Methods:
generate_image()- Create image from promptenhance_prompt()- Add style modifiers to promptsgenerate_variations()- Create image variations
examples/style_transfer.py
Classes:
StyleTransferAgent- Neural style transfer
Key Methods:
transfer_style()- Apply style from one image to anotherpreprocess_image()- Prepare image for processingpostprocess_image()- Convert output to displayable format
scripts/creative_quality_assessment.py
Classes:
CreativeQualityAssessor- Quality evaluation for all content types
Quality Metrics:
- Music: coherence, variety, rhythm, harmony
- Meme: humor, clarity, originality, relatability
- Image: clarity, coherence, aesthetic, technical
scripts/audio_effects.py
Classes:
AudioEffects- Professional audio effect processing
Available Effects:
- Reverb - Spatial depth and ambience
- Echo - Repetition with decay
- Chorus - Pitch modulation
- Delay - Time-based effect
- Compression - Dynamic range control
- Normalization - Level adjustment
- Fade In/Out - Smooth transitions
- Equalization - Frequency adjustment
- Mix - Combine multiple tracks
scripts/content_moderation.py
Classes:
ContentModerator- Content safety and compliance checking
Moderation Features:
- Inappropriate language detection
- Bias detection
- Factual accuracy verification
- NSFW content detection
- Violence detection
- Copyright checking
- Hate speech detection
- Offensive content detection
Best Practices
Temperature Control
For creative content:
- High temperature (0.7-0.9): More creative and diverse outputs
- Medium temperature (0.5-0.7): Balanced creativity and coherence
- Low temperature (0.1-0.3): More consistent and predictable
Audio Processing
1. Levels: Keep peaks below -3dB for headroom 2. Effects Chain: Apply compression before EQ 3. Mixing: Use compression and limiting on master bus 4. Normalization: Normalize after all effects
Content Generation
1. Start with specific prompts 2. Refine through iteration 3. Assess quality systematically 4. Moderate safety-critical content 5. Version successful parameters
Quality Metrics
- Music: Aim for coherence > 0.7 and variety > 0.6
- Memes: Humor score > 0.6, clarity > 0.7
- Images: Clarity > 0.8, aesthetic > 0.7
Integration Examples
Complete Music Production Pipeline
from examples.music_generation import MusicGenerationAgent, AudioSynthesisAgent
from scripts.audio_effects import AudioEffects
from scripts.creative_quality_assessment import CreativeQualityAssessor
# Generate music
music_agent = MusicGenerationAgent()
composition = music_agent.generate_full_composition()
# Synthesize to audio
synth = AudioSynthesisAgent()
audio = synth.synthesize_from_midi(composition)
# Apply effects
effects = AudioEffects()
audio = effects.reverb(audio)
audio = effects.compression(audio)
audio = effects.normalize(audio)
# Assess quality
assessor = CreativeQualityAssessor()
quality = assessor.assess_content_quality(audio, content_type="music")
synth.save_audio(audio, "final_track.wav")Safe Content Generation
from examples.meme_generator import MemeGenerationAgent
from scripts.content_moderation import ContentModerator
# Generate meme
agent = MemeGenerationAgent()
meme = agent.generate_meme(topic="AI")
# Moderate content
moderator = ContentModerator()
result = moderator.moderate_content(meme, content_type="meme", strict=True)
if result["passed"]:
meme.save("approved_meme.png")
else:
print(f"Content rejected: {result['issues']}")Performance Considerations
- Music generation: 30-60 seconds for 32-bar composition
- Image generation: 30-120 seconds depending on inference steps
- Audio synthesis: Real-time processing possible
- Quality assessment: < 1 second per item
Extending the Code
To add new features:
1. Add effects: Extend AudioEffects class 2. Add quality metrics: Extend CreativeQualityAssessor 3. Add generation models: Create new classes in examples/ 4. Add moderation rules: Extend ContentModerator
Requirements
- Python 3.8+
- numpy
- scipy
- pillow
- music21
- diffusers
- torch
- opencv-python (cv2)
References
License
Part of the AI Agent Skills project
"""
Audio Effects Utilities
Provides various audio effect implementations for sound processing and enhancement.
"""
import numpy as np
class AudioEffects:
"""Provides common audio effects for music and podcast production."""
def __init__(self, sample_rate=44100):
self.sample_rate = sample_rate
def apply_effect(self, audio, effect_type="reverb", **kwargs):
"""Apply audio effect to signal.
Args:
audio: Audio samples
effect_type: Type of effect to apply
**kwargs: Effect-specific parameters
Returns:
np.ndarray: Processed audio
"""
effects = {
"reverb": self.reverb,
"echo": self.echo,
"chorus": self.chorus,
"delay": self.delay,
"compression": self.compression,
"normalization": self.normalize,
"fade_in": self.fade_in,
"fade_out": self.fade_out,
}
if effect_type not in effects:
raise ValueError(f"Unknown effect: {effect_type}")
return effects[effect_type](audio, **kwargs)
def reverb(self, audio, room_size=0.5, delay_ms=50, decay=0.5):
"""Add reverb effect to audio.
Args:
audio: Input audio
room_size: Room size parameter (0-1)
delay_ms: Delay time in milliseconds
decay: Decay amount (0-1)
Returns:
np.ndarray: Audio with reverb
"""
delay_samples = int(delay_ms * self.sample_rate / 1000)
reverb = audio.copy()
for i in range(1, 5):
delayed = np.zeros_like(audio)
delayed[delay_samples * i:] = audio[:-delay_samples * i]
reverb += delayed * (decay ** i)
return reverb / np.max(np.abs(reverb))
def echo(self, audio, delay_ms=500, decay=0.6, repeats=2):
"""Add echo/repetition effect.
Args:
audio: Input audio
delay_ms: Delay time in milliseconds
decay: Decay per repetition
repeats: Number of repetitions
Returns:
np.ndarray: Audio with echo
"""
delay_samples = int(delay_ms * self.sample_rate / 1000)
output = audio.copy()
for i in range(repeats):
delayed = np.zeros_like(audio)
shift = delay_samples * (i + 1)
delayed[shift:] = audio[:-shift] * (decay ** (i + 1))
output += delayed
return output / np.max(np.abs(output))
def chorus(self, audio, rate_hz=1.5, depth=0.02):
"""Add chorus effect (pitch modulation).
Args:
audio: Input audio
rate_hz: LFO rate in Hz
depth: Modulation depth
Returns:
np.ndarray: Audio with chorus effect
"""
samples = np.arange(len(audio))
delay_samples = 10 # Base delay
lfo = depth * np.sin(2 * np.pi * rate_hz * samples / self.sample_rate)
varied_delay = delay_samples * (1 + lfo)
chorus_output = np.interp(
samples - varied_delay,
np.arange(len(audio)),
audio
)
return (audio + chorus_output) / 2
def delay(self, audio, delay_ms=200, feedback=0.6, num_repeats=1):
"""Add delay effect.
Args:
audio: Input audio
delay_ms: Delay time in milliseconds
feedback: Feedback amount (0-1)
num_repeats: Number of repeats
Returns:
np.ndarray: Audio with delay
"""
delay_samples = int(delay_ms * self.sample_rate / 1000)
output = audio.copy()
for _ in range(num_repeats):
delayed = np.zeros_like(audio)
delayed[delay_samples:] = output[:-delay_samples] * feedback
output = output + delayed
return output / np.max(np.abs(output))
def compression(self, audio, threshold=0.5, ratio=4, attack_ms=5, release_ms=50):
"""Apply dynamic range compression.
Args:
audio: Input audio
threshold: Compression threshold
ratio: Compression ratio
attack_ms: Attack time in milliseconds
release_ms: Release time in milliseconds
Returns:
np.ndarray: Compressed audio
"""
attack_samples = int(attack_ms * self.sample_rate / 1000)
release_samples = int(release_ms * self.sample_rate / 1000)
output = audio.copy()
envelope = np.zeros_like(audio)
for i in range(len(audio)):
if i == 0:
envelope[i] = abs(audio[i])
else:
level = abs(audio[i])
if level > envelope[i - 1]:
# Attack
envelope[i] = envelope[i - 1] + (level - envelope[i - 1]) / attack_samples
else:
# Release
envelope[i] = envelope[i - 1] - (envelope[i - 1] - level) / release_samples
# Apply compression
gain = np.ones_like(audio)
above_threshold = envelope > threshold
if np.any(above_threshold):
gain[above_threshold] = (threshold + (envelope[above_threshold] - threshold) / ratio) / envelope[above_threshold]
return output * gain
def normalize(self, audio, target_level=0.9):
"""Normalize audio to target level.
Args:
audio: Input audio
target_level: Target amplitude level (0-1)
Returns:
np.ndarray: Normalized audio
"""
max_val = np.max(np.abs(audio))
if max_val > 0:
return audio * (target_level / max_val)
return audio
def fade_in(self, audio, duration_ms=1000):
"""Apply fade-in effect.
Args:
audio: Input audio
duration_ms: Fade duration in milliseconds
Returns:
np.ndarray: Audio with fade-in
"""
fade_samples = int(duration_ms * self.sample_rate / 1000)
fade_samples = min(fade_samples, len(audio))
output = audio.copy()
envelope = np.ones(len(audio))
envelope[:fade_samples] = np.linspace(0, 1, fade_samples)
return output * envelope
def fade_out(self, audio, duration_ms=1000):
"""Apply fade-out effect.
Args:
audio: Input audio
duration_ms: Fade duration in milliseconds
Returns:
np.ndarray: Audio with fade-out
"""
fade_samples = int(duration_ms * self.sample_rate / 1000)
fade_samples = min(fade_samples, len(audio))
output = audio.copy()
envelope = np.ones(len(audio))
envelope[-fade_samples:] = np.linspace(1, 0, fade_samples)
return output * envelope
def equalize(self, audio, gain_low=0, gain_mid=0, gain_high=0, frequencies=None):
"""Apply parametric equalization.
Args:
audio: Input audio
gain_low: Gain adjustment for low frequencies (dB)
gain_mid: Gain adjustment for mid frequencies (dB)
gain_high: Gain adjustment for high frequencies (dB)
frequencies: Custom frequency settings
Returns:
np.ndarray: Equalized audio
"""
# Simplified EQ implementation
from scipy.signal import butter, sosfilt
output = audio.copy()
# Low shelf (< 200 Hz)
if gain_low != 0:
sos = butter(2, 200, 'low', fs=self.sample_rate, output='sos')
low_band = sosfilt(sos, audio)
gain_factor = 10 ** (gain_low / 20)
output += (low_band - audio) * (gain_factor - 1)
return output
def mix(self, *audio_tracks, volumes=None):
"""Mix multiple audio tracks.
Args:
*audio_tracks: Audio arrays to mix
volumes: Volume levels for each track (0-1)
Returns:
np.ndarray: Mixed audio
"""
if volumes is None:
volumes = [1.0] * len(audio_tracks)
# Pad to same length
max_length = max(len(track) for track in audio_tracks)
mixed = np.zeros(max_length)
for track, volume in zip(audio_tracks, volumes):
padded = np.zeros(max_length)
padded[:len(track)] = track
mixed += padded * volume
# Normalize to prevent clipping
max_val = np.max(np.abs(mixed))
if max_val > 1.0:
mixed = mixed / max_val
return mixed
"""
Content Moderation
Filters and validates generated creative content for safety and quality.
"""
class ContentModerator:
"""Moderates generated content for safety, compliance, and quality."""
def __init__(self):
self.filter_list = self.load_filter_list()
self.bias_checker = self.load_bias_checker()
self.copyright_db = self.load_copyright_database()
def moderate_content(self, content, content_type="text", strict=False):
"""Moderate generated content.
Args:
content: Content to moderate
content_type: Type of content ('text', 'image', 'audio', 'meme')
strict: Use strict filtering if True
Returns:
dict: Moderation results with pass/fail and issues found
"""
results = {
"content": content,
"content_type": content_type,
"passed": True,
"issues": [],
"scores": {}
}
if content_type == "text":
self._moderate_text(content, results, strict)
elif content_type == "image":
self._moderate_image(content, results, strict)
elif content_type == "audio":
self._moderate_audio(content, results, strict)
elif content_type == "meme":
self._moderate_meme(content, results, strict)
return results
def _moderate_text(self, text, results, strict):
"""Moderate text content.
Args:
text: Text to moderate
results: Results dictionary to update
strict: Use strict filtering
"""
# Check for inappropriate content
inappropriate_score = self.detect_inappropriate_language(text)
results["scores"]["inappropriate"] = inappropriate_score
if strict and inappropriate_score > 0.3:
results["passed"] = False
results["issues"].append("Contains potentially inappropriate language")
elif inappropriate_score > 0.7:
results["passed"] = False
results["issues"].append("Contains inappropriate language")
# Check for bias
bias_score = self.detect_bias(text)
results["scores"]["bias"] = bias_score
if bias_score > 0.5:
results["passed"] = False
results["issues"].append("Content may contain biased language")
# Check factual accuracy
accuracy = self.verify_factual_accuracy(text)
results["scores"]["factual_accuracy"] = accuracy
if accuracy < 0.5:
results["issues"].append("Content may contain inaccuracies")
def _moderate_image(self, image, results, strict):
"""Moderate image content.
Args:
image: Image to moderate
results: Results dictionary to update
strict: Use strict filtering
"""
# Check for inappropriate visual content
nsfw_score = self.detect_nsfw_content(image)
results["scores"]["nsfw"] = nsfw_score
if nsfw_score > 0.5:
results["passed"] = False
results["issues"].append("Image contains inappropriate content")
# Check for violence
violence_score = self.detect_violence(image)
results["scores"]["violence"] = violence_score
if violence_score > 0.5:
results["passed"] = False
results["issues"].append("Image may contain violent content")
# Check for copyright
copyright_match = self.check_copyright(image)
if copyright_match:
results["passed"] = False
results["issues"].append(f"Image matches copyrighted content: {copyright_match}")
def _moderate_audio(self, audio, results, strict):
"""Moderate audio content.
Args:
audio: Audio to moderate
results: Results dictionary to update
strict: Use strict filtering
"""
# Speech-to-text for audio analysis
transcribed = self.transcribe_audio(audio)
# Moderate transcription
self._moderate_text(transcribed, results, strict)
def _moderate_meme(self, meme, results, strict):
"""Moderate meme content.
Args:
meme: Meme to moderate
results: Results dictionary to update
strict: Use strict filtering
"""
# Check for hate speech
hate_score = self.detect_hate_speech(meme)
results["scores"]["hate_speech"] = hate_score
if hate_score > 0.5:
results["passed"] = False
results["issues"].append("Meme may contain hate speech")
# Check for offensive content
offensive_score = self.detect_offensive_content(meme)
results["scores"]["offensive"] = offensive_score
if strict and offensive_score > 0.3:
results["passed"] = False
results["issues"].append("Meme contains potentially offensive content")
elif offensive_score > 0.7:
results["passed"] = False
results["issues"].append("Meme contains offensive content")
def detect_inappropriate_language(self, text):
"""Detect inappropriate language in text.
Args:
text: Text to analyze
Returns:
float: Inappropriateness score (0-1)
"""
pass
def detect_bias(self, text):
"""Detect bias in text.
Args:
text: Text to analyze
Returns:
float: Bias score (0-1)
"""
pass
def verify_factual_accuracy(self, text):
"""Verify factual accuracy of claims in text.
Args:
text: Text to verify
Returns:
float: Accuracy score (0-1)
"""
pass
def detect_nsfw_content(self, image):
"""Detect NSFW content in image.
Args:
image: Image to analyze
Returns:
float: NSFW score (0-1)
"""
pass
def detect_violence(self, image):
"""Detect violent content in image.
Args:
image: Image to analyze
Returns:
float: Violence score (0-1)
"""
pass
def check_copyright(self, image):
"""Check if image matches copyrighted content.
Args:
image: Image to check
Returns:
str: Copyright match details or None
"""
pass
def detect_hate_speech(self, content):
"""Detect hate speech in content.
Args:
content: Content to analyze
Returns:
float: Hate speech score (0-1)
"""
pass
def detect_offensive_content(self, content):
"""Detect offensive content.
Args:
content: Content to analyze
Returns:
float: Offensiveness score (0-1)
"""
pass
def transcribe_audio(self, audio):
"""Transcribe audio to text for analysis.
Args:
audio: Audio data
Returns:
str: Transcribed text
"""
pass
def load_filter_list(self):
"""Load inappropriate content filter list."""
pass
def load_bias_checker(self):
"""Load bias detection model."""
pass
def load_copyright_database(self):
"""Load copyright verification database."""
pass
def get_moderation_report(self, moderation_results, format="text"):
"""Generate moderation report.
Args:
moderation_results: Results from moderate_content()
format: Report format ('text', 'json', 'html')
Returns:
str: Formatted moderation report
"""
if format == "text":
report = f"Moderation Report\n"
report += f"Content Type: {moderation_results['content_type']}\n"
report += f"Status: {'PASS' if moderation_results['passed'] else 'FAIL'}\n"
if moderation_results['issues']:
report += "\nIssues Found:\n"
for issue in moderation_results['issues']:
report += f" - {issue}\n"
report += "\nScores:\n"
for key, score in moderation_results['scores'].items():
report += f" {key}: {score:.2f}\n"
return report
return str(moderation_results)
"""
Creative Quality Assessment
Evaluates the quality of generated creative content across multiple dimensions.
"""
class CreativeQualityAssessor:
"""Assesses quality of generated creative content."""
def assess_content_quality(self, content, content_type="music"):
"""Assess quality of generated content based on type.
Args:
content: Generated content to assess
content_type: Type of content ('music', 'meme', 'image', etc.)
Returns:
dict: Quality metrics and overall score
"""
if content_type == "music":
return self.assess_music_quality(content)
elif content_type == "meme":
return self.assess_meme_quality(content)
elif content_type == "image":
return self.assess_image_quality(content)
def assess_music_quality(self, audio):
"""Assess quality of generated music.
Args:
audio: Audio samples
Returns:
dict: Music quality metrics
"""
metrics = {
"coherence": self.measure_musical_coherence(audio),
"variety": self.measure_melodic_variety(audio),
"rhythm_consistency": self.measure_rhythm_consistency(audio),
"harmonic_quality": self.measure_harmonic_quality(audio),
}
overall_score = sum(metrics.values()) / len(metrics)
return {"metrics": metrics, "overall_score": overall_score}
def assess_meme_quality(self, meme):
"""Assess quality of generated meme.
Args:
meme: Meme content (text or image)
Returns:
dict: Meme quality metrics
"""
metrics = {
"humor_score": self.assess_humor(meme),
"clarity": self.assess_visual_clarity(meme),
"originality": self.assess_originality(meme),
"relatability": self.assess_relatability(meme),
}
overall_score = sum(metrics.values()) / len(metrics)
return {"metrics": metrics, "overall_score": overall_score}
def assess_image_quality(self, image):
"""Assess quality of generated image.
Args:
image: Image content
Returns:
dict: Image quality metrics
"""
metrics = {
"clarity": self.measure_image_clarity(image),
"coherence": self.measure_content_coherence(image),
"aesthetic": self.measure_aesthetic_quality(image),
"technical": self.measure_technical_quality(image),
}
overall_score = sum(metrics.values()) / len(metrics)
return {"metrics": metrics, "overall_score": overall_score}
def measure_musical_coherence(self, audio):
"""Measure how coherent/structured the music is.
Args:
audio: Audio samples
Returns:
float: Coherence score (0-1)
"""
pass
def measure_melodic_variety(self, audio):
"""Measure melodic variety and diversity.
Args:
audio: Audio samples
Returns:
float: Variety score (0-1)
"""
pass
def measure_rhythm_consistency(self, audio):
"""Measure rhythmic consistency and timing.
Args:
audio: Audio samples
Returns:
float: Consistency score (0-1)
"""
pass
def measure_harmonic_quality(self, audio):
"""Measure harmonic quality and chord progression.
Args:
audio: Audio samples
Returns:
float: Harmonic quality score (0-1)
"""
pass
def assess_humor(self, meme):
"""Assess humor level of meme.
Args:
meme: Meme content
Returns:
float: Humor score (0-1)
"""
pass
def assess_visual_clarity(self, meme):
"""Assess visual clarity and readability.
Args:
meme: Meme content
Returns:
float: Clarity score (0-1)
"""
pass
def assess_originality(self, meme):
"""Assess originality of meme.
Args:
meme: Meme content
Returns:
float: Originality score (0-1)
"""
pass
def assess_relatability(self, meme):
"""Assess how relatable the meme is.
Args:
meme: Meme content
Returns:
float: Relatability score (0-1)
"""
pass
def measure_image_clarity(self, image):
"""Measure sharpness and clarity of image.
Args:
image: Image data
Returns:
float: Clarity score (0-1)
"""
pass
def measure_content_coherence(self, image):
"""Measure coherence of visual content.
Args:
image: Image data
Returns:
float: Coherence score (0-1)
"""
pass
def measure_aesthetic_quality(self, image):
"""Measure aesthetic appeal of image.
Args:
image: Image data
Returns:
float: Aesthetic score (0-1)
"""
pass
def measure_technical_quality(self, image):
"""Measure technical quality (colors, contrast, etc.).
Args:
image: Image data
Returns:
float: Technical quality score (0-1)
"""
pass