Codex commited on
Commit
67c02d3
Β·
1 Parent(s): d61efd6

Improve story, narration, and illustration prompts

Browse files
Files changed (2) hide show
  1. app.py +176 -77
  2. config.py +19 -13
app.py CHANGED
@@ -57,8 +57,8 @@ _STORY_MODEL = None
57
  _STORY_TOKENIZER = None
58
  _TTS_MODEL = None
59
  _LOAD_ERRORS = {}
60
-
61
-
62
  def load_flux():
63
  """FLUX image pipeline placed on cuda at module scope (the ZeroGPU pattern).
64
  No enable_model_cpu_offload() β€” that fights ZeroGPU's device management."""
@@ -108,21 +108,26 @@ if ON_ZEROGPU:
108
  _LOAD_ERRORS[_name] = repr(_e)
109
  logger.exception(f"Module-level load failed for {_name}")
110
 
111
- COLOR_ART_STYLE = (
112
- "hand-drawn crayon children's storybook illustration, soft waxy crayon "
113
- "texture and visible crayon strokes, warm colorful crayon shading, "
114
- "simple friendly shapes, looks drawn by hand with crayons"
115
- )
116
- COLOR_PAGE_SUFFIX = "full colorful background scene, the character clearly visible."
117
- LINE_ART_STYLE = (
118
- "children's coloring book page, pure black ink outlines on pure white paper, "
119
- "clean contour lines, no color, no gray, no shading, no texture, "
120
- "no hatching, no pencil marks, open spaces to color"
121
- )
122
- LINE_ART_SUFFIX = (
123
- "simple clean background shapes, same composition, thick readable outlines, "
124
- "no filled black areas, no extra sketch marks."
125
- )
 
 
 
 
 
126
 
127
  import random as _random
128
 
@@ -390,53 +395,131 @@ THEME_TEMPLATES = {
390
  ],
391
  }
392
 
393
- FEW_SHOT_EXEMPLAR = """
394
- Write a 6-page children's storybook for age 5 about Finn the red fox with theme: overcoming a fear.
395
-
396
- Rules:
397
- - Finn must appear by name in EVERY page text.
398
- - No new characters introduced after page 3.
399
- - Each page is 2–3 sentences β€” vivid, warm, and emotionally engaging.
400
- - Use sensory details: colours, sounds, textures, and feelings.
401
- - Pages 1–2 introduce the character and problem. Pages 3–4 build the challenge. Pages 5–6 resolve and teach.
402
- - Page 6 ends with a warm lesson Finn has learned and a feeling of pride.
403
- - The scene describes only what can be drawn in one illustration.
404
- - Return ONLY valid JSON (no extra text).
405
-
406
- {
407
- "title": "Finn and the Thunderstorm",
408
- "character_description": "A small red fox named Finn with big amber eyes, white-tipped ears, and a fluffy striped tail",
409
- "pages": [
410
- {"page": 1, "text": "Finn the red fox loved sunny mornings more than anything in the world, but the very first rumble of thunder made Finn's whole body tremble. Whenever dark clouds rolled in, Finn would crawl under the sofa and squeeze both eyes tightly shut. Finn wanted to be brave β€” but brave seemed like something meant for bigger foxes.", "scene": "Finn the red fox curled tightly under a blue sofa, eyes shut, while dark storm clouds fill the window behind the curtains"},
411
- {"page": 2, "text": "One stormy afternoon, thunder shook the whole cottage and rattled the teacups on the shelf. Finn buried deep under the blankets, heart going thump-thump-thump. Grandma Fox came quietly and sat on the edge of the bed without saying a word.", "scene": "Finn the red fox burrowed under a patchwork blanket on a bed, Grandma Fox sitting calmly beside in warm lamplight"},
412
- {"page": 3, "text": "Grandma Fox leaned in close and whispered a secret into Finn's ear. 'Thunder is just two clouds bumping into each other and saying sorry,' she said softly. Finn's ears perked up, and one eye opened just a little.", "scene": "Grandma Fox leaning close to whisper to Finn the red fox peeking out from under the blanket"},
413
- {"page": 4, "text": "Finn closed both eyes again and tried very hard to imagine it β€” two big fluffy clouds bumping heads and making an oops face. A tiny giggle bubbled up before Finn could stop it. The next rumble came, and this time it sounded almost funny instead of frightening.", "scene": "Finn the red fox grinning with closed eyes, imagining two round cartoon clouds bumping together with surprised faces"},
414
- {"page": 5, "text": "The next crack of thunder boomed across the sky β€” and Finn laughed out loud. Grandma Fox laughed too, and together they ran to the window to watch the lightning flash and dance. The storm looked completely different now, like a wild and wonderful show put on just for them.", "scene": "Finn the red fox and Grandma Fox laughing at a rain-streaked window as bright lightning flashes outside in the dark sky"},
415
- {"page": 6, "text": "When the storm finally passed, Finn stood in the doorway and breathed in the clean, rain-washed air. Grandma Fox held Finn's paw quietly β€” some lessons don't need extra words. Finn had learned that understanding why something happens is the very first step to not being afraid of it anymore.", "scene": "Finn the red fox and Grandma Fox standing in the open doorway watching a golden rainbow stretch across the sky after the storm"}
416
- ]
417
- }
418
- """
419
-
420
-
421
- def build_story_prompt(hero_name: str, theme: str, age: int,
422
- num_pages: int = 6) -> str:
423
- mid = num_pages - 2
424
- return f"""{FEW_SHOT_EXEMPLAR}
425
-
426
- Write a {num_pages}-page children's storybook for age {age} about {hero_name} with theme: {theme}.
427
-
428
- Rules:
429
- - {hero_name} must appear by name in EVERY page text. Every single page.
430
- - Keep all characters consistent β€” do NOT introduce new characters after page 3.
431
- - Each page: 2–3 vivid, emotionally warm sentences a {age}-year-old can follow and feel.
432
- - Use sensory details β€” colours, sounds, textures, feelings β€” to bring each moment alive.
433
- - The story is ONE continuous narrative: each page flows naturally from the one before it. Page N+1 begins where page N ended.
434
- - Pages 1–2 introduce {hero_name} and the problem clearly. Pages 3–{mid} build the challenge step by step. Pages {mid+1}–{num_pages} resolve it and teach a lesson.
435
- - Page {num_pages} must end with a clear, warm moral using "{hero_name} had learned" or "{hero_name} now understood" or "{hero_name} discovered that". Include a feeling of pride or joy.
436
- - Give {hero_name} ONE distinctive physical detail on page 1 and refer to it at least once more later.
437
- - Scene describes exactly what would appear in ONE simple illustration β€” one moment, one setting, one emotion.
438
- - Return ONLY valid JSON (no explanation, no markdown fences):
439
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
440
 
441
 
442
  def _validate_story_structure(story: dict) -> bool:
@@ -619,7 +702,7 @@ def generate_story_gpu(hero_name: str, theme: str, age: int = 5,
619
 
620
 
621
  @spaces.GPU(duration=200)
622
- def generate_images_gpu(
623
  character_desc: str,
624
  scenes: list,
625
  doodle_bytes: bytes = None,
@@ -637,11 +720,16 @@ def generate_images_gpu(
637
  if doodle_bytes:
638
  try:
639
  ref = Image.open(io.BytesIO(doodle_bytes)).convert("RGB")
640
- canonical = pipe(
641
- prompt=(f"Turn this child's drawing into a clean, friendly, full-body cartoon "
642
- f"character for a children's storybook. Keep the EXACT same creature, "
643
- f"face, and features as the drawing. {COLOR_ART_STYLE}, "
644
- f"plain white background, full character visible, centered."),
 
 
 
 
 
645
  image=ref, height=768, width=768, guidance_scale=guidance,
646
  num_inference_steps=num_steps,
647
  generator=torch.Generator("cuda").manual_seed(seed),
@@ -653,12 +741,20 @@ def generate_images_gpu(
653
 
654
  images = []
655
  for i, scene in enumerate(scenes):
656
- if canonical is not None:
657
- prompt = f"The same character. {scene}. {COLOR_ART_STYLE}, {COLOR_PAGE_SUFFIX}"
658
- kw = dict(image=canonical, prompt=prompt)
659
- else:
660
- prompt = (f"{character_desc}. Scene: {scene}. {COLOR_ART_STYLE}, "
661
- f"white background, centered, full character visible")
 
 
 
 
 
 
 
 
662
  kw = dict(prompt=prompt)
663
  kw.update(height=768, width=768, guidance_scale=guidance,
664
  num_inference_steps=num_steps,
@@ -677,7 +773,10 @@ def generate_coloring_images_gpu(color_pngs: list, seed: int = 7) -> list:
677
  from PIL import Image
678
 
679
  pipe = load_flux()
680
- prompt = f"{LINE_ART_STYLE}, {LINE_ART_SUFFIX}"
 
 
 
681
  outs = []
682
  for i, png in enumerate(color_pngs):
683
  ref = Image.open(io.BytesIO(png)).convert("RGB")
 
57
  _STORY_TOKENIZER = None
58
  _TTS_MODEL = None
59
  _LOAD_ERRORS = {}
60
+
61
+
62
  def load_flux():
63
  """FLUX image pipeline placed on cuda at module scope (the ZeroGPU pattern).
64
  No enable_model_cpu_offload() β€” that fights ZeroGPU's device management."""
 
108
  _LOAD_ERRORS[_name] = repr(_e)
109
  logger.exception(f"Module-level load failed for {_name}")
110
 
111
+ COLOR_ART_STYLE = (
112
+ "joyful hand-drawn crayon children's picture-book illustration for age 5, "
113
+ "soft waxy texture, visible crayon strokes, warm harmonious colors, simple "
114
+ "friendly shapes, expressive faces, gentle lighting, and a clear emotional focus"
115
+ )
116
+ COLOR_PAGE_SUFFIX = (
117
+ "one readable story moment, full colorful background, child-safe imagery, "
118
+ "the hero clearly visible, no written words, no captions, no speech bubbles, "
119
+ "no borders, no collage, no duplicate character"
120
+ )
121
+ LINE_ART_STYLE = (
122
+ "printable children's coloring-book illustration for age 5, pure black ink "
123
+ "outlines on pure white paper, bold smooth contours, friendly simple shapes, "
124
+ "large open spaces that are easy for small hands to color"
125
+ )
126
+ LINE_ART_SUFFIX = (
127
+ "preserve the exact characters, action, emotion, and composition of the reference; "
128
+ "simplify only tiny details; no color, gray, shading, texture, hatching, filled black "
129
+ "areas, text, border, or extra sketch marks"
130
+ )
131
 
132
  import random as _random
133
 
 
395
  ],
396
  }
397
 
398
+ THEME_STORY_GUIDANCE = {
399
+ "brave adventure": (
400
+ "Give the hero a clear, child-sized goal and a moment of real uncertainty. "
401
+ "Show that courage means taking a helpful next step even while feeling nervous."
402
+ ),
403
+ "making a new friend": (
404
+ "Begin with shyness, loneliness, or a misunderstanding. Let friendship grow through "
405
+ "listening, sharing, play, or one sincere hello; never make popularity the reward."
406
+ ),
407
+ "overcoming a fear": (
408
+ "Treat the fear with respect and never shame the hero. Let the hero use support, "
409
+ "understanding, breathing, practice, or one small step; courage may coexist with fear."
410
+ ),
411
+ "helping someone": (
412
+ "Give the other character a specific need and let the hero notice, ask, and help. "
413
+ "Show cooperation and dignity rather than making the hero a flawless rescuer."
414
+ ),
415
+ "lost and found": (
416
+ "Build a gentle mystery with useful clues and safe choices. What the hero learns or "
417
+ "who they connect with should matter at least as much as recovering the lost object."
418
+ ),
419
+ "learning something new": (
420
+ "Show an imperfect first try, useful guidance, practice, and visible improvement. "
421
+ "Celebrate effort and curiosity rather than instant talent or perfection."
422
+ ),
423
+ "kindness to animals": (
424
+ "Show calm, gentle, age-appropriate care and respect for the animal's needs. "
425
+ "Do not encourage touching wild or injured animals without a trusted grown-up."
426
+ ),
427
+ "the magic of imagination": (
428
+ "Let ordinary materials or places become wondrous through play. Keep the imaginative "
429
+ "rules consistent and end with creativity remaining available to the hero."
430
+ ),
431
+ "celebrating who you are": (
432
+ "Give the hero a distinctive quality that first feels difficult and later proves "
433
+ "meaningful. The lesson is self-acceptance, not superiority over other children."
434
+ ),
435
+ "a rainy day adventure": (
436
+ "Turn rain into a source of discovery, play, or coziness. Include vivid rainy-day "
437
+ "sounds and textures while keeping outdoor choices safe and supervised."
438
+ ),
439
+ }
440
+
441
+ FEW_SHOT_EXEMPLAR = """
442
+ QUALITY EXAMPLE β€” imitate its warmth, continuity, and meaning, not its exact plot:
443
+ {
444
+ "title": "Finn and the Rumbly Sky",
445
+ "character_description": "Finn, a small fluffy red fox with bright amber eyes, white-tipped ears, and a bushy tail with a snowy tip",
446
+ "pages": [
447
+ {"page": 1, "text": "Finn loved rain that went tip-tap on the window, but thunder made his white-tipped ears flatten. BOOM! Finn scooted beneath Grandma's patchwork quilt and whispered, \"I wish the sky were quieter.\" ", "scene": "Finn, a small red fox with white-tipped ears, peeking from beneath a colorful patchwork quilt in a cozy bedroom while rain taps the window; worried but safe"},
448
+ {"page": 2, "text": "Grandma sat beside Finn and listened until the room felt warm again. Together they breathed in slowly and blew out as if cooling a giant mug of cocoa, while the rain went hush-shush against the glass.", "scene": "Finn and Grandma Fox sitting together on the bed, slowly breathing in warm lamplight as rain trails down the window; calm and connected"},
449
+ {"page": 3, "text": "When the next rumble rolled across the roof, Finn still felt a wobble in his tummy, but he did not hide his eyes. \"Can we count between the flash and the sound?\" Finn asked, and Grandma smiled.", "scene": "Finn holding Grandma's paw and watching a soft lightning flash through the bedroom window; curious despite feeling nervous"},
450
+ {"page": 4, "text": "FLASH! One, two, three... rrrrumble. Each time they counted, Finn imagined the storm marching farther away in enormous squishy boots, and a small giggle escaped his snout.", "scene": "Finn counting on his paws beside Grandma while imagining a friendly storm wearing enormous squishy boots; playful wonder"},
451
+ {"page": 5, "text": "Soon Finn was brave enough to leave the quilt and watch silver raindrops race down the window. He cheered for the tiniest drop, and Grandma cheered too, until it wriggled all the way to the sill.", "scene": "Finn and Grandma Fox at the rain-streaked window cheering for racing raindrops; Finn's snowy-tipped tail lifted with delight"},
452
+ {"page": 6, "text": "By bedtime, the thunder had softened to a faraway purr, and Finn felt proud of every small step he had taken. Finn had learned that being brave did not mean never feeling afraid; it meant finding a safe way forward, one breath at a time.", "scene": "Finn tucked comfortably into bed beside Grandma as the storm clears and moonlight enters the cozy room; peaceful and proud"}
453
+ ]
454
+ }
455
+ """
456
+
457
+ def build_story_prompt(hero_name: str, theme: str, age: int,
458
+ num_pages: int = 6) -> str:
459
+ theme_guidance = THEME_STORY_GUIDANCE.get(
460
+ theme,
461
+ "Build a playful, emotionally meaningful adventure with a clear child-friendly lesson.",
462
+ )
463
+ return f"""{FEW_SHOT_EXEMPLAR}
464
+
465
+ TASK
466
+ Write an original {num_pages}-page picture-book story for a {age}-year-old.
467
+ Hero: {hero_name}
468
+ Selected theme: {theme}
469
+ Theme meaning: {theme_guidance}
470
+
471
+ STORY QUALITY
472
+ - Tell one complete, easy-to-follow story with a beginning, a growing problem, a turning
473
+ point created by the hero's choices, and a satisfying resolution.
474
+ - Give {hero_name} a clear desire, believable feelings, and meaningful actions. Do not let
475
+ luck or a new character solve the central problem for the hero.
476
+ - Keep {hero_name} present and active on every page so the selected hero remains the clear
477
+ center of both the story and its illustrations.
478
+ - Keep the stakes safe and understandable for age {age}. No cruelty, humiliation, horror,
479
+ weapons, serious injury, dangerous imitation, or a frightening unresolved ending.
480
+ - Use warm, natural read-aloud language: concrete words, varied sentence rhythm, playful
481
+ repetition, gentle humor, and vivid but uncluttered sensory details.
482
+ - Sound effects are welcome when the action earns them: BOOM!, WHOOSH!, SPLASH!, TAP-TAP!,
483
+ POP!, or another fitting sound. Use them for fun and rhythm, not in every paragraph.
484
+ - Include two or more short lines of natural dialogue across the story. Let characters
485
+ listen and respond instead of using dialogue only to explain the lesson.
486
+ - Use 2–3 substantial sentences on each page. Keep each page focused on one story beat and
487
+ make the final sentence invite the next page without repeating the previous page.
488
+ - Keep the cast small and consistent. Introduce every important character by page 2.
489
+ - Give {hero_name} 2–3 memorable visual traits in character_description and keep those
490
+ exact traits visible in relevant scene descriptions.
491
+ - End through action and feeling first, then express one simple, positive lesson naturally.
492
+ The lesson must match the selected theme and what {hero_name} actually did.
493
+
494
+ PAGE ARC
495
+ - Page 1: Introduce {hero_name}, the setting, what the hero wants, and the gentle problem.
496
+ - Page 2: Make the problem clearer and let the hero react or make a first attempt.
497
+ - Page 3: Let that attempt become difficult, surprising, or unsuccessful without becoming scary.
498
+ - Page 4: Give {hero_name} a useful realization, choice, or supported second attempt.
499
+ - Page 5: Show the hero actively applying it and changing the situation.
500
+ - Page {num_pages}: Deliver the emotional payoff, show the result, and close with warmth.
501
+
502
+ ILLUSTRATION SCENES
503
+ - Each scene must be a self-contained visual prompt for exactly one illustration: name the
504
+ visible characters, their consistent traits, action, setting, important props, lighting,
505
+ color mood, and main emotion.
506
+ - Include {hero_name} in every scene and make the visible action accurately match that page's
507
+ story text; do not invent an unrelated pose or event just because it is easier to draw.
508
+ - Depict only what is physically visible in that single moment. No abstract morals, multiple
509
+ locations, before-and-after sequences, written words, captions, or camera terminology.
510
+ - Make consecutive scenes visually varied while preserving character and prop continuity.
511
+
512
+ OUTPUT
513
+ Return only valid JSON with exactly this shape and exactly {num_pages} page objects:
514
+ {{
515
+ "title": "short inviting title",
516
+ "character_description": "one consistent visual description of {hero_name}",
517
+ "pages": [
518
+ {{"page": 1, "text": "story text", "scene": "single illustration description"}}
519
+ ]
520
+ }}
521
+ Do not include markdown, notes, or text outside the JSON.
522
+ """
523
 
524
 
525
  def _validate_story_structure(story: dict) -> bool:
 
702
 
703
 
704
  @spaces.GPU(duration=200)
705
+ def generate_images_gpu(
706
  character_desc: str,
707
  scenes: list,
708
  doodle_bytes: bytes = None,
 
720
  if doodle_bytes:
721
  try:
722
  ref = Image.open(io.BytesIO(doodle_bytes)).convert("RGB")
723
+ canonical = pipe(
724
+ prompt=(
725
+ "Create the canonical hero design for a children's picture book from this "
726
+ "child's drawing. Faithfully preserve the drawing's creature or person type, "
727
+ "face, body shape, colors, markings, clothing, accessories, and charming "
728
+ "handmade personality. Clarify unclear lines without replacing or beautifying "
729
+ "the child's idea. Show one friendly full-body character in a neutral standing "
730
+ f"pose, centered on plain warm-white paper. {COLOR_ART_STYLE}. No scenery, "
731
+ "props, text, border, extra limbs, extra characters, or duplicate views."
732
+ ),
733
  image=ref, height=768, width=768, guidance_scale=guidance,
734
  num_inference_steps=num_steps,
735
  generator=torch.Generator("cuda").manual_seed(seed),
 
741
 
742
  images = []
743
  for i, scene in enumerate(scenes):
744
+ if canonical is not None:
745
+ prompt = (
746
+ "Illustrate this page using the reference image as the exact canonical hero. "
747
+ "Preserve the same face, species, body proportions, colors, markings, clothing, "
748
+ f"and accessories on every page. Story moment: {scene}. {COLOR_ART_STYLE}. "
749
+ f"{COLOR_PAGE_SUFFIX}."
750
+ )
751
+ kw = dict(image=canonical, prompt=prompt)
752
+ else:
753
+ prompt = (
754
+ f"Canonical hero design: {character_desc}. Illustrate this single story moment: "
755
+ f"{scene}. Keep every named character visually consistent with the canonical "
756
+ f"description. {COLOR_ART_STYLE}. {COLOR_PAGE_SUFFIX}."
757
+ )
758
  kw = dict(prompt=prompt)
759
  kw.update(height=768, width=768, guidance_scale=guidance,
760
  num_inference_steps=num_steps,
 
773
  from PIL import Image
774
 
775
  pipe = load_flux()
776
+ prompt = (
777
+ f"Redraw the supplied finished storybook page as matching line art. {LINE_ART_STYLE}. "
778
+ f"{LINE_ART_SUFFIX}."
779
+ )
780
  outs = []
781
  for i, png in enumerate(color_pngs):
782
  ref = Image.open(io.BytesIO(png)).convert("RGB")
config.py CHANGED
@@ -134,34 +134,40 @@ TTS_MODEL = ModelConfig(
134
  VOICE_PRESETS: Dict[str, Dict[str, str]] = {
135
  "kid": {
136
  "label": "πŸ§’ Little kid",
137
- "design": "(A sweet little girl around seven years old telling a story to "
138
- "her friends, bright high-pitched cheerful child's voice, playful, "
139
- "giggly and full of wonder)",
 
140
  },
141
  "big_kid": {
142
  "label": "πŸŽ’ Big kid",
143
- "design": "(A lively young girl about eleven years old reading a fun story "
144
- "aloud, bright youthful energetic voice, expressive and excited)",
 
145
  },
146
  "playful": {
147
  "label": "✨ Playful",
148
- "design": "(A cheerful, friendly young woman telling a fun children's story, "
149
- "bright, animated, smiling, expressive)",
 
150
  },
151
  "storyteller": {
152
  "label": "πŸŒ™ Storyteller",
153
- "design": "(A warm, gentle female storyteller reading a bedtime story to a "
154
- "young child, soft, soothing, slow and expressive, kind and cozy)",
 
155
  },
156
  "grandpa": {
157
  "label": "πŸ‘΄ Grandpa",
158
- "design": "(A kind, gentle old grandfather telling a cozy bedtime story, "
159
- "warm, slow, soothing)",
 
160
  },
161
  "my_voice": {
162
  "label": "πŸŽ™οΈ My Voice",
163
- "design": "(warm, gentle, natural storytelling voice, reading clearly to a child, "
164
- "friendly and expressive)",
 
165
  },
166
  }
167
 
 
134
  VOICE_PRESETS: Dict[str, Dict[str, str]] = {
135
  "kid": {
136
  "label": "πŸ§’ Little kid",
137
+ "design": "(A sweet seven-year-old child joyfully reading a picture book to friends; "
138
+ "bright, clear, playful, and full of wonder; natural phrasing; gentle changes "
139
+ "of expression for dialogue; sound effects spoken with delighted energy, "
140
+ "never shouted harshly)",
141
  },
142
  "big_kid": {
143
  "label": "πŸŽ’ Big kid",
144
+ "design": "(A lively eleven-year-old reading a favorite children's story aloud; "
145
+ "youthful, confident, energetic, and expressive; clear pacing; distinct but "
146
+ "natural character dialogue; playful emphasis on sound effects)",
147
  },
148
  "playful": {
149
  "label": "✨ Playful",
150
+ "design": "(A cheerful young adult performing a joyful children's picture book; warm, "
151
+ "animated, smiling, and expressive; varied rhythm and light comic timing; "
152
+ "gentle character voices; lively but child-friendly sound effects)",
153
  },
154
  "storyteller": {
155
  "label": "πŸŒ™ Storyteller",
156
+ "design": "(A warm, gentle adult storyteller reading a bedtime picture book to a young "
157
+ "child; soft, soothing, unhurried, kind, and cozy; meaningful pauses; tender "
158
+ "dialogue; sound effects softened enough to remain calming)",
159
  },
160
  "grandpa": {
161
  "label": "πŸ‘΄ Grandpa",
162
+ "design": "(A kind older grandfather telling a cozy story to a child; warm, patient, "
163
+ "slightly slow, reassuring, and quietly expressive; friendly dialogue; "
164
+ "playful sound effects delivered with a soft chuckle)",
165
  },
166
  "my_voice": {
167
  "label": "πŸŽ™οΈ My Voice",
168
+ "design": "(Preserve the reference speaker's identity while narrating clearly to a "
169
+ "young child; warm, natural, friendly, and expressive; use comfortable pacing, "
170
+ "gentle dialogue changes, and playful but controlled sound effects)",
171
  },
172
  }
173