screencast-studio — Render Pipeline

screencast-studio — Render Pipeline A data-flow diagram generated by Archify. 01 / Script 02 / Narrate 03 / Time 04 / Record 05 / Deliver script.yaml · videos/<name>/ · 01 / Script · storyboard script.yaml videos/<name>/ storyboard loader.py · app + 8 verbs · 01 / Script · fail fast loader.py app + 8 verbs fail fast MP3 cache · build/<name>/audio · 02 / Narrate · sha256 key MP3 cache build/<name>/audio sha256 key tts.py · edge / elevenlabs / heygen · 02 / Narrate · narrator tts.py edge / elevenlabs / heygen narrator avatar.sh · HeyGen Avatar IV · 02 / Narrate · ~$0.043/s avatar.sh HeyGen Avatar IV ~$0.043/s timeline.py · starts + 1.0s pause · 03 / Time · the clock timeline.py starts + 1.0s pause the clock subtitles.py · sentence cues · 04 / Record · final.srt subtitles.py sentence cues final.srt recorder.py · Playwright Chromium 1080p · 04 / Record · one context recorder.py Playwright Chromium 1080p one context mux.py · ffmpeg adelay + amix · 05 / Deliver · 30 fps mux.py ffmpeg adelay + amix 30 fps build/<name>/ · mp4 + srt + manifest · 05 / Deliver · render record build/<name>/ mp4 + srt + manifest render record compose.sh · final-jose-ai.mp4 · 05 / Deliver · not integrated compose.sh final-jose-ai.mp4 not integrated YAML scenes validated before any render Scene.say one text per scene one MP3 per scene cache miss only ffprobe durations narration drives the clock scenes + start instants screen holds if actions finish early cue timings script text is the transcript silent 1080p webm one continuous file MP3s, adelay per scene amix, normalize off final.srt soft mov_text, or burned H.264 + AAC manifest written only on success intro.mp3 ElevenLabs, run by hand alpha webm VP9 with alpha final.mp4 + final.srt SRT re-timed by the intro Legend primary data async batch data store data flow

Narration owns the clock

  • • Every scene's MP3 is synthesized and measured before the browser opens
  • • Actions that finish early hold the screen; actions that run long are reported, never fatal

Cached and reproducible

  • • MP3 names carry sha256(text, voice, rate), so a new voice is a cache miss, not a stale file
  • • manifest.json records the script sha256, the voice, the lead and every overrun

The presenter is hand-run

  • • avatar.sh and compose.sh live in experiments/, outside the render command
  • • ElevenLabs narrates; HeyGen only moves the mouth