From 0e34d998a568cda805191dea11fb2446106489d8 Mon Sep 17 00:00:00 2001 From: Lara Date: Wed, 4 Nov 2026 12:54:14 +0100 Subject: [PATCH] =?UTF-8?q?Folge=201:=20Ger=C3=A4usche=20synchron,=20Lied?= =?UTF-8?q?=20in=20DE/ES/FR=20gesungen=20(Suno)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Geräusche (baukasten/geraeusche, werkzeuge/geraeusche.mts): Stille am Anfang abgeschnitten, F01-Töne auf Bildereignissen und leiser; Ton.laenge blendet aus - Szene 6: Blume und Noas Arme gehen früher runter - Lied: je Sprache eigenes Suno-Lied (SUNO_LIEDER in lied.tsx), ES/FR-Zeiten per faster-whisper gemessen (+0,45 s, am DE-Lied geeicht); Ton in public/musik/lieder (nicht im Git) - F02 DE vertont Co-Authored-By: Claude Opus 5.5 --- remotion/.gitignore | 1 + remotion/src/baukasten/geraeusche.json | 22 ++ remotion/src/baukasten/geraeusche.tsx | 71 ++++++ remotion/src/folge01/Folge01.tsx | 97 +++++++- remotion/src/folge01/lied.tsx | 96 ++++++-- remotion/src/folge01/szene6.tsx | 5 +- remotion/src/folge02/Folge02.tsx | 76 ++++++- remotion/src/folge02/stimmen/de.json | 293 ++++++++++++++++++++++++- remotion/werkzeuge/geraeusche.mts | 72 ++++++ 9 files changed, 692 insertions(+), 41 deletions(-) create mode 100644 remotion/src/baukasten/geraeusche.json create mode 100644 remotion/src/baukasten/geraeusche.tsx create mode 100644 remotion/werkzeuge/geraeusche.mts diff --git a/remotion/.gitignore b/remotion/.gitignore index a6af8be..7c23e95 100644 --- a/remotion/.gitignore +++ b/remotion/.gitignore @@ -3,3 +3,4 @@ out/ public/bibliothek/clips public/stimmen public/musik +public/geraeusche diff --git a/remotion/src/baukasten/geraeusche.json b/remotion/src/baukasten/geraeusche.json new file mode 100644 index 0000000..f8fc766 --- /dev/null +++ b/remotion/src/baukasten/geraeusche.json @@ -0,0 +1,22 @@ +{ + "garten_tag": {"sekunden": 20, "loop": true, "beschreibung": "Calm autumn garden ambience in daytime: soft breeze, occasional dry leaves rustling, a few distant small birds chirping. Gentle and peaceful. No voices, no music."}, + "garten_abend": {"sekunden": 20, "loop": true, "beschreibung": "Calm autumn garden at sunset: a blackbird singing softly in the distance, light breeze, very peaceful. No voices, no music."}, + "garten_nacht": {"sekunden": 20, "loop": true, "beschreibung": "Peaceful autumn night in a garden: very soft wind, one distant owl hoot now and then, quiet and cozy. No voices, no music."}, + "zimmer": {"sekunden": 15, "loop": true, "beschreibung": "Quiet cozy children's room ambience: faint warm room tone, soft ticking of a clock far away. No voices, no music."}, + "buch_auf": {"sekunden": 2, "beschreibung": "A big picture book being opened gently, soft paper page flip, warm and cozy."}, + "buch_zu": {"sekunden": 1.5, "beschreibung": "A big picture book being closed gently, soft soft thump of paper and cardboard."}, + "laub_sprung": {"sekunden": 2, "beschreibung": "A child jumping into a big pile of dry autumn leaves, loud happy crunchy rustle and whoosh."}, + "rascheln": {"sekunden": 2.5, "beschreibung": "A small animal rustling and moving inside a pile of dry autumn leaves, soft and close."}, + "hopser": {"sekunden": 1.5, "beschreibung": "Two tiny soft cartoon hops of a small hedgehog, light bouncy boing, cute."}, + "giraffe_schritte": {"sekunden": 3, "beschreibung": "Slow, big but gentle footsteps of a large animal walking on soft grass, friendly cartoon feel."}, + "apfel": {"sekunden": 1, "beschreibung": "Crisp snap of an apple stem being picked from a branch, small and clear."}, + "strecken": {"sekunden": 2, "beschreibung": "Funny cartoon stretching sound, a long neck bending down slowly, soft comic creak, gentle."}, + "schnuppern": {"sekunden": 1.5, "beschreibung": "Gentle cartoon sniffing of a flower, two soft sniffs, cute."}, + "schnarchen": {"sekunden": 3, "beschreibung": "One tiny, cute, soft cartoon snore of a small sleepy hedgehog, with a gentle little whistle on the out-breath."}, + "blaetter_sammeln": {"sekunden": 1.5, "beschreibung": "Soft crunchy rustle of a handful of dry autumn leaves being picked up and dropped on a pile."}, + "blaetter_regen": {"sekunden": 3, "beschreibung": "A gentle shower of dry autumn leaves falling from a shaken tree branch, soft whoosh and rustling."}, + "zugvoegel": {"sekunden": 5, "beschreibung": "A flock of wild geese honking high in the sky, flying away into the distance, gentle and far."}, + "malen": {"sekunden": 4, "beschreibung": "Crayon scribbling and drawing on paper on a wooden table, close and soft."}, + "kribbeln": {"sekunden": 2, "beschreibung": "Cute magical sparkle twinkle, soft glockenspiel shimmer, cartoon, happy."}, + "schlaff": {"sekunden": 2, "beschreibung": "Soft short descending cartoon slide whistle, a little sad but cute and gentle."} +} diff --git a/remotion/src/baukasten/geraeusche.tsx b/remotion/src/baukasten/geraeusche.tsx new file mode 100644 index 0000000..6bbd4ca --- /dev/null +++ b/remotion/src/baukasten/geraeusche.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import {Audio, Sequence, getInputProps, getStaticFiles, interpolate, staticFile, useVideoConfig} from 'remotion'; +import type {Geplant} from './zeit'; + +// Geräusche und Hintergrundklang (Atmo) je Szene. +// Die Klänge stehen in src/baukasten/geraeusche.json und werden mit +// npx tsx werkzeuge/geraeusche.mts +// nach public/geraeusche/.mp3 erzeugt (ElevenLabs Sound Effects, für alle Folgen). +// Ein Ton hängt an einer Zeile der Szene (`bei`, auch reine Bildzeilen wie 'buch') +// plus `versatz` in Sekunden. In FolgeNN.tsx: K: mitKlang(Szene2, S2, {atmo: 'garten_tag', toene: [...]}) +// Abschalten beim Rendern: --props='{"geraeusche": false}' + +const VORHANDEN = new Set(getStaticFiles().map((d) => d.name)); +const pfad = (name: string) => `geraeusche/${name}.mp3`; + +// laenge: Ton nach so vielen Sekunden weich ausblenden (sonst läuft die Datei ganz durch) +export type Ton = {name: string; bei: string; versatz?: number; lautstaerke?: number; laenge?: number}; +export type Klang = {atmo?: string; atmoLaut?: number; toene?: Ton[]}; +type Plan = {dauer: number; liste: Geplant[]}; + +export const Geraeusche: React.FC = ({atmo, atmoLaut = 0.12, toene = [], plan}) => { + const {fps} = useVideoConfig(); + if (getInputProps().geraeusche === false) return null; + const {dauer, liste} = plan; + const atmoDa = atmo !== undefined && VORHANDEN.has(pfad(atmo)); + return ( + <> + {atmoDa && ( +