Codex commited on
Commit Β·
67c02d3
1
Parent(s): d61efd6
Improve story, narration, and illustration prompts
Browse files
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
|
| 113 |
-
"
|
| 114 |
-
"
|
| 115 |
-
)
|
| 116 |
-
COLOR_PAGE_SUFFIX =
|
| 117 |
-
|
| 118 |
-
"
|
| 119 |
-
"
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
"
|
| 124 |
-
"
|
| 125 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
import random as _random
|
| 128 |
|
|
@@ -390,53 +395,131 @@ THEME_TEMPLATES = {
|
|
| 390 |
],
|
| 391 |
}
|
| 392 |
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
""
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
|
| 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=(
|
| 642 |
-
|
| 643 |
-
|
| 644 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 =
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 =
|
|
|
|
|
|
|
|
|
|
| 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
|
| 138 |
-
"
|
| 139 |
-
"
|
|
|
|
| 140 |
},
|
| 141 |
"big_kid": {
|
| 142 |
"label": "π Big kid",
|
| 143 |
-
"design": "(A lively
|
| 144 |
-
"
|
|
|
|
| 145 |
},
|
| 146 |
"playful": {
|
| 147 |
"label": "β¨ Playful",
|
| 148 |
-
"design": "(A cheerful
|
| 149 |
-
"
|
|
|
|
| 150 |
},
|
| 151 |
"storyteller": {
|
| 152 |
"label": "π Storyteller",
|
| 153 |
-
"design": "(A warm, gentle
|
| 154 |
-
"
|
|
|
|
| 155 |
},
|
| 156 |
"grandpa": {
|
| 157 |
"label": "π΄ Grandpa",
|
| 158 |
-
"design": "(A kind
|
| 159 |
-
"
|
|
|
|
| 160 |
},
|
| 161 |
"my_voice": {
|
| 162 |
"label": "ποΈ My Voice",
|
| 163 |
-
"design": "(
|
| 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 |
|