From cbacc2fd9727a1caeaea47cffccd8d9059d67c73 Mon Sep 17 00:00:00 2001 From: Pascal Scholz Date: Thu, 29 Oct 2026 18:43:56 +0000 Subject: [PATCH] =?UTF-8?q?Remotion:=20Baukasten=20f=C3=BCr=20alle=20Folge?= =?UTF-8?q?n,=20Szenen=20einzeln=20renderbar,=20Stimmen-Skript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gemeinsame Bausteine nach src/baukasten/, Bibliothek nach public/bibliothek/, Orte nach public/orte/ - je Szene eine Komposition (F02-01-…), werkzeuge/render.mjs rendert nur geänderte Szenen und klebt sie zusammen; --entwurf mit halber Auflösung und eingeblendeter Zeit/Zeile - werkzeuge/stimmen.mts erzeugt ElevenLabs-Aufnahmen, Zeitplan übernimmt ihre Länge - Folge 2: Geh- und Hinsetz-Clips statt Standbild-Wechsel, neue Vögel, fallendes Blatt, Noa malt den Kalender (Blick von oben) - ANLEITUNG_PC.md für Studio und Rendern unter Windows Co-Authored-By: Claude Opus 5.5 --- remotion/.gitignore | 3 +- remotion/ANLEITUNG_PC.md | 53 ++ remotion/README.md | 99 ++-- remotion/package-lock.json | 509 +++++++++++++++++- remotion/package.json | 3 +- .../figuren/lulu_A1_augen-zu.webp | Bin .../figuren/lulu_A2_augen-halb.webp | Bin .../figuren/lulu_A3_lachen.webp | Bin .../figuren/lulu_A4_staunen.webp | Bin .../figuren/lulu_A5_blick-links.webp | Bin .../figuren/lulu_A6_blick-rechts.webp | Bin .../figuren/lulu_A7-1_gehen.webp | Bin .../figuren/lulu_A7-2_gehen.webp | Bin .../figuren/lulu_A7-3_gehen.webp | Bin .../figuren/lulu_A7-4_gehen.webp | Bin .../figuren/lulu_A8_rueckansicht.webp | Bin .../figuren/lulu_A_apfel.webp | Bin .../figuren/lulu_A_hals-unten.webp | Bin .../figuren/lulu_B1_traurig.webp | Bin .../figuren/lulu_B2_erschrocken.webp | Bin .../figuren/lulu_B3_schlafen.webp | Bin .../figuren/lulu_B_kopf-profil.webp | Bin .../figuren/lulu_B_liegt.webp | Bin .../figuren/noa_A1_augen-zu.webp | Bin .../figuren/noa_A2_augen-halb.webp | Bin .../figuren/noa_A3_lachen.webp | Bin .../figuren/noa_A4_staunen.webp | Bin .../figuren/noa_A5_blick-links.webp | Bin .../figuren/noa_A6_blick-rechts.webp | Bin .../figuren/noa_A7-1_gehen.webp | Bin .../figuren/noa_A7-2_gehen.webp | Bin .../figuren/noa_A7-3_gehen.webp | Bin .../figuren/noa_A7-4_gehen.webp | Bin .../figuren/noa_A8_rueckansicht.webp | Bin .../figuren/noa_A_arm-hoch-winken.webp | Bin .../figuren/noa_A_arme-hoch.webp | Bin .../figuren/noa_A_laterne.webp | Bin .../figuren/noa_B1_traurig.webp | Bin .../figuren/noa_B2_erschrocken.webp | Bin .../figuren/noa_B3_schlafen.webp | Bin .../figuren/noa_B_hocken.webp | Bin .../figuren/noa_B_sitzt.webp | Bin .../figuren/noa_B_zeigen.webp | Bin .../figuren/noa_ref_stehend.webp | Bin .../figuren/pino_A1_augen-zu.webp | Bin .../figuren/pino_A2_augen-halb.webp | Bin .../figuren/pino_A3_lachen.webp | Bin .../figuren/pino_A4_staunen.webp | Bin .../figuren/pino_A5_blick-links.webp | Bin .../figuren/pino_A6_blick-rechts.webp | Bin .../figuren/pino_A7-1_gehen.webp | Bin .../figuren/pino_A7-2_gehen.webp | Bin .../figuren/pino_A7-3_gehen.webp | Bin .../figuren/pino_A7-4_gehen.webp | Bin .../figuren/pino_A8_rueckansicht.webp | Bin .../figuren/pino_A_hinterbeine.webp | Bin .../figuren/pino_A_kugel.webp | Bin .../figuren/pino_A_laufen-1.webp | Bin .../figuren/pino_A_laufen-2.webp | Bin .../figuren/pino_A_laufen-3.webp | Bin .../figuren/pino_A_laufen-4.webp | Bin .../figuren/pino_B1_traurig.webp | Bin .../figuren/pino_B2_erschrocken.webp | Bin .../figuren/pino_B3_schlafen.webp | Bin .../figuren/pino_B_blick-nach-oben.webp | Bin .../figuren/pino_B_schlaeft-eingerollt.webp | Bin .../figuren/pino_ref_sitzend.webp | Bin .../public/{folge02 => }/orte/garten.webp | Bin .../{folge02 => }/orte/garten_nacht.webp | Bin .../public/{folge02 => }/orte/kalender.webp | Bin remotion/public/orte/kalender_leer.webp | Bin 0 -> 12692 bytes remotion/public/{folge02 => }/orte/oben.webp | Bin .../{folge02 => }/orte/zimmer_himmel.webp | Bin .../{folge02 => }/orte/zimmer_tisch.webp | Bin .../{folge02 => }/orte/zimmer_wand.webp | Bin remotion/src/Root.tsx | 7 +- remotion/src/{folge02 => baukasten}/buch.tsx | 34 +- remotion/src/{folge02 => baukasten}/figur.tsx | 13 + remotion/src/baukasten/folge.tsx | 107 ++++ .../src/{folge02 => baukasten}/helfer.tsx | 0 remotion/src/{folge02 => baukasten}/natur.tsx | 37 +- remotion/src/{folge02 => baukasten}/orte.tsx | 106 +++- remotion/src/{folge02 => baukasten}/posen.ts | 134 ++--- .../src/{folge02 => baukasten}/untertitel.tsx | 24 +- remotion/src/baukasten/zeit.ts | 65 +++ remotion/src/folge02/Folge02.tsx | 45 +- remotion/src/folge02/lied.tsx | 16 +- remotion/src/folge02/plan.ts | 7 + remotion/src/folge02/stimmen.json | 1 + remotion/src/folge02/szene2.tsx | 23 +- remotion/src/folge02/szene3.tsx | 42 +- remotion/src/folge02/szene4.tsx | 48 +- remotion/src/folge02/szene5.tsx | 16 +- remotion/src/folge02/szene6.tsx | 53 +- remotion/src/folge02/szene7.tsx | 19 +- remotion/src/folge02/zeit.ts | 48 -- remotion/werkzeuge/posen.py | 10 +- remotion/werkzeuge/render.mjs | 116 ++++ remotion/werkzeuge/stimmen.config.json | 13 + remotion/werkzeuge/stimmen.mts | 102 ++++ remotion/werkzeuge/szenenliste.mts | 21 + 101 files changed, 1452 insertions(+), 322 deletions(-) create mode 100644 remotion/ANLEITUNG_PC.md rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A1_augen-zu.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A2_augen-halb.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A3_lachen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A4_staunen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A5_blick-links.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A6_blick-rechts.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A7-1_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A7-2_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A7-3_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A7-4_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A8_rueckansicht.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A_apfel.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_A_hals-unten.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_B1_traurig.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_B2_erschrocken.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_B3_schlafen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_B_kopf-profil.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/lulu_B_liegt.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A1_augen-zu.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A2_augen-halb.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A3_lachen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A4_staunen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A5_blick-links.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A6_blick-rechts.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A7-1_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A7-2_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A7-3_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A7-4_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A8_rueckansicht.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A_arm-hoch-winken.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A_arme-hoch.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_A_laterne.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B1_traurig.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B2_erschrocken.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B3_schlafen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B_hocken.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B_sitzt.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_B_zeigen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/noa_ref_stehend.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A1_augen-zu.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A2_augen-halb.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A3_lachen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A4_staunen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A5_blick-links.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A6_blick-rechts.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A7-1_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A7-2_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A7-3_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A7-4_gehen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A8_rueckansicht.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_hinterbeine.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_kugel.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_laufen-1.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_laufen-2.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_laufen-3.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_A_laufen-4.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_B1_traurig.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_B2_erschrocken.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_B3_schlafen.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_B_blick-nach-oben.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_B_schlaeft-eingerollt.webp (100%) rename remotion/public/{folge02 => bibliothek}/figuren/pino_ref_sitzend.webp (100%) rename remotion/public/{folge02 => }/orte/garten.webp (100%) rename remotion/public/{folge02 => }/orte/garten_nacht.webp (100%) rename remotion/public/{folge02 => }/orte/kalender.webp (100%) create mode 100644 remotion/public/orte/kalender_leer.webp rename remotion/public/{folge02 => }/orte/oben.webp (100%) rename remotion/public/{folge02 => }/orte/zimmer_himmel.webp (100%) rename remotion/public/{folge02 => }/orte/zimmer_tisch.webp (100%) rename remotion/public/{folge02 => }/orte/zimmer_wand.webp (100%) rename remotion/src/{folge02 => baukasten}/buch.tsx (84%) rename remotion/src/{folge02 => baukasten}/figur.tsx (87%) create mode 100644 remotion/src/baukasten/folge.tsx rename remotion/src/{folge02 => baukasten}/helfer.tsx (100%) rename remotion/src/{folge02 => baukasten}/natur.tsx (83%) rename remotion/src/{folge02 => baukasten}/orte.tsx (79%) rename remotion/src/{folge02 => baukasten}/posen.ts (73%) rename remotion/src/{folge02 => baukasten}/untertitel.tsx (76%) create mode 100644 remotion/src/baukasten/zeit.ts create mode 100644 remotion/src/folge02/plan.ts create mode 100644 remotion/src/folge02/stimmen.json delete mode 100644 remotion/src/folge02/zeit.ts create mode 100644 remotion/werkzeuge/render.mjs create mode 100644 remotion/werkzeuge/stimmen.config.json create mode 100644 remotion/werkzeuge/stimmen.mts create mode 100644 remotion/werkzeuge/szenenliste.mts diff --git a/remotion/.gitignore b/remotion/.gitignore index 813b922..537c5bf 100644 --- a/remotion/.gitignore +++ b/remotion/.gitignore @@ -1,3 +1,4 @@ node_modules/ out/ -public/folge02/clips +public/bibliothek/clips +public/stimmen diff --git a/remotion/ANLEITUNG_PC.md b/remotion/ANLEITUNG_PC.md new file mode 100644 index 0000000..0b402d7 --- /dev/null +++ b/remotion/ANLEITUNG_PC.md @@ -0,0 +1,53 @@ +# Remotion auf dem eigenen PC (Windows) + +Damit kannst du Folgen sofort im Browser anschauen und durchspulen, ohne zu +rendern, und schneller rendern als auf dem VPS (mehr Kerne, Grafikkarte). + +## Einmalig einrichten +1. **Node.js** (LTS, z. B. 22) installieren: https://nodejs.org – Standard- + einstellungen. **Git** installieren: https://git-scm.com +2. Repo holen (in der Eingabeaufforderung `cmd`): + ```cmd + cd %USERPROFILE% + git clone ssh://git@git.larpaso.de:2222/pascal/youtube.git + cd youtube\remotion + npm install + ``` +3. **Clips vom Server holen** (stehen nicht im Git, ca. 3 MB): + ```cmd + ssh -t deploy@larpaso.de "sudo cp -r /var/lib/docker/volumes/claude_shared/_data/youtube/figuren_bibliothek/clips_frei ~/clips_frei && sudo chown -R deploy ~/clips_frei" + scp -r deploy@larpaso.de:~/clips_frei %USERPROFILE%\youtube\remotion\public\bibliothek\clips + ``` + Ohne Clips läuft alles trotzdem, an ihrer Stelle steht dann ein Standbild. + Sobald es Sprachaufnahmen gibt, genauso `/shared/youtube/stimmen` nach + `public\stimmen` kopieren. + +## Anschauen (Studio) +```cmd +cd %USERPROFILE%\youtube\remotion +npx remotion studio +``` +Es öffnet sich der Browser (sonst http://localhost:3000). Links die +Kompositionen: `F02` ist die ganze Folge, `F02-03-…` einzelne Szenen. +Mit Leertaste abspielen, mit der Zeitleiste springen. Ändert jemand den +Code (`git pull`), aktualisiert sich die Vorschau von selbst. + +Tipp: Unten rechts die Vorschau-Qualität auf „Half“ stellen, wenn es ruckelt. + +## Rendern +```cmd +node werkzeuge\render.mjs F02 --entwurf +node werkzeuge\render.mjs F02 +node werkzeuge\render.mjs F02 --szene 3 +``` +Ergebnis: `out\F02\F02-entwurf.mp4` bzw. `out\F02\F02.mp4`. Schon +gerenderte, unveränderte Szenen werden übersprungen. Das Skript nutzt alle +Kerne bis auf einen und die Grafikkarte. + +## Aktualisieren +```cmd +cd %USERPROFILE%\youtube +git pull +cd remotion +npm install +``` diff --git a/remotion/README.md b/remotion/README.md index fe71bbc..857004e 100644 --- a/remotion/README.md +++ b/remotion/README.md @@ -61,43 +61,78 @@ python3 werkzeuge/rig.py # braucht numpy, scipy, pillow und `uebersicht.png` prüfen. In einer Szene: `gelenk('lulu', 'hals', grad)` (siehe `src/szenen/VerformTest.tsx`). -## Folge 2 „Pino ist müde“ (`Folge02`) -Komplette Folge (ca. 5:20) nur mit Code, Figuren-Bibliothek und ohne Ton: -Untertitel ersetzen vorerst die Stimmen, Mitmach-Pausen zeigen ein „?“. +## Folgen bauen (Baukasten) +Eine Folge besteht aus Szenen, jede Szene aus Sprechzeilen und Bewegungen, +die an diesen Zeilen hängen. Alles Wiederverwendbare liegt in +`src/baukasten/`, jede Folge hat einen eigenen Ordner (`src/folge02/`). +Untertitel stehen für die Stimmen, solange es keine Aufnahmen gibt; +Mitmach-Pausen zeigen ein „?“. | Pfad | Inhalt | | --- | --- | -| `src/folge02/Folge02.tsx` | Reihenfolge der Szenen | -| `src/folge02/szene2.tsx` … `szene7.tsx`, `lied.tsx`, `buch.tsx` | die Szenen; jede hat oben ihre Sprechzeilen (`plane([...])`) | -| `src/folge02/zeit.ts` | Zeitplan aus den Zeilen; Dauer wird aus der Textlänge geschätzt | -| `src/folge02/figur.tsx` | `Figur` (Standbilder mit Posenwechsel), `ClipFigur` (freigestellte Clips), `Kamera` | -| `src/folge02/orte.tsx` | Orte als SVG; vorberechnet nach `public/folge02/orte/` | -| `src/folge02/natur.tsx` | Blätter, Nest, Vögel, Schnee, Zzz, Funkeln, große Rufe | -| `src/folge02/posen.ts` | automatisch erzeugt von `werkzeuge/posen.py` | -| `public/folge02/figuren/` | freigestellte Standbilder (WebP, im Git) | -| `public/folge02/clips` | Link auf `/shared/youtube/folge02/clips_frei/` (WebM mit Alpha, nicht im Git) | +| `src/baukasten/figur.tsx` | `Figur` (Standbilder mit Posenwechsel), `ClipFigur` (freigestellte Clips), `Kamera` | +| `src/baukasten/helfer.tsx` | Kamerafahrt, Atmen, Gehen, Hüpfen, Wackeln, Blenden, Ankerpunkte | +| `src/baukasten/natur.tsx` | Blätter, Nest, Vögel, Schnee, Zzz, Funkeln, große Rufe | +| `src/baukasten/orte.tsx` | Orte als SVG (Garten Tag/Nacht, Blick von oben, Noas Zimmer, Kalender); vorberechnet nach `public/orte/` | +| `src/baukasten/buch.tsx` | Bilderbuch-Intro und -Outro | +| `src/baukasten/zeit.ts` | Zeitplan aus den Zeilen (geschätzt oder aus den Aufnahmen) | +| `src/baukasten/untertitel.tsx` | Untertitel, Mitmach-Pause, Stimmen abspielen | +| `src/baukasten/folge.tsx` | macht aus der Szenenliste die Kompositionen | +| `src/baukasten/posen.ts` | automatisch erzeugt von `werkzeuge/posen.py` | +| `src/folge02/` | Folge 2: `Folge02.tsx` (Szenenliste), `szene2.tsx` … `szene7.tsx`, `lied.tsx`, `stimmen.json` | +| `public/bibliothek/figuren/` | freigestellte Standbilder (WebP, im Git) | +| `public/bibliothek/clips/` | freigestellte Clips (WebM mit Alpha, nicht im Git; VPS: Link auf `/shared/youtube/figuren_bibliothek/clips_frei/`) | +| `public/stimmen/` | Sprachaufnahmen (nicht im Git; VPS: Link auf `/shared/youtube/stimmen/`) | +**Kompositionen:** `F02` ist die ganze Folge, `F02-01-Intro`, +`F02-02-Gaehnen-ueberall` … jede Szene einzeln. + +**Neue Folge:** Ordner `src/folgeNN/` anlegen, `plan.ts` und `stimmen.json` +(`{}`) aus Folge 2 kopieren und den Ordnernamen anpassen, Szenen nach dem +Muster von `szene2.tsx` schreiben (oben die Zeilen mit `plane('sX', [...])`, +darunter Posenfolgen und Kamerafahrt, die sich auf `z..start/ende` +beziehen), in `FolgeNN.tsx` auflisten und in `src/Root.tsx` eintragen. + +### Rendern +```bash +node werkzeuge/render.mjs F02 --entwurf # schnelle Fassung zum Begutachten +node werkzeuge/render.mjs F02 # volle Qualität +node werkzeuge/render.mjs F02 --szene 3 # nur Szene 3 neu +``` +Das Skript rendert jede Szene einzeln nach `out/F02/` und klebt sie +zusammen. Szenen, deren Code, Bilder oder Aufnahmen sich nicht geändert +haben, werden übersprungen. Im Entwurf stehen oben links Gesamtzeit, Szene, +Szenenzeit und Zeilen-ID – für Rückmeldungen einfach diese Angaben nennen +(z. B. „2:47, Szene 4, Zeile l1: Lulus Kopf zu weit links“). +Auf dem VPS: vorher `export LD_LIBRARY_PATH=$HOME/.local/chrome-libs/root/usr/lib/x86_64-linux-gnu`. + +### Vorschau ohne Rendern +`npx remotion studio` öffnet alle Kompositionen im Browser; Änderungen am +Code sind sofort zu sehen. Anleitung für einen Windows-PC: `ANLEITUNG_PC.md`. + +### Stimmen (ElevenLabs) +1. Stimmen-IDs je Sprecher in `werkzeuge/stimmen.config.json` eintragen + (`ALLE` und `NOA_LULU` verweisen auf einen anderen Sprecher). +2. `npx tsx werkzeuge/stimmen.mts F02 --probe` zeigt, welche Zeilen erzeugt + würden, und zählt die Zeichen (kostet nichts). +3. `ELEVENLABS_API_KEY=… npx tsx werkzeuge/stimmen.mts F02` erzeugt die + Aufnahmen nach `public/stimmen/folge02/` und trägt ihre Länge in + `src/folge02/stimmen.json` ein. Der Zeitplan richtet sich danach; ändert + sich ein Text, wird nur diese Zeile neu erzeugt. + +Untertitel ausblenden: `--props='{"untertitel": false}'` (bzw. in +`render.mjs` die `props.json`). + +### Neue Standbilder oder Clips +```bash +python3 werkzeuge/freistellen.py bild1.png … # ohne Zuschneiden +python3 werkzeuge/clip_freistellen.py clip1.mp4 … +python3 werkzeuge/posen.py # Posen und Clips eintragen +``` +Mit `pip install "rembg[gpu]"` nutzt `rembg` eine Nvidia-Grafikkarte +automatisch (auf dem VPS gibt es keine; dort ca. 3 s pro Bild). Orte neu vorberechnen (nach Änderungen in `orte.tsx`): -```bash -npx remotion still src/index.ts F2Ort-garten public/folge02/orte/garten.webp --image-format=webp -``` - -Rendern: -```bash -npx remotion render src/index.ts Folge02 /shared/youtube/folge02/folge02-vorschau.mp4 --gl=swangle -``` -Auf einem anderen Rechner fehlen die Clips: den Ordner -`/shared/youtube/folge02/clips_frei/` nach `public/folge02/clips/` kopieren. -Fehlt ein Clip, zeigt `ClipFigur` ein Standbild der Figur. - -**Ton nachrüsten (ElevenLabs):** Je Zeile die Audiodatei erzeugen, ihre -Länge als `dauer` in die Zeile eintragen und die Datei als `