π¬ Title The Happy Animal Adventure | 15 Minutes of Fun Nursery Rhymes for Kids Target Age: 2β5 years Animation Style: Bright 3D cartoon Big expressive eyes Rainbow colors Smooth animation Cute animals Happy facial expressions Gentle camera movement INTRO (0:00β0:30) Scene 1 (0:00β0:05) Rainbow appears in the sky. Text: "Welcome Little Friends!" Scene 2 (0:05β0:10) Happy Sun smiles. Clouds wave. Birds fly. Scene 3 (0:10β0:15) Your channel logo appears. Sparkles everywhere. Scene 4 (0:15β0:30) Five kids run into the playground. All wave toward the audience. Music begins. RHYME 1 β Animal Parade (0:30β3:00) Scene 5 Lion dancing. "Roar Roar!" Scene 6 Elephant sprays water. Rainbow appears. Scene 7 Monkey swinging. Bananas fall. Scene 8 Bunny hopping. Flowers bloom. Scene 9 Bird flying. Butterflies follow. Scene 10 All animals dance together. Children clap. RHYME 2 β ABC Adventure (3:00β5:30) Scene 11 Letter A becomes an Apple. Scene 12 B becomes Ball. Scene 13 C becomes Cat. Continue until Z with fun animated transformations, showing one or two letters every 10β15 seconds. RHYME 3 β Numbers Song (5:30β8:00) Scene 14 One happy balloon. Scene 15 Two ducks. Scene 16 Three stars. Continue to Ten using colorful objects, counting with cheerful narration. RHYME 4 β Colors Song (8:00β10:30) Red apple Blue sky Green tree Yellow sun Purple butterfly Pink flowers Orange fish Rainbow ending Each color gets its own short animated sequence. RHYME 5 β Shapes Song (10:30β12:30) Circle Square Triangle Rectangle Heart Star Each shape transforms into familiar objects (e.g., circle β ball, triangle β mountain). GRAND FINALE (12:30β15:00) Scene 1 Animals return. Everyone sings together. Scene 2 Children dance. Confetti falls. Scene 3 Rainbow spins. Camera zooms out. Scene 4 Subscribe animation. Large colorful text: β Subscribe for More Rhymes! π¨ Main Characters π¦ Tommy (boy in blue) π§ Lily (girl in pink) π¦ Leo the Lion π Ellie the Elephant π΅ Momo the Monkey π° Bella the Bunny π¦ Bluey the Bird βοΈ Smiley Sun π Happy Rainbow π΅ Background Music Tempo: 120β130 BPM Instruments: Ukulele, xylophone, bells, claps, whistles Children's choir singing the chorus Gentle sound effects (bird chirps, bubbles, laughter) π₯ Viral Retention Tips Change scenes every 5β8 seconds. Use bright colors and exaggerated expressions. Add floating stars, bubbles, and sparkles. Include simple dance moves children can copy. Repeat catchy choruses to encourage singing along. End with a fun teaser: "See you in the next adventure!"
mkdir -p /tmp/workspace/happy-animal-adventure && ls -la /tmp/workspace/
~/happy-animal-adventure/build_pptx.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
import math
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank_layout = prs.slide_layouts[6]
# βββββββββββββββββββββββββββββββββββββββββββββ
# COLOR PALETTE
# βββββββββββββββββββββββββββββββββββββββββββββ
C = {
"sky_blue": RGBColor(0x87, 0xCE, 0xEB),
"deep_blue": RGBColor(0x1A, 0x6A, 0xC8),
"sunny_yellow":RGBColor(0xFF, 0xD7, 0x00),
"warm_orange": RGBColor(0xFF, 0x85, 0x00),
"grass_green": RGBColor(0x4C, 0xBB, 0x17),
"dark_green": RGBColor(0x22, 0x8B, 0x22),
"hot_pink": RGBColor(0xFF, 0x69, 0xB4),
"light_pink": RGBColor(0xFF, 0xB6, 0xC1),
"purple": RGBColor(0x9B, 0x59, 0xB6),
"red": RGBColor(0xE7, 0x4C, 0x3C),
"white": RGBColor(0xFF, 0xFF, 0xFF),
"black": RGBColor(0x1A, 0x1A, 0x1A),
"gold": RGBColor(0xFF, 0xC1, 0x07),
"teal": RGBColor(0x00, 0xBF, 0xBF),
"coral": RGBColor(0xFF, 0x6B, 0x6B),
"lavender": RGBColor(0xCC, 0xAA, 0xFF),
"mint": RGBColor(0x98, 0xFF, 0xD2),
"rainbow1": RGBColor(0xFF, 0x00, 0x00),
"rainbow2": RGBColor(0xFF, 0x7F, 0x00),
"rainbow3": RGBColor(0xFF, 0xFF, 0x00),
"rainbow4": RGBColor(0x00, 0xFF, 0x00),
"rainbow5": RGBColor(0x00, 0x00, 0xFF),
"rainbow6": RGBColor(0x8B, 0x00, 0xFF),
"dark_navy": RGBColor(0x0D, 0x1B, 0x4B),
"light_blue": RGBColor(0xAD, 0xD8, 0xE6),
}
# βββββββββββββββββββββββββββββββββββββββββββββ
# HELPERS
# βββββββββββββββββββββββββββββββββββββββββββββ
def add_bg(slide, color):
bg = slide.shapes.add_shape(1, 0, 0, prs.slide_width, prs.slide_height)
bg.fill.solid()
bg.fill.fore_color.rgb = color
bg.line.fill.background()
return bg
def add_rect(slide, left, top, w, h, fill_color, line_color=None, radius=None):
from pptx.util import Pt as Ptx
shp = slide.shapes.add_shape(1, Inches(left), Inches(top), Inches(w), Inches(h))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = Pt(2)
else:
shp.line.fill.background()
return shp
def add_rounded_rect(slide, left, top, w, h, fill_color, line_color=None):
shp = slide.shapes.add_shape(5, Inches(left), Inches(top), Inches(w), Inches(h))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = Pt(2.5)
else:
shp.line.fill.background()
return shp
def add_ellipse(slide, left, top, w, h, fill_color, line_color=None):
shp = slide.shapes.add_shape(9, Inches(left), Inches(top), Inches(w), Inches(h))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = Pt(2)
else:
shp.line.fill.background()
return shp
def add_star(slide, left, top, w, h, fill_color):
shp = slide.shapes.add_shape(12, Inches(left), Inches(top), Inches(w), Inches(h))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
shp.line.fill.background()
return shp
def add_text(slide, text, left, top, w, h,
font_size=24, bold=False, color=None,
align=PP_ALIGN.CENTER, font_name="Comic Sans MS",
wrap=True, italic=False):
if color is None:
color = C["black"]
tb = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = MSO_ANCHOR.MIDDLE
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font_name
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
return tb
def add_badge(slide, text, left, top, w, h, bg_color, text_color, font_size=13):
add_rounded_rect(slide, left, top, w, h, bg_color)
add_text(slide, text, left, top, w, h, font_size=font_size, bold=True,
color=text_color, align=PP_ALIGN.CENTER)
def add_header_bar(slide, title, subtitle, bg_color, title_color, sub_color):
add_rect(slide, 0, 0, 13.333, 1.5, bg_color)
add_text(slide, title, 0.3, 0.05, 12.7, 0.85,
font_size=36, bold=True, color=title_color)
add_text(slide, subtitle, 0.3, 0.85, 12.7, 0.6,
font_size=18, bold=False, color=sub_color, italic=True)
def add_scene_card(slide, scene_num, timestamp, scene_desc, x, y, w=3.8, h=1.9,
card_color=None, text_color=None, accent=None):
if card_color is None: card_color = C["white"]
if text_color is None: text_color = C["dark_navy"]
if accent is None: accent = C["deep_blue"]
# card shadow
add_rounded_rect(slide, x+0.07, y+0.07, w, h, RGBColor(0xCC,0xCC,0xCC))
# main card
add_rounded_rect(slide, x, y, w, h, card_color, accent)
# accent top strip
add_rect(slide, x, y, w, 0.32, accent)
# scene number pill
add_ellipse(slide, x+0.1, y+0.04, 0.7, 0.25, C["gold"])
add_text(slide, f"Scene {scene_num}", x+0.05, y+0.03, 0.9, 0.25,
font_size=10, bold=True, color=C["dark_navy"])
# timestamp
add_text(slide, timestamp, x+2.8, y+0.03, 1.0, 0.25,
font_size=10, bold=False, color=C["white"], align=PP_ALIGN.RIGHT)
# description
add_text(slide, scene_desc, x+0.15, y+0.38, w-0.3, h-0.5,
font_size=13, bold=False, color=text_color,
align=PP_ALIGN.LEFT, wrap=True)
def add_divider(slide, y, color):
add_rect(slide, 0.4, y, 12.5, 0.04, color)
def add_emoji_box(slide, emoji, label, x, y, size=1.1, bg=None):
if bg is None: bg = C["light_blue"]
add_ellipse(slide, x, y, size, size, bg)
add_text(slide, emoji, x, y-0.05, size, size*0.55, font_size=28, bold=False,
color=C["black"], align=PP_ALIGN.CENTER)
add_text(slide, label, x-0.1, y+size*0.55, size+0.2, 0.4, font_size=12,
bold=True, color=C["dark_navy"], align=PP_ALIGN.CENTER)
def rainbow_stripe(slide, y, stripe_h=0.18):
colors = [C["rainbow1"],C["rainbow2"],C["rainbow3"],C["rainbow4"],C["rainbow5"],C["rainbow6"]]
w = 13.333 / len(colors)
for i, col in enumerate(colors):
add_rect(slide, i*w, y, w+0.02, stripe_h, col)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 1 β TITLE / COVER
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, C["sky_blue"])
# rainbow stripes at top
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)
# sun circle top-right
add_ellipse(slide, 11.2, 0.4, 1.8, 1.8, C["sunny_yellow"])
add_text(slide, "βοΈ", 11.2, 0.4, 1.8, 1.8, font_size=60, bold=False, color=C["warm_orange"])
# title box
add_rounded_rect(slide, 0.8, 1.1, 11.6, 2.4, RGBColor(0xFF,0xFF,0xAA), C["warm_orange"])
add_text(slide, "π¬ The Happy Animal Adventure", 0.9, 1.15, 11.4, 1.3,
font_size=40, bold=True, color=C["warm_orange"])
add_text(slide, "15 Minutes of Fun Nursery Rhymes for Kids",
0.9, 2.35, 11.4, 0.9, font_size=22, bold=False, color=C["deep_blue"])
# sub info strip
add_rounded_rect(slide, 1.5, 3.6, 10.3, 0.75, C["deep_blue"])
add_text(slide, "π― Target Age: 2β5 Years | π¨ Bright 3D Cartoon Animation | β± Total Runtime: 15 Minutes",
1.5, 3.6, 10.3, 0.75, font_size=16, bold=True, color=C["white"])
# character emoji row
chars = [("π¦","Leo"),("π","Ellie"),("π΅","Momo"),("π°","Bella"),("π¦","Bluey"),
("π¦","Tommy"),("π§","Lily"),("βοΈ","Sun"),("π","Rainbow")]
x_start = 0.6
for i, (em, nm) in enumerate(chars):
add_emoji_box(slide, em, nm, x_start + i*1.36, 4.55, size=0.9,
bg=C["sunny_yellow"] if i % 2 == 0 else C["hot_pink"])
# music & style tags
add_rounded_rect(slide, 0.5, 5.7, 5.8, 1.2, C["purple"])
add_text(slide, "π΅ Music: 120β130 BPM | Ukulele, Xylophone, Bells\nChildren's Choir | Bird Chirps & Laughter",
0.6, 5.7, 5.6, 1.2, font_size=14, bold=False, color=C["white"])
add_rounded_rect(slide, 7.0, 5.7, 5.8, 1.2, C["grass_green"])
add_text(slide, "π¨ Animation: Big Eyes Β· Rainbow Colors\nSmooth 3D Cartoon Β· Happy Expressions",
7.1, 5.7, 5.6, 1.2, font_size=14, bold=False, color=C["white"])
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 2 β TABLE OF CONTENTS
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xF8, 0xFF))
rainbow_stripe(slide, 0, 0.18)
add_header_bar(slide, "π Storyboard Overview", "15-Minute Structure at a Glance",
C["deep_blue"], C["gold"], C["light_blue"])
sections = [
("π INTRO", "0:00β0:30", "Rainbow Β· Sun Β· Channel Logo Β· Kids in Playground", C["teal"], C["white"]),
("π¦ RHYME 1 β Animal Parade", "0:30β3:00", "Lion Β· Elephant Β· Monkey Β· Bunny Β· Bird Β· All Dance", C["grass_green"],C["white"]),
("π€ RHYME 2 β ABC Adventure", "3:00β5:30", "AβApple β¦ Z with animated letter transformations", C["deep_blue"], C["white"]),
("π’ RHYME 3 β Numbers Song", "5:30β8:00", "1 Balloon β 10 Stars, counting with colorful objects", C["purple"], C["white"]),
("π¨ RHYME 4 β Colors Song", "8:00β10:30", "Red Β· Blue Β· Green Β· Yellow Β· Purple Β· Pink Β· Rainbow", C["warm_orange"],C["white"]),
("π· RHYME 5 β Shapes Song", "10:30β12:30","CircleβBall Β· Square Β· TriangleβMountain Β· Heart Β· Star", C["hot_pink"], C["white"]),
("π GRAND FINALE", "12:30β15:00","All Characters Β· Confetti Β· Rainbow Spin Β· Subscribe CTA", C["coral"], C["white"]),
]
for i, (title, ts, desc, bg, fg) in enumerate(sections):
y = 1.6 + i * 0.75
add_rounded_rect(slide, 0.5, y, 12.3, 0.66, bg)
add_text(slide, title, 0.65, y, 3.5, 0.66, font_size=16, bold=True, color=fg)
add_text(slide, ts, 4.1, y, 1.6, 0.66, font_size=14, bold=True, color=C["gold"])
add_text(slide, desc, 5.8, y, 6.8, 0.66, font_size=13, bold=False, color=fg,
align=PP_ALIGN.LEFT)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 3 β INTRO STORYBOARD (0:00β0:30)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xE8, 0xF4, 0xFF))
rainbow_stripe(slide, 0, 0.18)
add_header_bar(slide, "π INTRO", "Timestamp: 0:00 β 0:30",
C["teal"], C["white"], C["mint"])
scenes_intro = [
("1", "0:00β0:05", "π Rainbow appears in the sky.\n\"Welcome Little Friends!\" text floats in with sparkles.", 0.4, 1.7),
("2", "0:05β0:10", "βοΈ Happy Sun smiles warmly.\nClouds wave side-to-side.\nBirds fly across the screen.", 6.8, 1.7),
("3", "0:10β0:15", "π Channel logo appears center screen.\nSparkles burst all around.\nJingle sound effect.", 0.4, 4.05),
("4", "0:15β0:30", "π¦π§ Five kids run into the playground.\nAll wave toward the audience.\nπ΅ Background music begins!", 6.8, 4.05),
]
for (sn, ts, desc, x, y) in scenes_intro:
add_scene_card(slide, sn, ts, desc, x, y, w=6.0, h=2.05,
card_color=C["white"], text_color=C["dark_navy"], accent=C["teal"])
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 4 β RHYME 1: ANIMAL PARADE (0:30β3:00)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xFF, 0xF0))
add_rect(slide, 0, 0, 13.333, 0.18, C["grass_green"])
add_header_bar(slide, "π¦ RHYME 1 β Animal Parade", "Timestamp: 0:30 β 3:00",
C["grass_green"], C["white"], C["mint"])
scenes_r1 = [
("5","0:30β1:00","π¦ Leo the Lion dances!\n\"Roar Roar!\" speech bubble appears.\nMane bounces with the beat."),
("6","1:00β1:30","π Ellie the Elephant sprays water.\nRainbow forms in the mist.\nCrowd cheers!"),
("7","1:30β2:00","π΅ Momo swings on a vine.\nBananas fall and bounce.\nComical wobble animation."),
("8","2:00β2:30","π° Bella the Bunny hops along.\nColorful flowers bloom with each hop.\nBell sound effects."),
("9","2:30β2:45","π¦ Bluey the Bird soars high.\nButterflies trail behind.\nWhistling melody plays."),
("10","2:45β3:00","π ALL animals dance together!\nChildren clap along.\nConfetti burst β chorus repeats!"),
]
cols = 3
for i, (sn, ts, desc) in enumerate(scenes_r1):
col = i % cols
row = i // cols
x = 0.4 + col * 4.3
y = 1.7 + row * 2.4
add_scene_card(slide, sn, ts, desc, x, y, w=4.0, h=2.1,
card_color=RGBColor(0xFF,0xFF,0xEE), text_color=C["dark_navy"], accent=C["grass_green"])
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 5 β RHYME 2: ABC ADVENTURE (3:00β5:30)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xEE, 0xEE, 0xFF))
add_rect(slide, 0, 0, 13.333, 0.18, C["deep_blue"])
add_header_bar(slide, "π€ RHYME 2 β ABC Adventure", "Timestamp: 3:00 β 5:30 | Scene 11",
C["deep_blue"], C["white"], C["lavender"])
# Intro description card
add_rounded_rect(slide, 0.5, 1.65, 12.3, 1.0, C["deep_blue"])
add_text(slide, "Each letter transforms into a fun animated object with a bounce + sparkle transition.\nOne or two letters every 10β15 seconds β children say the letter aloud then see its object!",
0.7, 1.65, 12.0, 1.0, font_size=15, bold=False, color=C["white"])
# ABC grid
alphabet = [
("A","π Apple"),("B","β½ Ball"),("C","π± Cat"),("D","πΆ Dog"),("E","π Elephant"),
("F","πΈ Frog"),("G","π Grapes"),("H","π House"),("I","π¦ Ice Cream"),("J","π€Ή Juggler"),
("K","πͺ Kite"),("L","π¦ Lion"),("M","π Monkey"),("N","π Night"),("O","π Orange"),
("P","π§ Penguin"),("Q","πΈ Queen"),("R","π Rainbow"),("S","β Star"),("T","π― Tiger"),
("U","β Umbrella"),("V","π» Violin"),("W","π Wave"),("X","π Xylophone"),("Y","πͺ Yo-yo"),("Z","π¦ Zebra"),
]
cols = 9
letter_colors = [C["red"],C["warm_orange"],C["sunny_yellow"],C["grass_green"],C["teal"],
C["deep_blue"],C["purple"],C["hot_pink"],C["coral"]]
for i, (ltr, obj) in enumerate(alphabet):
c = i % cols
r = i // cols
x = 0.35 + c * 1.41
y = 2.85 + r * 1.55
bg = letter_colors[i % len(letter_colors)]
add_ellipse(slide, x, y, 1.1, 1.1, bg)
add_text(slide, ltr, x, y, 1.1, 0.55, font_size=32, bold=True, color=C["white"])
add_text(slide, obj, x-0.1, y+0.55, 1.3, 0.55, font_size=9, bold=True, color=C["dark_navy"],
align=PP_ALIGN.CENTER)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 6 β RHYME 3: NUMBERS SONG (5:30β8:00)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xF5, 0xEE))
add_rect(slide, 0, 0, 13.333, 0.18, C["warm_orange"])
add_header_bar(slide, "π’ RHYME 3 β Numbers Song", "Timestamp: 5:30 β 8:00 | Scenes 14β23",
C["warm_orange"], C["white"], RGBColor(0xFF,0xEB,0xD5))
add_rounded_rect(slide, 0.5, 1.65, 12.3, 0.75, C["warm_orange"])
add_text(slide, "Each number gets its own colorful animated sequence (β15 sec each). Cheerful narration counts aloud.",
0.7, 1.65, 12.0, 0.75, font_size=15, bold=False, color=C["white"])
numbers = [
("1","π One Balloon","red"),
("2","π¦π¦ Two Ducks","deep_blue"),
("3","βββ Three Stars","sunny_yellow"),
("4","πΈπΈπΈπΈ Four Flowers","hot_pink"),
("5","πππππ Five Bees","gold"),
("6","ππππππ Six Fish","teal"),
("7","π Seven Rainbow Colors","purple"),
("8","π¦π¦π¦π¦π¦π¦π¦π¦ Eight Butterflies","grass_green"),
("9","π Nine Sparkling Stars","coral"),
("10","π Ten Balloons Burst!","warm_orange"),
]
for i, (num, obj, col_key) in enumerate(numbers):
c = i % 5
r = i // 5
x = 0.4 + c * 2.55
y = 2.6 + r * 2.25
bg = C[col_key]
add_rounded_rect(slide, x, y, 2.3, 2.0, bg)
add_ellipse(slide, x+0.65, y+0.1, 1.0, 1.0, C["white"])
add_text(slide, num, x+0.65, y+0.12, 1.0, 0.9, font_size=38, bold=True, color=bg)
add_text(slide, obj, x+0.05, y+1.18, 2.2, 0.75, font_size=11, bold=True, color=C["white"],
align=PP_ALIGN.CENTER)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 7 β RHYME 4: COLORS SONG (8:00β10:30)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, C["white"])
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)
add_header_bar(slide, "π¨ RHYME 4 β Colors Song", "Timestamp: 8:00 β 10:30",
C["hot_pink"], C["white"], C["light_pink"])
colors_data = [
("RED", C["red"], "π Apple", "Bouncing apple rolls in with sparkles"),
("BLUE", C["deep_blue"], "π€ Sky", "Camera pans up to sunny blue sky"),
("GREEN", C["grass_green"], "π³ Tree", "Tree grows from seed in time-lapse"),
("YELLOW", C["sunny_yellow"], "βοΈ Sun", "Smiley Sun does a little wiggle dance"),
("PURPLE", C["purple"], "π¦ Butterfly", "Purple butterfly flutters across screen"),
("PINK", C["hot_pink"], "πΈ Flowers", "Pink flowers bloom with pop sound"),
("ORANGE", C["warm_orange"], "π Fish", "Orange fish blows bubbles in the sea"),
("RAINBOW","π", "Rainbow Ending", "All colors unite β mega rainbow finale!"),
]
for i, (col_name, col_rgb, obj, action) in enumerate(colors_data):
c = i % 4
r = i // 4
x = 0.35 + c * 3.2
y = 1.65 + r * 2.7
if col_name == "RAINBOW":
add_rounded_rect(slide, x, y, 2.9, 2.35, C["sky_blue"])
rainbow_stripe(slide, y, 0.22)
rainbow_stripe(slide, y+2.13, 0.22)
else:
add_rounded_rect(slide, x, y, 2.9, 2.35, col_rgb)
add_text(slide, obj, x+0.1, y+0.05, 2.7, 0.9, font_size=30, bold=False,
color=C["white"], align=PP_ALIGN.CENTER)
add_text(slide, col_name, x+0.1, y+0.88, 2.7, 0.65, font_size=22, bold=True,
color=C["white"], align=PP_ALIGN.CENTER)
add_text(slide, action, x+0.1, y+1.5, 2.7, 0.75, font_size=11, bold=False,
color=C["white"], align=PP_ALIGN.CENTER)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 8 β RHYME 5: SHAPES SONG (10:30β12:30)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF5, 0xF0, 0xFF))
add_rect(slide, 0, 0, 13.333, 0.18, C["purple"])
add_header_bar(slide, "π· RHYME 5 β Shapes Song", "Timestamp: 10:30 β 12:30",
C["purple"], C["white"], C["lavender"])
shapes_data = [
("β CIRCLE", "β π Ball", "Circle bounces and becomes a basketball"),
("β¬ SQUARE", "β π¦ Box", "Square folds into a colorful gift box"),
("πΊ TRIANGLE", "β π Mountain","Triangle stretches tall into a snowy peak"),
("β¬ RECTANGLE", "β πͺ Door", "Rectangle opens like a door β surprise inside!"),
("β€οΈ HEART", "β π Love", "Heart pulses and showers confetti"),
("β STAR", "β π Wish", "Star twinkles and flies across the sky"),
]
for i, (shp, obj, action) in enumerate(shapes_data):
c = i % 3
r = i // 3
x = 0.5 + c * 4.2
y = 1.7 + r * 2.6
bg_colors = [C["teal"], C["purple"], C["deep_blue"], C["grass_green"], C["coral"], C["hot_pink"]]
add_rounded_rect(slide, x, y, 3.8, 2.3, bg_colors[i])
# shape emoji big
add_text(slide, shp, x+0.1, y+0.05, 3.6, 1.0, font_size=32, bold=True,
color=C["white"], align=PP_ALIGN.CENTER)
# transform arrow
add_text(slide, obj, x+0.1, y+1.0, 3.6, 0.6, font_size=20, bold=True,
color=C["gold"], align=PP_ALIGN.CENTER)
add_text(slide, action, x+0.1, y+1.6, 3.6, 0.65, font_size=11, bold=False,
color=C["white"], align=PP_ALIGN.CENTER)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 9 β GRAND FINALE (12:30β15:00)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xFF, 0xCC))
rainbow_stripe(slide, 0, 0.22)
rainbow_stripe(slide, 7.28, 0.22)
add_header_bar(slide, "π GRAND FINALE", "Timestamp: 12:30 β 15:00",
C["coral"], C["white"], C["sunny_yellow"])
finale_scenes = [
("F1","12:30β13:15","π¦ππ΅π°π¦ All animals return to the stage.\nEveryone sings the mega chorus together.\nColorful spotlights sweep the scene."),
("F2","13:15β14:00","π¦π§ Children dance in a circle.\nπ Confetti rains from above.\nBalloons float upward β crowd cheer SFX!"),
("F3","14:00β14:30","π Giant rainbow spins slowly.\nCamera zooms out to full sky view.\nAll characters wave goodbye."),
("F4","14:30β15:00","π£ SUBSCRIBE animation bounces onto screen.\nβ \"Subscribe for More Rhymes!\"\nπ¨ Colorful bouncing text CTA.\n\"See you in the next adventure!\""),
]
for i, (sn, ts, desc) in enumerate(finale_scenes):
c = i % 2
r = i // 2
x = 0.5 + c * 6.4
y = 1.7 + r * 2.6
add_scene_card(slide, sn, ts, desc, x, y, w=6.0, h=2.35,
card_color=C["white"], text_color=C["dark_navy"], accent=C["coral"])
# Subscribe CTA highlight
add_rounded_rect(slide, 2.5, 6.65, 8.3, 0.7, C["red"])
add_text(slide, "β SUBSCRIBE FOR MORE RHYMES! | π¨ New episodes every week!",
2.6, 6.65, 8.1, 0.7, font_size=18, bold=True, color=C["white"])
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 10 β CHARACTERS & CAST
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFE, 0xF9, 0xE7))
rainbow_stripe(slide, 0, 0.18)
add_header_bar(slide, "π¨ Main Characters & Cast", "Animation Style Reference",
C["sunny_yellow"], C["dark_navy"], C["warm_orange"])
chars_full = [
("π¦","Tommy","Boy in Blue","Energetic leader, always first to dance","deep_blue"),
("π§","Lily","Girl in Pink","Sweet & curious, loves singing","hot_pink"),
("π¦","Leo","The Lion","Bold, roars on beat, fluffy mane","warm_orange"),
("π","Ellie","The Elephant","Gentle giant, water-spray specialist","teal"),
("π΅","Momo","The Monkey","Cheeky acrobat, loves bananas","grass_green"),
("π°","Bella","The Bunny","Hoppy & cheerful, flowers follow her","light_pink"),
("π¦","Bluey","The Bird","Sky dancer, butterflies follow","deep_blue"),
("βοΈ","Smiley","The Sun","Always smiling, lights up scenes","sunny_yellow"),
("π","Happy","The Rainbow","Grand finale host, spans the whole sky","purple"),
]
cols = 3
for i, (em, name, role, trait, col_key) in enumerate(chars_full):
c = i % cols
r = i // cols
x = 0.4 + c * 4.3
y = 1.65 + r * 1.9
add_rounded_rect(slide, x, y, 4.0, 1.75, C[col_key])
add_text(slide, em, x+0.05, y+0.1, 1.0, 1.4, font_size=40, bold=False,
color=C["white"], align=PP_ALIGN.CENTER)
add_text(slide, name, x+1.1, y+0.08, 2.8, 0.55, font_size=18, bold=True,
color=C["white"], align=PP_ALIGN.LEFT)
add_text(slide, role, x+1.1, y+0.6, 2.8, 0.45, font_size=13, bold=False,
color=C["gold"], align=PP_ALIGN.LEFT, italic=True)
add_text(slide, trait, x+1.1, y+1.05, 2.8, 0.6, font_size=12, bold=False,
color=C["white"], align=PP_ALIGN.LEFT)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 11 β MUSIC & ANIMATION SPEC
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xF0, 0xFF, 0xF4))
add_rect(slide, 0, 0, 13.333, 0.18, C["grass_green"])
add_header_bar(slide, "π΅ Music & Animation Production Specs", "Technical Reference for the Animation Team",
C["dark_green"], C["white"], C["mint"])
# Music column
add_rounded_rect(slide, 0.5, 1.6, 5.9, 5.6, C["deep_blue"])
add_text(slide, "π΅ MUSIC SPEC", 0.6, 1.65, 5.7, 0.55, font_size=20, bold=True,
color=C["gold"])
music_lines = [
"Tempo: 120β130 BPM",
"Key Instruments:",
" πΈ Ukulele (main melody)",
" π Xylophone (accent notes)",
" π Bells (magical moments)",
" π Hand Claps (rhythm)",
" π΅ Whistles (bird sections)",
"Vocals:",
" πΆ Children's Choir β chorus",
" π’ Lead narrator β counting/letters",
"Sound FX:",
" π¦ Bird chirps | π«§ Bubbles",
" π Laughter | π Confetti pop",
" π§ Water splash | β Sparkle tinkle",
]
for i, line in enumerate(music_lines):
add_text(slide, line, 0.65, 2.25 + i*0.29, 5.6, 0.3,
font_size=12, bold=(":" in line and not line.startswith(" ")),
color=C["white"], align=PP_ALIGN.LEFT)
# Animation column
add_rounded_rect(slide, 6.9, 1.6, 5.9, 5.6, C["purple"])
add_text(slide, "π¬ ANIMATION SPEC", 7.0, 1.65, 5.7, 0.55, font_size=20, bold=True,
color=C["gold"])
anim_lines = [
"Style: Bright 3D Cartoon",
"Character Design:",
" π Big expressive eyes",
" π Happy facial expressions",
" π¨ Rainbow color palette",
"Camera:",
" πΉ Gentle smooth movement",
" π Zoom out for finales",
" π Pan for parade scenes",
"Scene Pacing:",
" β± Change every 5β8 seconds",
" β¨ Floating stars & sparkles",
" π«§ Bubbles in background",
" π Simple copy-able dance moves",
" π΅ Repeat catchy choruses",
]
for i, line in enumerate(anim_lines):
add_text(slide, line, 7.05, 2.25 + i*0.29, 5.6, 0.3,
font_size=12, bold=(":" in line and not line.startswith(" ")),
color=C["white"], align=PP_ALIGN.LEFT)
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SLIDE 12 β VIRAL RETENTION TIPS
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
slide = prs.slides.add_slide(blank_layout)
add_bg(slide, RGBColor(0xFF, 0xF0, 0xFA))
rainbow_stripe(slide, 0, 0.18)
add_header_bar(slide, "π Viral Retention Strategy", "5 Key Techniques to Maximise Watch Time",
C["coral"], C["white"], C["light_pink"])
tips = [
("π¬","Scene Changes Every 5β8 Seconds",
"Short scene cuts keep toddlers' attention locked in. Never let a single shot last beyond 8 seconds without motion change.",
C["red"]),
("π","Bright Colors & Exaggerated Expressions",
"High-saturation visuals and over-the-top emoji-style reactions trigger dopamine responses in young viewers.",
C["warm_orange"]),
("β¨","Floating Stars, Bubbles & Sparkles",
"Persistent ambient particle effects (15β20% screen coverage) maintain visual excitement between action beats.",
C["purple"]),
("π","Simple Copy-able Dance Moves",
"Design 2β3 repeating moves children can physically mirror. Physical engagement dramatically increases retention.",
C["grass_green"]),
("π΅","Repeat Catchy Choruses",
"Repeat each rhyme's chorus at least 3Γ per segment. Familiarity = comfort = rewatch behavior in 2β5 year olds.",
C["deep_blue"]),
]
for i, (icon, title, body, bg) in enumerate(tips):
y = 1.65 + i * 1.07
add_rounded_rect(slide, 0.5, y, 12.3, 0.95, bg)
add_ellipse(slide, 0.55, y+0.1, 0.75, 0.75, C["white"])
add_text(slide, icon, 0.55, y+0.1, 0.75, 0.75, font_size=26, bold=False,
color=bg, align=PP_ALIGN.CENTER)
add_text(slide, title, 1.45, y+0.05, 5.5, 0.5, font_size=16, bold=True,
color=C["white"], align=PP_ALIGN.LEFT)
add_text(slide, body, 1.45, y+0.48, 11.1, 0.45, font_size=12, bold=False,
color=C["white"], align=PP_ALIGN.LEFT)
# end tease
add_rounded_rect(slide, 2.0, 7.0, 9.3, 0.42, C["coral"])
add_text(slide, "π¬ End with: \"See you in the next adventure!\" β teaser clip of the next video plays",
2.1, 7.0, 9.1, 0.42, font_size=14, bold=True, color=C["white"])
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SAVE
# βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
output = "/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx"
prs.save(output)
print(f"Saved to: {output}")
cd /tmp/workspace/happy-animal-adventure && python build_pptx.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip()[:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f' Slide {i}: {texts[0] if texts else \"(no text)\"}') import os size = os.path.getsize('/tmp/workspace/happy-animal-adventure/Happy_Animal_Adventure_Storyboard.pptx') print(f'File size: {size/1024:.1f} KB') "
Happy Animal Adventure Storyboard
Presentation Β· PPTX
| Slide | Content |
|---|---|
| 1 - Cover | Full title card with all 9 characters displayed, music & style tags, rainbow stripes |
| 2 - Table of Contents | Color-coded section overview with timestamps for all 7 segments |
| 3 - INTRO (0:00β0:30) | 4 scene cards β Rainbow, Sun/Clouds, Logo, Kids entering playground |
| 4 - Rhyme 1: Animal Parade (0:30β3:00) | 6 scene cards β Leo, Ellie, Momo, Bella, Bluey, All Dance |
| 5 - Rhyme 2: ABC Adventure (3:00β5:30) | Full AβZ grid with emoji object for every letter (A=Apple β Z=Zebra) |
| 6 - Rhyme 3: Numbers Song (5:30β8:00) | 10 number cards (1 Balloon β 10 Balloons Burst) with color blocks |
| 7 - Rhyme 4: Colors Song (8:00β10:30) | 8 color panels β Red/Blue/Green/Yellow/Purple/Pink/Orange/Rainbow ending |
| 8 - Rhyme 5: Shapes Song (10:30β12:30) | 6 shape cards with transform arrows (CircleβBall, TriangleβMountain, etc.) |
| 9 - Grand Finale (12:30β15:00) | 4 finale scenes + big red "Subscribe for More Rhymes!" CTA bar |
| 10 - Characters & Cast | 9 character cards (Tommy, Lily, Leo, Ellie, Momo, Bella, Bluey, Sun, Rainbow) with roles & traits |
| 11 - Music & Animation Spec | Two-column reference β music instruments/BPM/SFX + animation style/camera/pacing |
| 12 - Viral Retention Tips | 5 illustrated strategy cards with explanations for watch-time maximization |
Can u give it
Happy Animal Adventure Storyboard
Presentation Β· PPTX
I'm asking you a full video