Intro rendern (M4-Pass)

Road-Movie-Opener: crumb_d + crumb_b unterwegs in den fremden Wald, Vektor
als Boombox/Rap-Traveller
im Autoradio trĂ€gt die Crew — analog statt offline.
LĂ€uft vor dem Teaser (scripts/script.*.json), endet als Übergabe auf dessen
erste Zeile („Dust settles. Nakivale
 again.").

SOT vs. Workdir

  • SOT (getrackt): scripts/intro.{en,de,fr}.json — hier Text/slugs pflegen.
  • Workdir (gitignored): raw_stems/alice_intro_{en,de,fr}/script.json —
    aus dem SOT generiert (lang-Suffix _en/_de/_fr + lang_code), Ziel der Stems.

SOT geÀndert? Workdirs neu erzeugen:

python - <<'PY'
import json, os
SOT="spinoffs/alice_in_nakivale/scripts"
for lang,suf in [("en","_en"),("de","_de"),("fr","_fr")]:
    s=json.load(open(f"{SOT}/intro.{lang}.json")); s["lang"]=suf; s["lang_code"]=lang
    d=f"raw_stems/alice_intro{suf}"; os.makedirs(d,exist_ok=True)
    json.dump(s, open(f"{d}/script.json","w"), ensure_ascii=False, indent=2)
PY

Referenzen (Stimm-Kodex: nie TTS fĂŒr geliehene Stimmen)

  • vektor → speaker_roles_stem/SE00EP00/vektor (vorhanden: vektor_spiegel.wav),
    Maschinenstimme via robotize_vektor.py (wie ep08/09).
  • crumb_b → 
/kruemel/kruemel00, crumb_d → 
/kruemel/kruemel01
    — fehlen noch, brauchen echte Takes. Bis dahin bricht ein echter Lauf im
    Preflight ab (fail-fast); --dry-run macht stille Platzhalter zum Testen.

Rendern (pro Sprache)

PY=~/workspace/crumcast/venv/bin/python
# 1) Stimm-Stems klonen (mlx-audio/OmniVoice, nur Apple Silicon M4)
$PY tts_stems.py raw_stems/alice_intro_en
# 2) Master mischen — Suffix ep00_en routet auf build_timeline_auto
$PY render_episode.py raw_stems/alice_intro_en alice_intro_en_master.wav ep00_en

_de → Suffix ep00_de, _fr → ep00_fr. Master + *.cues.json (Sync fĂŒr den
Hörraum-Player) landen im Aufrufordner.

Verifiziert auf der Linux-Kiste bis auf die echten Stimmen: Verdrahtung,
Auto-Timeline und Bett-Mix laufen (Dry-Run → 32-s-Master). mlx-audio ist hier
nicht installiert — der Stimm-Synth ist der M4-Schritt.