| """Deterministic, genre-distinct fixtures used as the live (CPU) writer. |
| |
| The hosted Space can't run the 4B Nemotron writer, so this fixture *is* what |
| listeners hear. To keep broadcasts from all sounding the same, each genre has |
| its own cast (different Kokoro voices), opening, dialogue, SFX, and music — plus |
| a per-premise variant so reruns within a genre still vary. It stays fully |
| deterministic (same premise + genre -> same script). |
| """ |
|
|
| from __future__ import annotations |
|
|
| from .schema import CastMember, Delivery, Genre, Line, MusicPlan, Scene, Script, VoiceID |
|
|
|
|
| def fixture_script(premise: str, genre: Genre = Genre.WEIRD) -> Script: |
| genre = Genre(genre) |
| clean_premise = " ".join(premise.strip().split())[:300] or "a signal with no sender" |
| title = _title_from_premise(clean_premise) |
| variant = _variant(clean_premise) |
| cast, scenes, music, seconds = _GENRE_BUILDERS[genre](clean_premise, title, variant) |
| script = Script( |
| title=title, |
| logline=_LOGLINES[genre].format(premise=clean_premise), |
| genre=genre, |
| cast=cast, |
| scenes=scenes, |
| music=music, |
| estimated_seconds=seconds, |
| ) |
| script.validate() |
| return script |
|
|
|
|
| def _variant(premise: str, choices: int = 2) -> int: |
| """Stable (unsalted) premise hash so a premise always picks the same line.""" |
| return sum(ord(ch) for ch in premise) % choices |
|
|
|
|
| def _title_from_premise(premise: str) -> str: |
| words = [word.strip(".,:;!?").title() for word in premise.split() if word.strip()] |
| core = " ".join(words[:6]) or "The Signal" |
| return f"The Case of {core}" |
|
|
|
|
| def _member(id: str, name: str, voice: VoiceID, description: str) -> CastMember: |
| return CastMember(id=id, name=name, voice=voice, description=description) |
|
|
|
|
| _LOGLINES = { |
| Genre.NOIR: "A rain-soaked detective takes the case of {premise}.", |
| Genre.WEIRD: "A late-night broadcast catches the story of {premise}.", |
| Genre.WESTERN: "A frontier town reckons with {premise}.", |
| Genre.ROMANCE: "Two hearts meet again over {premise}.", |
| Genre.COMEDY: "A radio studio descends into chaos over {premise}.", |
| Genre.HINDI_MELODRAMA: "Fate tears two lovers apart over {premise}.", |
| } |
|
|
|
|
| |
|
|
|
|
| def _noir(premise: str, title: str, v: int): |
| cast = [ |
| _member("sam", "Sam Calloway", VoiceID.DETECTIVE, "A tired private eye who has seen it all."), |
| _member("vera", "Vera Lake", VoiceID.INGENUE, "A client with a secret and nowhere left to run."), |
| ] |
| open_line = [ |
| f"It was the kind of night that drags strange cases through my door. Mine was {premise}.", |
| f"I'd seen this city do its worst, but {premise}? That was a brand-new shade of trouble.", |
| ][v] |
| scenes = [ |
| Scene( |
| title="Rain on the Glass", |
| sfx=["rain on a window", "a distant saxophone", "a ticking wall clock"], |
| lines=[ |
| Line(cast="sam", delivery=Delivery.DEADPAN, text=open_line), |
| Line(cast="vera", delivery=Delivery.URGENT, text=f"You have to help me. It's about {premise}, and someone already knows I'm here."), |
| Line(cast="sam", delivery=Delivery.NEUTRAL, text="I poured a drink and let her talk. The clock kept time with my pulse."), |
| ], |
| ), |
| Scene( |
| title="The Double Cross", |
| sfx=["a door creaks open", "a revolver cocks"], |
| lines=[ |
| Line(cast="vera", delivery=Delivery.WHISPER, text="They followed me here. I'm certain of it."), |
| Line(cast="sam", delivery=Delivery.SLOW, text="In this town, certainty is the first thing they take from you."), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.NOIR, opening_sting="muted trumpet sting", bed="rain-soaked piano bed", closing_sting="lonely upright bass note") |
| return cast, scenes, music, 70 |
|
|
|
|
| def _weird(premise: str, title: str, v: int): |
| cast = [ |
| _member("announcer", "The Announcer", VoiceID.ANNOUNCER, "Warm, precise, and a little too calm."), |
| _member("caller", "The Caller", VoiceID.INGENUE, "Tired, urgent, and listening for an answer."), |
| ] |
| open_line = [ |
| f"Good evening, travelers. Tonight: {title}.", |
| f"We interrupt the silence to bring you a transmission concerning {premise}.", |
| ][v] |
| scenes = [ |
| Scene( |
| title="The Signal Opens", |
| sfx=["soft radio static", "a distant electrical hum"], |
| lines=[ |
| Line(cast="announcer", delivery=Delivery.BOOMING, text=open_line), |
| Line(cast="caller", delivery=Delivery.URGENT, text=f"I found {premise}, and it knew my name before I spoke."), |
| Line(cast="announcer", delivery=Delivery.DEADPAN, text="Then keep your hand on the receiver. Dead air dislikes witnesses."), |
| ], |
| ), |
| Scene( |
| title="The Line Answers", |
| sfx=["a rotary phone ring", "low thunder"], |
| lines=[ |
| Line(cast="caller", delivery=Delivery.WHISPER, text="The dial is turning by itself now."), |
| Line(cast="announcer", delivery=Delivery.SLOW, text="Listeners, if your lamps flicker, do not adjust the frequency."), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.WEIRD, opening_sting="uneasy brass sting", bed="low midnight organ bed", closing_sting="final unresolved chord") |
| return cast, scenes, music, 65 |
|
|
|
|
| def _western(premise: str, title: str, v: int): |
| cast = [ |
| _member("dunn", "Sheriff Dunn", VoiceID.ANNOUNCER, "A weathered lawman with one last reckoning in him."), |
| _member("stranger", "The Stranger", VoiceID.VILLAIN, "A drifter who rode in with the dust and bad news."), |
| ] |
| open_line = [ |
| f"Folks 'round here don't speak of {premise}. I aim to find out why.", |
| f"Sun was high when the trouble rode in: {premise}.", |
| ][v] |
| scenes = [ |
| Scene( |
| title="High Noon Dust", |
| sfx=["jingling spurs", "saloon doors swinging", "a distant coyote"], |
| lines=[ |
| Line(cast="dunn", delivery=Delivery.NEUTRAL, text=open_line), |
| Line(cast="stranger", delivery=Delivery.DEADPAN, text=f"You're chasing {premise}, Sheriff? Some trails end in the dirt."), |
| Line(cast="dunn", delivery=Delivery.BOOMING, text="Then I'll dig. This town's owed a reckoning."), |
| ], |
| ), |
| Scene( |
| title="The Standoff", |
| sfx=["a revolver cocks", "wind over the plains"], |
| lines=[ |
| Line(cast="stranger", delivery=Delivery.AGITATED, text="Last chance to ride away clean."), |
| Line(cast="dunn", delivery=Delivery.SLOW, text="I never did learn that particular trick."), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.WESTERN, opening_sting="lone harmonica sting", bed="dusty acoustic guitar bed", closing_sting="single struck anvil") |
| return cast, scenes, music, 68 |
|
|
|
|
| def _romance(premise: str, title: str, v: int): |
| cast = [ |
| _member("eleanor", "Eleanor", VoiceID.INGENUE, "Hopeful, guarded, and out of second chances."), |
| _member("thomas", "Thomas", VoiceID.ELDER, "Steady and warm, carrying a question he never asked."), |
| ] |
| open_line = [ |
| f"I almost didn't come. But {premise} — it changed everything.", |
| f"They told me {premise}. I came to the station to see if it was true.", |
| ][v] |
| scenes = [ |
| Scene( |
| title="The Platform", |
| sfx=["a steam train arriving", "gentle rain", "a station bell"], |
| lines=[ |
| Line(cast="eleanor", delivery=Delivery.SLOW, text=open_line), |
| Line(cast="thomas", delivery=Delivery.NEUTRAL, text=f"I would have waited all night. Even for {premise}."), |
| Line(cast="eleanor", delivery=Delivery.WHISPER, text="Then don't let go this time."), |
| ], |
| ), |
| Scene( |
| title="The Last Train", |
| sfx=["a train whistle", "footsteps on a platform"], |
| lines=[ |
| Line(cast="thomas", delivery=Delivery.URGENT, text="Come with me. We can leave all of it behind."), |
| Line(cast="eleanor", delivery=Delivery.NEUTRAL, text="Ask me again — and mean it this time."), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.ROMANCE, opening_sting="tender string swell", bed="soft piano romance bed", closing_sting="warm cello resolve") |
| return cast, scenes, music, 66 |
|
|
|
|
| def _comedy(premise: str, title: str, v: int): |
| cast = [ |
| _member("benny", "Benny", VoiceID.COMIC, "A fast-talking schemer with terrible ideas."), |
| _member("wallace", "Mr. Wallace", VoiceID.ANNOUNCER, "The long-suffering station manager."), |
| ] |
| open_line = [ |
| f"Boss, you won't believe it — {premise}! Right here in the lobby!", |
| f"So I says to the fella, '{premise}?' And he faints clean away!", |
| ][v] |
| scenes = [ |
| Scene( |
| title="The Mix-Up", |
| sfx=["a slide whistle", "a door slams", "a studio audience laughs"], |
| lines=[ |
| Line(cast="benny", delivery=Delivery.AGITATED, text=open_line), |
| Line(cast="wallace", delivery=Delivery.DEADPAN, text=f"Benny. We do not have a budget for {premise}."), |
| Line(cast="benny", delivery=Delivery.URGENT, text="We do now! I already sold the tickets!"), |
| ], |
| ), |
| Scene( |
| title="The Payoff", |
| sfx=["a rim shot", "applause"], |
| lines=[ |
| Line(cast="wallace", delivery=Delivery.SLOW, text="Then why is the mayor calling my office?"), |
| Line(cast="benny", delivery=Delivery.BOOMING, text="Funny story! Remember those tickets?"), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.COMEDY, opening_sting="bouncy clarinet sting", bed="vaudeville upright piano bed", closing_sting="comic tuba button") |
| return cast, scenes, music, 62 |
|
|
|
|
| def _hindi(premise: str, title: str, v: int): |
| cast = [ |
| _member("meera", "Meera", VoiceID.HINDI_FEMALE, "Torn between her heart and her family's honor."), |
| _member("arjun", "Arjun", VoiceID.HINDI_MALE, "A lover who would defy destiny itself."), |
| ] |
| open_line = [ |
| f"Arjun! After everything — {premise}? How can destiny be so cruel?", |
| f"They told me {premise}. My heart refused to believe a single word.", |
| ][v] |
| scenes = [ |
| Scene( |
| title="Bichhde Hue", |
| sfx=["monsoon rain", "a temple bell", "distant thunder"], |
| lines=[ |
| Line(cast="meera", delivery=Delivery.AGITATED, text=open_line), |
| Line(cast="arjun", delivery=Delivery.URGENT, text=f"Meera, I crossed every river for you. Even {premise} cannot stop me."), |
| Line(cast="meera", delivery=Delivery.WHISPER, text="Maa will never accept us. You know this in your heart."), |
| ], |
| ), |
| Scene( |
| title="Taqdeer", |
| sfx=["a train whistle", "anklet bells", "rolling thunder"], |
| lines=[ |
| Line(cast="arjun", delivery=Delivery.BOOMING, text="Then tonight we will write a new destiny, together!"), |
| Line(cast="meera", delivery=Delivery.SLOW, text="Promise me. On this rain, on this night, promise me."), |
| ], |
| ), |
| ] |
| music = MusicPlan(genre=Genre.HINDI_MELODRAMA, opening_sting="swelling sitar sting", bed="harmonium melodrama bed", closing_sting="tabla heartbeat fade") |
| return cast, scenes, music, 75 |
|
|
|
|
| _GENRE_BUILDERS = { |
| Genre.NOIR: _noir, |
| Genre.WEIRD: _weird, |
| Genre.WESTERN: _western, |
| Genre.ROMANCE: _romance, |
| Genre.COMEDY: _comedy, |
| Genre.HINDI_MELODRAMA: _hindi, |
| } |
|
|