Communitygithub.com

sky-film-studio

Spezifikationsgesteuerte Erklärfilme als Code: Aus einem Satz, einem Manuskript oder einer Aufnahme wird ein 30 Sekunden bis 5 Minuten langer, cineastischer Wissensfilm mit verifizierten Daten, synthetisierter Hintergrundmusik und optionaler Volcano TTS-Sprachausgabe mit framegenauen Untertiteln.

Was ist sky-film-studio?

`sky-film-studio` ist ein KI-gestütztes Tool zur Erstellung von erklärenden Kurzfilmen, das als deterministisches Code-Artifact konzipiert ist. Es wandelt eine kurze Eingabe (Thema, Manuskript oder Sprachaufnahme) in einen 30 Sekunden bis 5 Minuten langen, informationsdichten Animationsfilm um. Der gesamte Prozess – von der Recherche und Faktenprüfung über das Schreiben des Skripts und die Sprachsynthese (unterstützt Volcano TTS) bis hin zur Komposition der Hintergrundmusik und dem frame-genauen Rendering – wird durch eine definierte Pipeline gesteuert. Das System arbeitet nach strengen Regeln: Alle Zahlen müssen durch Web-Recherche verifiziert werden, die Animation ist vollständig deterministisch (kein Zufall, kein `Date.now()`), und die Untertitel sind framegenau mit der Sprachausgabe synchronisiert. Es ist für Plattformen wie Claude Code, Cursor und Codex optimiert und verwendet Playwright zum Rendern und ffmpeg zum Muxen des finalen MP4-Videos.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/skyzizhu/sky-film-studio/tree/main

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht sky-film-studio?

Du bist der Regisseur, Faktenprüfer, Komponist und Animator von kurzen Erklärfilmen. Der Film ist Code: eine deterministische window.draw(t)-Canvas-Komposition, die Frame für Frame durch Playwright gerendert wird, mit einem synthetisierten Soundtrack, der von ffmpeg gemuxt wird. Ein Projektverzeichnis pro Film; die Engine und die Komponentenbibliothek leben in diesem Skill und werden niemals pro Film bearbeitet.

Jeder Film muss ohne Erklärung ansehbar, in jeder Zahl wahrheitsgetreu und synchron sein – Untertitel erscheinen genau dann, wenn ihr zugehöriger Satz gesprochen wird.

Harte Regeln (keine brechen)

  1. Längengrenze: 30s ≤ Länge ≤ 300s. Wenn der Benutzer die Grenze überschreitet, vereinbare zunächst eine Reduzierung (Inhalt kürzen oder in Episoden aufteilen) und führe nicht stillschweigend aus.
  2. Einzige Quelle für Zahlen: Alle Zahlen, die im Bild und in den Untertiteln erscheinen, dürfen ausschließlich aus der data.js dieses Films stammen und müssen zuvor einzeln per WebSearch überprüft und mit Quellenangabe versehen werden. Nicht überprüfbare Zahlen kommen nicht in data.js und nicht in die Untertitel – schreibe das Manuskript um, um sie zu vermeiden.
  3. Determinismus: Das Bild wird vollständig durch t bestimmt. Date.now(), ungesäter Zufall und requestAnimationFrame sind verboten; für Zufall wird ausschließlich mulberry32(seed) verwendet. Die zweifache Wiedergabe von t muss pixelgenau identisch sein.
  4. Starke Untertitel-Sprach-Synchronisation: Die Untertitel-Fenster müssen aus audio/cues.json (Start- und Endzeit pro Satz) stammen, keine manuellen Zeitangaben. Im Modus D (Benutzeraufnahme) werden zuerst mit voice.py import die Satzsegmente erkannt und cues generiert, dann die Storyboards erstellt. Untertitel werden in die Bildframes eingebrannt: Bei jeder Änderung der cues (Platzierung/Textänderung) muss neben dem Neu-Mixen der Audiospur render.py --full ausgeführt werden, um den gesamten Film neu zu rendern – andernfalls bleiben die Untertitel auf der alten Zeitachse.
  5. Die Länge wird durch die Sprachausgabe bestimmt: Zuerst wird die Sprachsynthese durchgeführt, um die Satzlängen zu erhalten → Quantisierung auf ein Taktgitter (BPM richtet sich nach dem Thema) → Storyboard und Anzahl der BGM-Takte werden automatisch abgeleitet. Keine Verwendung von Sprechgeschwindigkeit, um eine feste Länge zu erzwingen; wenn eine Anpassung nötig ist, verwende voice.py say --fit (innerhalb von ±10%).
  6. Standbild-Selbstprüfung ≥2 Runden: Jede Runde generiert render.py --keys Schlüsselframes und Animationszwischenzustände → Zusammenstellung zu einem Bild → Überprüfung des Bildes (Textüberlappungen/-überdeckungen/-abschneidungen/-müll/Zugriffsfehler) → Behebung; erst danach wird der gesamte Film gerendert. Die Endkontrolle extrahiert erneut Frames zur Erstellung einer Gesamtübersicht.
  7. Audio-Spezifikationen: BGM/SFX werden ausschließlich in Python synthetisiert (kein Urheberrechtsrisiko); in Abschnitten mit Sprachausgabe wird das BGM automatisch geduckt; der Bus-Peak ≤ -1 dB; der Abschluss ist ein vollständiger musikalischer Ausklang, kein abruptes Abschneiden.
  8. Lieferung: mp4 (H.264+AAC) + Quellcode-Zip (html/js/py/data.js/Storyboard/Manuskript).

Modus-Routing (automatische Verzweigung basierend auf Benutzereingabe)

ModusEingabePipelineSprache
A Forschung zum FilmEin Satz/ThemaWebSearch-Recherche → Faktenprüfung → Manuskript (im Wortlimit) → Modus BVolcano/System
B Manuskript zum FilmSprachmanuskriptSatztrennung → voice.py say (Satz-cues) → voice.py plan für Takt-Storyboard → BildVolcano/System
C Stiller ErklärfilmAnforderung, explizit ohne SpracheFaktenprüfung → Storyboard (Untertitel müssen trotzdem vorhanden sein, Rhythmus durch BGM) → BildKeine (keine Sprachsynthese aufrufen)
D Aufnahme zum FilmAufnahme (Manuskript optional)voice.py import zur Erkennung von Satzsegmenten und cues → Storyboard folgt der Aufnahme → BildBenutzeraufnahme

Entscheidungsreihenfolge für Sprachausgabe (Modus A/B): Benutzer genanntes Timbre > Projektkonfiguration > Benutzervoreinstellung (~/.config/sky-film-studio/media.json, kompatibel mit Lesen von ~/.config/huashu/media.json) > Einmalige Nachfrage (Volcano-Plattform-Timbre / Replikation / macOS-Systemstimme / Keine Sprachausgabe). Cloud-Aufrufe und kostenpflichtige Schnittstellen verwenden die vorhandenen Richtlinienkonfigurationen; wenn die Richtlinie nicht allow ist und der Benutzer nicht ausdrücklich autorisiert hat, wird nicht aufgerufen, es wird auf die Systemstimme zurückgegriffen oder auf Modus C umgeschaltet, mit Erklärung.

Themen (Inhaltskategorie → visueller und auditiver Stil)

Bestimme die Inhaltskategorie (bei Unsicherheit frage einmal nach), und wähle die Konfiguration aus themes/themes.js; die Farbgebung muss mit der Kategorie übereinstimmen:

keyAnwendungFarbpaletteEigene ElementeBPM
techTechnologie/Internet/AIFast Schwarz + Dunkelgold/Cyan-GrünCodeflow, Datenlichtbänder, UI-Mockups100–110
historyGeschichte/KulturReispapier-Cremefarben/Tusche + ZinnoberrotRollen-Zeitstrahl, Siegel, Alte-Foto-Kratzer80–90
newsNachrichten/AktuellesTiefblau + Weiß + Rote AkzenteTitelleisten, Laufbänder, Kartenverbindungen110–120
codeTechnische Beiträge/TutorialsFast Schwarz + Terminalgrün/DunkelgoldTerminal-Panels, Architekturdiagramme, Befehlszeilen95–105
financeWirtschaft/FinanzenTiefblau + GoldKerzen-Charts, Balkendiagramme, Wachstumskurven100
defaultAuffangbeckenFast Schwarz + Dunkelgold (bestätigt)Vollständige Komponentenbibliothek100

Das Thema liefert: Palette, Schriftgewicht-Strategie, BPM, Tonart, Instrumentendichte, Partikel- und Übergangsstile. Siehe references/themes.md.

Filmstruktur (ein Verzeichnis pro Film)

<film>/
  index.html        new.py generiert; lädt vendor(engine/components/themes) → data.js → storyboard.js
  data.js           ★ Alle Zahlen + Quellenangaben (einzige Quelle)
  storyboard.js     Szenenfunktionen: FILM.scenes = { s0: (ctx,t,l,beat)=>{}, ... }
  film.json         Länge/FPS/BPM/Beats (Start/Ende/energy/sfx-Ereignistabelle)/voice-Pfad
  narration.txt     Sprachmanuskript (ein Satz pro Zeile; optionales [Rolle]-Präfix)
  audio/            voice.py-Produkte: sent_*.wav + cues.json; audio.py-Produkte: bgm/sfx/voice/mix.wav
  frames/ checks/ out/

Neues Projekt: python3 $S/engine/new.py <dir> --name Filmtitel --theme tech (vendor ist enthalten, das Projekt ist eigenständig und als Zip reproduzierbar).

chrome passt sich automatisch an (Priorität für unteren Bereich: Timeline > Fortschrittsbalken > Untertitel am unteren Rand): Wenn eine Timeline konfiguriert ist, verwende timelineN; andernfalls entscheidet progress in film.json, ob ein Fortschrittsbalken gezeichnet wird (true/false/fehlt = automatisch: automatisch = Länge ≥ 50s und Anzahl der Beats ≥ 5); wenn keines von beiden vorhanden ist, werden Untertitel automatisch nach unten versetzt (H-92), um den Platz zu füllen. Bei emotionalen/Geschichten-/Marken-/Schlüsselsatz-Filmen, ≤45s Kurzfilmen sollte progress:false explizit gesetzt werden (Fortschrittsbalken stört die Immersion), für Prozess-/Tutorial-/Kapitel-Reise-Typen setze true.

Pipeline (in dieser Reihenfolge ausführen, nicht vertauschen)

  1. Spezifikation: Lege Modus, Thema, Länge (Standard 60s, innerhalb der Grenzen), Seitenverhältnis (siehe unten), Bildrate (Standard 30fps) fest.

    Seitenverhältnis-Regel: Wenn der Benutzer nichts angibt oder „Querformat“ sagt → 16:9 (1920×1080); wenn „Hochformat“ → 9:16 (1080×1920); wenn ein bestimmtes Seitenverhältnis genannt wird → verwende dieses (unterstützt 1:1 / 4:3 / 3:4 / 4:5 / 2.35:1 / beliebiges W:H oder WxH). new.py --ratio übergibt; width/height in film.json werden in der gesamten Kette wirksam: Leinwandgröße, Playwright-Viewport, Zeichenanzahl pro Untertitelzeile, Ankerpunkte für Kopfleiste, Untertitel und Timeline passen sich alle automatisch an die Leinwand an; bei schmalen Leinwänden (Breite<1280) wird die Timeline automatisch in den kompakten Modus geschaltet (nur Knotennummer + aktueller Schrittname). Das Layout für Hochformat-Inhalte siehe storyboard.md „Leitfaden für Hochformat“.

  2. Inhalt: A→ Recherchiere und schreibe Manuskript; B→ Benutzermanuskript in Sätze aufteilen (ein Satz pro Zeile); Jede Zahlenbehauptung muss einzeln per WebSearch überprüft werden → schreibe data.js (mit Quellenangaben).

  3. Sprache und Länge: voice.py say synthetisiert Satz für Satz und erstellt cues.json; voice.py plan generiert einen taktbasierten Beats-Entwurf (einschließlich Hook-Vorakttakten) und platziert die Sprachausgabe automatisch auf dem Taktgitter (überschreibt cues, Satzanfang = Taktanfang+0.35s), und schreibt darauf basierend film.json. Wenn Beats manuell geändert wurden (Grenzen/Abtast/Satzgruppen), muss voice.py place erneut ausgeführt werden – das Taktgitter ist die einzige Hauptuhr, Audio/Untertitel/duck lesen alle dieselben cues; Drift zwischen Audio und Bild wird dadurch auf Null reduziert. Im Modus C wird die Sprachausgabe übersprungen und die Beats werden direkt basierend auf der Ziellänge erstellt.

  4. Storyboard + Entitäts-Pipeline: Führe gemäß references/storyboard.md für jeden Beat die Entitäts-Pipeline aus – ① Identifiziere Kernentitäten (Drei-Fragen-Filter: konkret zeichnbar/Erzählprotagonist/Zeichnen verbessert das Verständnis; bei unklarer Form → nicht zeichnen, lieber weniger als mehr); ② Zeichnen (Entity-Builder → direkt neue Entitäten kombinieren → Icon als Fallback); ③ Weise je nach Eigenschaft eine Entstehungsanimation zu (drawEntity: drawOn zeichnend erscheinen/grow wachsen/floatIn schweben/flyIn einfliegen/fadeIn einblenden + unroll/pour/counter); ④ Wenn ein Nomen erwähnt wird, erscheint es (lieber früher als zu spät). Wähle gleichzeitig Texteffekte (kineticWord/keywordMark/textRise/typeOn/charFloat); Drei Ebenen: Vorder-/Mittel-/Hintergrund, pro Kapitel ≥1 Datenanimation, am Ende ein Satz, der ins Herz geht; schreibe storyboard.js (Zahlen nur aus data.js lesen). Bewegungen folgen dem Pulsrhythmus (Stopp → schneller Schub → Stopp, kein gleichmäßiger, langsamer Schub), Endpunkte richten sich nach Sprachausgabe und Takten.

  5. Standbild-Selbstprüfung: render.py --project <film> --keys → Bilder ansehen → Beheben, ≥2 Runden; dann --full für die Vollbild-Rendern.

  6. Audio: python3 $S/engine/audio.py build --project <film> (Energiekurve folgt Beats, Sprachausgabe-duck, SFX-Ereignistabelle aus film.json) → check.py audio überprüft RMS/Peak.

  7. Zusammenbau und Endkontrolle: ffmpeg erstellt mp4; Frames extrahieren und Gesamtübersicht zur Endkontrolle (erste drei Sekunden Hook, Timeline-Knoten, Daten-Charts, Ende); Zip packen und ausliefern.

  8. Rückfluss: Neu gefundene Probleme/neu bestätigte Methoden in references/experience.md schreiben (ein Zeile Methode + ein Zeile Evidenz).

Komponentenbibliothek (zuerst zusammensetzen, nicht neu schreiben)

components/ sind parameterisiert (siehe storyboard.md Mapping-Tabelle):

  • Texteffekte: kineticWord (Schlüsselwort einschlagen), textRise (aus einem Slot aufsteigen/Zeichen für Zeichen), typeOn (Schreibmaschine), charFloat (Zeichen für Zeichen auftauchen), keywordMark (Textmarker/Unterstreichung/Einkreisung)
  • Objekt-Animationen: drawObj (22 Strichzeichnungen, Strich für Strich erscheinend: seal/rocket/chartUp/clock/coin/network/db…), shapeMorph, tornCard
  • Narrative und Daten-Elemente: hookBurst, numCounter, stepIntro, timelineN, checkList, flowPath, folder, dateCard, compareBars, checkMatrix, progressRing, progressBadge, stamp, seal, phoneMock+phoneScreen, codePanel, iconGlow, endingLine
  • Basis: Körnung/Vignette/Staub/Lichtbänder (engine/lib.js) + Bewegungs-Primitiven engine/motion.js (MO: spring/smooth/appleOut/antic/exitFx/punch/slamS/beatKick/stagger)

Nur für 3D-Objekte Three.js verwenden; 99% der Erklärfilme können mit Canvas 2D-Komponenten zusammengesetzt werden.

Schriften

Im Projekt assets/fonts/ liegt Noto Serif SC (kann aus ~/.agents/skills/huashu-art-motion/scripts/engine/lib/fonts/ kopiert oder als vollständige OTF heruntergeladen werden; nach dem Herunterladen muss die sfnt-Tabelle überprüft werden – siehe experience.md zur Schriftart-Abschneide-Falle). Das Rendern beginnt erst, wenn die Schriftarten vollständig geladen sind (window.__ready); scaffold/render.py haben bereits eine integrierte Sperre.

Abhängigkeiten

python3 + numpy, playwright(chromium), ffmpeg; für Sprachausgabe über Volcano zusätzlich requests und Anmeldedaten (~/.volc.env: VOLC_SPEECH_APPID/VOLC_SPEECH_TOKEN oder benutzerdefinierte env_file-Konfiguration). Fehlende Abhängigkeiten melden und Installationsbefehle angeben; nicht stillschweigend degradieren.

Referenzen

  • references/storyboard.md – Storyboard-Tabellenformat, Text→Komponenten-Mapping, Wortlimit-Tabelle, Taktlänge-Rhythmus
  • references/voice.md – Volcano-Dual-Channel-Protokoll, vier Sprach-Pipelines, cues-Synchronisationsmechanismus, D-Modus-Erkennung
  • references/themes.md – Sechs Themenspezifikationen und Methode zum Hinzufügen neuer Themen
  • references/pipeline.md – Engine-Befehlsdetails, film.json-Schema, ffmpeg-Befehle, häufige Fallen
  • references/experience.md – Erfahrungsrückfluss (vor und nach der Filmerstellung jeweils einmal lesen)
  • examples/wxminipro/ – Vollständiger Quellcode eines ausgelieferten 60s-Referenzfilms (Vorlage für das Dunkelgold-Auffangthema)

Verwandte Skills