Compare commits
1 Commits
step35/595
...
step35/607
| Author | SHA1 | Date | |
|---|---|---|---|
| 26345b26b3 |
@@ -1,32 +1,193 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import json, os
|
"""
|
||||||
|
Generate 100 lyrics→visual scene description sets for Rock songs.
|
||||||
|
|
||||||
songs = [
|
Issue: timmy-config #607
|
||||||
{"t":"Thunder Road","a":"Heartland","m":["hope","anticipation","energy","triumph","nostalgia","urgency","passion","defiance","release","catharsis"]},
|
Output: training-data/scene-descriptions-rock.jsonl
|
||||||
{"t":"Black Dog Howl","a":"Rust & Wire","m":["despair","anger","frenzy","exhaustion","resignation","grief","numbness","rage","acceptance","silence"]},
|
Also mirrors to ~/.hermes/training-data/scene-descriptions-rock.jsonl
|
||||||
{"t":"Satellite Hearts","a":"Neon Circuit","m":["wonder","isolation","longing","connection","euphoria","confusion","clarity","tenderness","urgency","bittersweet"]},
|
|
||||||
{"t":"Concrete Garden","a":"Streetlight Prophet","m":["oppression","resilience","anger","beauty","defiance","community","joy","struggle","growth","hope"]},
|
Format per training-data/schema.json:
|
||||||
{"t":"Gravity Well","a":"Void Walker","m":["dread","fascination","surrender","awe","terror","peace","disorientation","acceptance","transcendence","emptiness"]},
|
song, artist, beat, timestamp, duration,
|
||||||
{"t":"Rust Belt Lullaby","a":"Iron & Ember","m":["nostalgia","sadness","tenderness","loss","beauty","resignation","love","weariness","quiet hope","peace"]},
|
lyric_line, scene { mood, colors, composition, camera, description }
|
||||||
{"t":"Wildfire Sermon","a":"Prophet Ash","m":["fury","ecstasy","chaos","joy","destruction","creation","warning","invitation","abandon","rebirth"]},
|
"""
|
||||||
{"t":"Midnight Transmission","a":"Frequency Ghost","m":["mystery","loneliness","curiosity","connection","paranoia","intimacy","urgency","disconnection","searching","haunting"]},
|
|
||||||
{"t":"Crown of Thorns","a":"Velvet Guillotine","m":["seduction","power","cruelty","beauty","danger","vulnerability","fury","grace","revenge","mercy"]},
|
import json
|
||||||
{"t":"Apartment 4B","a":"Wallpaper & Wire","m":["claustrophobia","routine","desperation","fantasy","breakthrough","freedom","fear","joy","grounding","home"]},
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
GENRE = "Rock"
|
||||||
|
DURATION = "30s"
|
||||||
|
|
||||||
|
SONGS = [
|
||||||
|
{
|
||||||
|
"title": "Thunder Road",
|
||||||
|
"artist": "Heartland",
|
||||||
|
"lyrics": ["The screen door slams, Mary's dress waves", "Like a vision she dances across the porch as the radio plays", "Roy Orbison singing for the lonely, hey that's me and I want you only", "Don't turn me home out now I'm so young and worthless still", "The night's busting open these two lanes will take us anywhere", "We got one last chance to make it real", "To trade in these wings on some wheels", "Climb in back, heaven's waiting down the tracks", "Oh oh oh oh oh oh oh", "It's a town full of losers and I'm pulling out of here to win"],
|
||||||
|
"moods": ["hope", "anticipation", "energy", "triumph", "nostalgia", "urgency", "passion", "defiance", "release", "catharsis"],
|
||||||
|
"colors": [["gold", "sky blue", "white"], ["silver", "pale green", "cream"], ["red", "orange", "electric blue"], ["gold", "crimson", "white"], ["amber", "sepia", "dusty rose"], ["red", "black", "strobe white"], ["deep red", "burgundy", "gold"], ["black", "neon green", "chrome"], ["sky blue", "white", "pale gold"], ["all white", "silver", "clear"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Open horizon. Golden light breaking through clouds. The figure silhouetted against dawn. The screen door slams, Mary's dress waves", "Close on hands gripping a steering wheel. Dashboard lights reflecting in eyes. Road stretching ahead. Like a vision she dances across the porch as the radio plays", "Rapid cuts. Bodies in motion. Light streaks across the frame. Roy Orbison singing for the lonely, hey that's me and I want you only", "Wide shot. Figure standing on a hilltop. Arms raised. City lights below. Don't turn me home out now I'm so young and worthless still", "Sepia tones. A photograph come to life. Dust motes in afternoon light. The night's busting open these two lanes will take us anywhere", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. We got one last chance to make it real", "Extreme close-up. Skin. Breath visible in cold air. Eyes locked. To trade in these wings on some wheels", "Low angle. Figure standing against the wind. Debris flying past. Unmoved. Climb in back, heaven's waiting down the tracks", "Slow motion. Something falling \u2014 a mask, a chain, a weight. Lightness follows. Oh oh oh oh oh oh oh", "White space expanding. Figure dissolving into light. Peace in the dissolution. It's a town full of losers and I'm pulling out of here to win"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Black Dog Howl",
|
||||||
|
"artist": "Rust & Wire",
|
||||||
|
"lyrics": ["Woke up on the floor again, whiskey still on my tongue", "The mirror shows a stranger and the damage that I've done", "I scream until my throat bleeds but nobody comes", "The walls are closing in again, the ceiling pressing down", "I tried to call your number but you changed it years ago", "Now I'm howling at the moon like some rabid dog I know", "Every bone remembers what my mind wants to forget", "I'll tear this whole house down before the sun comes up", "Ash and ruin everywhere, this is all that's left", "Silence. Just the wind through broken glass."],
|
||||||
|
"moods": ["despair", "anger", "frenzy", "exhaustion", "resignation", "grief", "numbness", "rage", "acceptance", "silence"],
|
||||||
|
"colors": [["navy", "black", "grey"], ["red", "black", "orange"], ["strobe", "red", "white flash"], ["grey", "brown", "faded"], ["grey", "muted blue", "beige"], ["deep purple", "black", "silver"], ["white", "grey", "no color"], ["fire red", "black", "ember orange"], ["soft blue", "warm grey", "sage"], ["black", "void", "faint starlight"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Empty room. Single light source. Figure curled in corner. Rain on windows. Woke up on the floor again, whiskey still on my tongue", "Shattered glass. Red light. Hands clenched. Jaw tight. The frame vibrates. The mirror shows a stranger and the damage that I've done", "Strobe lighting. Multiple exposures. Bodies colliding. Chaos as composition. I scream until my throat bleeds but nobody comes", "Static shot. Figure slumped. Eyes half-closed. Time passing in shadows. The walls are closing in again, the ceiling pressing down", "Medium shot. Hands dropping keys on a table. Turning away. Not looking back. I tried to call your number but you changed it years ago", "Wide shot. Figure alone in vast space. Dark purple sky. No horizon line. Now I'm howling at the moon like some rabid dog I know", "Desaturated. Figure staring at nothing. World moving around them in blur. Every bone remembers what my mind wants to forget", "Red wash. Extreme close-up on eyes. Fire reflected in pupils. I'll tear this whole house down before the sun comes up", "Soft focus. Gentle light. Figure breathing. The camera doesn't judge. Ash and ruin everywhere, this is all that's left", "Black screen. Faint starlight. The sound drops out completely. Silence. Just the wind through broken glass."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Satellite Hearts",
|
||||||
|
"artist": "Neon Circuit",
|
||||||
|
"lyrics": ["Ten thousand miles of static between your voice and mine", "I trace your constellation on the dashboard every night", "The signal fades to nothing but I keep the frequency", "Then suddenly your laughter breaks through like a summer storm", "We're dancing in the data stream, our pixels intertwined", "But I can't tell if you're real or just a ghost in the machine", "The picture clears and there you are \u2014 imperfect, warm, alive", "Your hand reaches through the screen, I swear I feel the heat", "The bandwidth's dying, say it now before the link goes dark", "Goodnight, satellite heart. I'll find you in the static."],
|
||||||
|
"moods": ["wonder", "isolation", "longing", "connection", "euphoria", "confusion", "clarity", "tenderness", "urgency", "bittersweet"],
|
||||||
|
"colors": [["aurora green", "violet", "silver"], ["cold blue", "black", "distant starlight"], ["teal", "silver", "moonlight"], ["warm gold", "rose", "blush"], ["neon", "rainbow", "white flash"], ["swirling", "unsettled", "green-grey"], ["clear blue", "white", "crisp"], ["blush pink", "warm cream", "soft gold"], ["red", "black", "strobe white"], ["amber", "lavender", "fading light"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Northern lights overhead. Figure looking up. Mouth open. Child's expression. Ten thousand miles of static between your voice and mine", "Extreme wide. Single figure. Vast empty landscape. Scale crushing. I trace your constellation on the dashboard every night", "Through a window. Figure on the other side. Glass between. Breath on the pane. The signal fades to nothing but I keep the frequency", "Two hands reaching. Fingers almost touching. Warm light between them. Then suddenly your laughter breaks through like a summer storm", "Overexposed. Everything bright. Dancing. The frame can't contain the joy. We're dancing in the data stream, our pixels intertwined", "Multiple focal points. Nothing sharp. The viewer doesn't know where to look. But I can't tell if you're real or just a ghost in the machine", "Rack focus. Background blurs, foreground sharpens. Suddenly everything makes sense. The picture clears and there you are \u2014 imperfect, warm, alive", "Close on a hand touching a face. Soft light. Shallow depth of field. Your hand reaches through the screen, I swear I feel the heat", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. The bandwidth's dying, say it now before the link goes dark", "Amber light fading. A smile that's also a goodbye. Beautiful and sad at once. Goodnight, satellite heart. I'll find you in the static."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Concrete Garden",
|
||||||
|
"artist": "Streetlight Prophet",
|
||||||
|
"lyrics": ["They paved over every green thing when the developers came", "But we planted seeds between the cracks and gave them all a name", "The mayor says progress looks like demolition and dust", "But a dandelion broke through the asphalt this morning \u2014 that's us", "You can't kill what wants to live, can't silence what must sing", "We're the roots beneath the road, we're the birds that built on string", "When they tear the next block down we'll be dancing in the rubble", "Every protest is a garden, every march plants something new", "The concrete is a drum and our footsteps keep the beat", "Tomorrow there'll be flowers where they swore there'd only be defeat"],
|
||||||
|
"moods": ["oppression", "resilience", "anger", "beauty", "defiance", "community", "joy", "struggle", "growth", "hope"],
|
||||||
|
"colors": [["concrete grey", "brown", "exhaust fume yellow"], ["green", "cracked concrete", "gold"], ["red", "black", "orange"], ["wildflower colors", "green", "sunlight"], ["black", "neon green", "chrome"], ["warm tones", "string lights", "firelight"], ["bright", "multi", "saturated"], ["dust", "grey", "hard light"], ["green", "brown", "morning light"], ["gold", "sky blue", "white"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Concrete. Overpasses. No sky visible. Figures small against infrastructure. They paved over every green thing when the developers came", "Crack in pavement. Green shoot pushing through. Macro lens. But we planted seeds between the cracks and gave them all a name", "Shattered glass. Red light. Hands clenched. Jaw tight. The frame vibrates. The mayor says progress looks like demolition and dust", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. But a dandelion broke through the asphalt this morning \u2014 that's us", "Low angle. Figure standing against the wind. Debris flying past. Unmoved. You can't kill what wants to live, can't silence what must sing", "String lights. People gathered. Laughter out of focus. Warmth as visual language. We're the roots beneath the road, we're the birds that built on string", "Saturated color. Wide smiles. Arms open. The world in full bloom. When they tear the next block down we'll be dancing in the rubble", "Close on hands working. Calluses. Dust. Effort visible in every frame. Every protest is a garden, every march plants something new", "Time-lapse. Seed to flower. Sunrise to sunset. Transformation as rhythm. The concrete is a drum and our footsteps keep the beat", "Open horizon. Golden light breaking through clouds. The figure silhouetted against dawn. Tomorrow there'll be flowers where they swore there'd only be defeat"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Gravity Well",
|
||||||
|
"artist": "Void Walker",
|
||||||
|
"lyrics": ["I felt the pull before I saw the edge", "The stars bent sideways, light itself was dead", "I could have turned the ship around but something in me said stay", "The event horizon glows like a halo made of nothing", "Time stretches thin as wire, each second takes a year", "I am both the observer and the thing that disappears", "My body reads the tidal forces like sheet music played on bone", "I stop fighting, stop reaching, stop calling home", "There is a peace in dissolution I was never meant to know", "Singularity. Silence. Everything and nothing both at once."],
|
||||||
|
"moods": ["dread", "fascination", "surrender", "awe", "terror", "peace", "disorientation", "acceptance", "transcendence", "emptiness"],
|
||||||
|
"colors": [["void black", "deep red", "cold white"], ["event horizon purple", "gravitational lens blue"], ["white", "dissolution", "prismatic"], ["starfield", "nebula colors", "infinite dark"], ["black", "red shift", "distortion"], ["deep space black", "starlight", "calm"], ["warped", "chromatic aberration", "bent light"], ["soft blue", "warm grey", "sage"], ["pure white", "beyond visible", "golden"], ["void", "absolute black", "nothing"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Corner of frame. Something in the periphery. Dark. The camera doesn't look directly. I felt the pull before I saw the edge", "Close on eyes. Reflection of something impossible. The pupil expands. The stars bent sideways, light itself was dead", "Arms opening. Head back. Falling backward into something vast. I could have turned the ship around but something in me said stay", "Wide shot of cosmos. Nebula. Stars being born. Human figure tiny at bottom. The event horizon glows like a halo made of nothing", "Shaking camera. Red shift. Something approaching fast. The frame distorts. Time stretches thin as wire, each second takes a year", "Still water. Stars reflected. Perfect mirror. No movement. No sound. I am both the observer and the thing that disappears", "Warped lens. Vertigo. Walls becoming floor. Gravity is a suggestion. My body reads the tidal forces like sheet music played on bone", "Soft focus. Gentle light. Figure breathing. The camera doesn't judge. I stop fighting, stop reaching, stop calling home", "Pure white expanding. Figure becoming light. Boundaries dissolving. There is a peace in dissolution I was never meant to know", "Absolute black. No stars. No reference point. The void looking back. Singularity. Silence. Everything and nothing both at once."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Rust Belt Lullaby",
|
||||||
|
"artist": "Iron & Ember",
|
||||||
|
"lyrics": ["My father's hands smelled like machine oil and prayer", "The factory whistle was our clock, the shift was our calendar", "He'd come home at midnight, wake me up to say goodnight", "Now the mill is just a skeleton and he's been gone ten years", "But the river still runs brown with memory and rust", "I found his lunchbox in the attic, coffee stains still fresh", "Some things don't decay \u2014 they just learn to hold still", "I hum the songs he hummed to me though I've forgotten half the words", "The town's half-empty but the porch lights still come on at dusk", "Sleep now, rust belt baby. The furnace keeps us warm."],
|
||||||
|
"moods": ["nostalgia", "sadness", "tenderness", "loss", "beauty", "resignation", "love", "weariness", "quiet hope", "peace"],
|
||||||
|
"colors": [["amber", "sepia", "dusty rose"], ["grey", "rain", "muted blue"], ["blush pink", "warm cream", "soft gold"], ["faded", "dusty", "empty space"], ["wildflower colors", "green", "sunlight"], ["grey", "muted blue", "beige"], ["neutral"], ["grey-brown", "faded", "dim"], ["faint warm light", "candle glow", "dawn grey"], ["deep space black", "starlight", "calm"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Sepia tones. A photograph come to life. Dust motes in afternoon light. My father's hands smelled like machine oil and prayer", "Rain on glass. Grey light. A cup of tea going cold. Still life of loss. The factory whistle was our clock, the shift was our calendar", "Close on a hand touching a face. Soft light. Shallow depth of field. He'd come home at midnight, wake me up to say goodnight", "Empty chair. Dust settling. A coat still on a hook. Presence of absence. Now the mill is just a skeleton and he's been gone ten years", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. But the river still runs brown with memory and rust", "Medium shot. Hands dropping keys on a table. Turning away. Not looking back. I found his lunchbox in the attic, coffee stains still fresh", "Visual interpretation of: Some things don't decay \u2014 they just learn to hold still", "Slow movement. Heavy eyelids. The world in faded tones. Everything too much. I hum the songs he hummed to me though I've forgotten half the words", "Faint warm light. Candle in dark room. Just enough to see by. The town's half-empty but the porch lights still come on at dusk", "Still water. Stars reflected. Perfect mirror. No movement. No sound. Sleep now, rust belt baby. The furnace keeps us warm."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Wildfire Sermon",
|
||||||
|
"artist": "Prophet Ash",
|
||||||
|
"lyrics": ["I didn't start the fire but I brought the gasoline", "Every sermon needs a spark and every spark needs a dream", "The forest is a cathedral and the flames are choir boys singing", "Watch the old world burn \u2014 isn't the light beautiful?", "We'll dance in the embers, we'll make love in the ash", "From destruction comes the soil where new things grow at last", "But don't mistake the warmth for safety, don't mistake the glow for home", "Come closer, come closer \u2014 I promise the burning feels like flying", "We threw everything we owned into the blaze and laughed", "Morning. Smoke. Green shoots. Begin again."],
|
||||||
|
"moods": ["fury", "ecstasy", "chaos", "joy", "destruction", "creation", "warning", "invitation", "abandon", "rebirth"],
|
||||||
|
"colors": [["dark red", "black", "flash"], ["fire", "gold", "blinding white"], ["strobe", "fragmented", "clashing"], ["bright", "multi", "saturated"], ["fire", "ash", "smoke orange"], ["green", "light", "warm gold"], ["red flash", "amber", "siren"], ["warm", "open", "golden"], ["wild", "free", "untethered"], ["green shoots", "dawn", "clear"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Dark red wash. Hands destroying. Frame shaking with rage. I didn't start the fire but I brought the gasoline", "Fire and gold. Bodies arching. Light bursting from every surface. Every sermon needs a spark and every spark needs a dream", "Fragmented frame. Collage. Everything at once. Order is a memory. The forest is a cathedral and the flames are choir boys singing", "Saturated color. Wide smiles. Arms open. The world in full bloom. Watch the old world burn \u2014 isn't the light beautiful?", "Fire. Ash falling like snow. Structures collapsing. Beautiful in its terrible way. We'll dance in the embers, we'll make love in the ash", "Hands shaping clay. Light emerging from dark. Something new being born. From destruction comes the soil where new things grow at last", "Red flash. Siren light. The calm before. Then: impact. But don't mistake the warmth for safety, don't mistake the glow for home", "Open door. Warm light spilling out. A hand extended. Come in. Come closer, come closer \u2014 I promise the burning feels like flying", "Running through a field. Hair wild. No destination. Just movement. We threw everything we owned into the blaze and laughed", "Dawn. Green shoots in ash. First breath after drowning. Morning. Smoke. Green shoots. Begin again."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Midnight Transmission",
|
||||||
|
"artist": "Frequency Ghost",
|
||||||
|
"lyrics": ["There's a voice on the radio that shouldn't be there", "Speaking my name in a language I almost understand", "I turn the dial but it follows like a shadow made of sound", "Then it says something only I would know, something buried deep", "I'm not afraid anymore \u2014 I'm listening", "The voice knows my dreams, it describes them back to me", "We're having a conversation across some membrane I can't see", "Then static. Then nothing. Then a whisper: find me", "I search every frequency but the voice is gone", "Some nights I still hear it, faint, like a song in another room"],
|
||||||
|
"moods": ["mystery", "loneliness", "curiosity", "connection", "paranoia", "intimacy", "urgency", "disconnection", "searching", "haunting"],
|
||||||
|
"colors": [["deep blue", "shadow", "candle"], ["single light", "dark", "cold blue"], ["warm yellow", "spotlight", "discovery"], ["warm gold", "rose", "blush"], ["surveillance green", "strobe", "red"], ["candlelight", "warm", "close"], ["red", "black", "strobe white"], ["static", "grey", "broken signal"], ["flashlight beam", "dark", "moving light"], ["faint blue", "echo", "silver"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Shadow figure in doorway. Candle. Face half-lit. Eyes knowing. There's a voice on the radio that shouldn't be there", "Single light in vast dark. Figure beneath it. Nothing else. Speaking my name in a language I almost understand", "Light moving across a surface. Discovery. Eyes widening. I turn the dial but it follows like a shadow made of sound", "Two hands reaching. Fingers almost touching. Warm light between them. Then it says something only I would know, something buried deep", "Surveillance angles. Green tint. Multiple screens. Watching. Being watched. I'm not afraid anymore \u2014 I'm listening", "Candlelight only. Two faces close. Shared breath. The world outside forgotten. The voice knows my dreams, it describes them back to me", "Handheld camera running. Blurred faces. Traffic. Heartbeat sound design. We're having a conversation across some membrane I can't see", "Static. Snow on screen. A voice breaking up. Distance measured in noise. Then static. Then nothing. Then a whisper: find me", "Flashlight beam cutting dark. Moving. Looking. Not finding yet. I search every frequency but the voice is gone", "Faint blue light. Echo of a figure. Present and absent simultaneously. Some nights I still hear it, faint, like a song in another room"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Crown of Thorns and Roses",
|
||||||
|
"artist": "Velvet Guillotine",
|
||||||
|
"lyrics": ["I wore your love like a weapon and you never felt the blade", "Every kiss was a negotiation, every touch a trade", "The throne room smells like jasmine and someone else's fear", "I am beautiful when I'm angry \u2014 haven't you heard?", "Don't mistake my gentleness for weakness, darling", "I chose to be kind. I could burn this kingdom down.", "The roses in my crown have thorns that curve inward", "I bleed for my own sins, not for yours", "Tonight I lay the crown aside and sleep without armor", "Mercy. The hardest word. The only gift worth giving."],
|
||||||
|
"moods": ["seduction", "power", "cruelty", "beauty", "danger", "vulnerability", "fury", "grace", "revenge", "mercy"],
|
||||||
|
"colors": [["deep red", "velvet", "candlelight"], ["gold", "black", "crimson"], ["cold silver", "black", "sharp white"], ["wildflower colors", "green", "sunlight"], ["red", "black", "warning yellow"], ["soft", "exposed", "raw"], ["dark red", "black", "flash"], ["white", "silver", "flowing"], ["dark", "steel", "cold blue"], ["warm gold", "white", "gentle"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Deep red. Velvet textures. Slow movement. Eyes that promise. I wore your love like a weapon and you never felt the blade", "Throne. Gold. Black. The figure doesn't move. Doesn't need to. Every kiss was a negotiation, every touch a trade", "Silver blade. Cold light. A smile that doesn't reach the eyes. The throne room smells like jasmine and someone else's fear", "Wildflowers in unexpected places. Color against grey. Nature reclaiming. I am beautiful when I'm angry \u2014 haven't you heard?", "Red and black. Warning signs. The frame contracts. Something approaches. Don't mistake my gentleness for weakness, darling", "Exposed skin. Soft light. Eyes open. Trust visible in every pore. I chose to be kind. I could burn this kingdom down.", "Dark red wash. Hands destroying. Frame shaking with rage. The roses in my crown have thorns that curve inward", "White. Flowing. Movement without effort. The body as art. I bleed for my own sins, not for yours", "Cold blue. Steel. The plan unfolding in shadows. Patience as weapon. Tonight I lay the crown aside and sleep without armor", "Warm gold. Hand lowering a weapon. Choosing not to. The harder path. Mercy. The hardest word. The only gift worth giving."],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Apartment 4B",
|
||||||
|
"artist": "Wallpaper & Wire",
|
||||||
|
"lyrics": ["Four walls, one window, a view of another wall", "The radiator clicks like a metronome for the damned", "I've memorized every crack in the ceiling \u2014 they form a map", "In my mind I've left a hundred times, bought a farm, learned to fly", "Then one morning I open the door and just walk out", "The hallway is an ocean, the stairs are a mountain range", "The street hits me like cold water and I almost go back", "But the sky \u2014 have you seen the sky? It goes on forever", "I stand on the sidewalk and cry because the world is so big", "Home is not a place. Home is the moment you stop hiding."],
|
||||||
|
"moods": ["claustrophobia", "routine", "desperation", "fantasy", "breakthrough", "freedom", "fear", "joy", "grounding", "home"],
|
||||||
|
"colors": [["close walls", "yellow bulb", "cramped"], ["grey", "institutional", "fluorescent"], ["scratching", "clawing", "raw"], ["dreamy", "pastel", "floating"], ["white burst", "open sky", "blinding"], ["open sky", "blue", "green"], ["cold", "dark", "sharp"], ["bright", "multi", "saturated"], ["neutral"], ["neutral"]],
|
||||||
|
"compositions": ["wide shot", "close-up", "over the shoulder", "low angle", "high angle", "dutch angle", "symmetrical", "rule of thirds", "extreme wide", "medium shot"],
|
||||||
|
"cameras": ["static", "slow pan", "dolly in", "dolly out", "handheld", "steadicam", "slow zoom", "crane up", "tracking shot", "slow tilt down"],
|
||||||
|
"descriptions": ["Walls close. Ceiling low. Yellow bulb. No escape visible. Four walls, one window, a view of another wall", "Fluorescent light. Same motion repeated. Clock on the wall. Time as loop. The radiator clicks like a metronome for the damned", "Hands clawing. Fingernails against surface. Raw need. Nothing held back. I've memorized every crack in the ceiling \u2014 they form a map", "Pastel. Floating. Impossible architecture. Gravity optional. In my mind I've left a hundred times, bought a farm, learned to fly", "White burst. Wall shattering. Open sky beyond. Freedom as explosion. Then one morning I open the door and just walk out", "Open road. Blue sky. Green fields. Wind in hair. No walls. The hallway is an ocean, the stairs are a mountain range", "Cold. Dark. Sharp edges. The frame contracts. Something unseen. The street hits me like cold water and I almost go back", "Saturated color. Wide smiles. Arms open. The world in full bloom. But the sky \u2014 have you seen the sky? It goes on forever", "Visual interpretation of: I stand on the sidewalk and cry because the world is so big", "Visual interpretation of: Home is not a place. Home is the moment you stop hiding."],
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
beats = []
|
def generate():
|
||||||
for s in songs:
|
rows = []
|
||||||
|
for song in SONGS:
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
beats.append({"song": s["t"], "artist": s["a"], "beat": i+1,
|
rows.append({
|
||||||
"timestamp": f"{i*30//60}:{(i*30)%60:02d}", "duration": "30s",
|
"song": song["title"],
|
||||||
"lyric_line": f"[Beat {i+1}]", "scene": {"mood": s["m"][i], "colors": ["placeholder"],
|
"artist": song["artist"],
|
||||||
"composition": ["wide","close","OTS","low","high","dutch","symmetric","thirds","xwide","medium"][i],
|
"beat": i + 1,
|
||||||
"camera": ["static","pan","dolly-in","dolly-out","handheld","steadicam","zoom","crane","track","tilt"][i],
|
"timestamp": f"{i * 30 // 60}:{(i * 30) % 60:02d}",
|
||||||
"description": f"[{s['m'][i]} scene]"}})
|
"duration": DURATION,
|
||||||
|
"lyric_line": song["lyrics"][i],
|
||||||
|
"scene": {
|
||||||
|
"mood": song["moods"][i],
|
||||||
|
"colors": song["colors"][i],
|
||||||
|
"composition": song["compositions"][i],
|
||||||
|
"camera": song["cameras"][i],
|
||||||
|
"description": song["descriptions"][i],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
return rows
|
||||||
|
|
||||||
out = os.path.expanduser("~/.hermes/training-data/scene-descriptions-rock.jsonl")
|
def validate(rows):
|
||||||
os.makedirs(os.path.dirname(out), exist_ok=True)
|
assert len(rows) == 100, f"Expected 100 rows, got {len(rows)}"
|
||||||
with open(out, "w") as f:
|
songs_set = {r["song"] for r in rows}
|
||||||
for b in beats:
|
assert len(songs_set) == 10, f"Expected 10 songs, got {len(songs_set)}"
|
||||||
f.write(json.dumps(b) + "\n")
|
for r in rows:
|
||||||
print(f"Generated {len(beats)} beats")
|
assert "scene" in r
|
||||||
|
assert "mood" in r["scene"]
|
||||||
|
assert "colors" in r["scene"]
|
||||||
|
assert "composition" in r["scene"]
|
||||||
|
assert "camera" in r["scene"]
|
||||||
|
assert "description" in r["scene"]
|
||||||
|
assert len(r["scene"]["description"]) >= 10
|
||||||
|
print(f"Validation passed: {len(rows)} rows, {len(songs_set)} songs")
|
||||||
|
|
||||||
|
def write(rows, path: Path):
|
||||||
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
with open(path, "w", encoding="utf-8") as f:
|
||||||
|
for r in rows:
|
||||||
|
f.write(json.dumps(r, ensure_ascii=False) + "\n")
|
||||||
|
print(f"Wrote {len(rows)} rows to {path}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
rows = generate()
|
||||||
|
validate(rows)
|
||||||
|
|
||||||
|
repo_path = Path(__file__).resolve().parent.parent / "training-data" / "scene-descriptions-rock.jsonl"
|
||||||
|
home_path = Path.home() / ".hermes" / "training-data" / "scene-descriptions-rock.jsonl"
|
||||||
|
|
||||||
|
write(rows, repo_path)
|
||||||
|
write(rows, home_path)
|
||||||
|
|
||||||
|
# Run schema validation if available
|
||||||
|
schema_script = Path(__file__).resolve().parent.parent / "scripts" / "validate-scene-data.py"
|
||||||
|
if schema_script.exists():
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
result = subprocess.run(
|
||||||
|
["python3", str(schema_script), "--schema", "training-data/schema.json", str(repo_path)],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
)
|
||||||
|
print(result.stdout)
|
||||||
|
if result.returncode != 0:
|
||||||
|
print(result.stderr)
|
||||||
|
raise SystemExit(1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user