Was macht video-narrado?
Eingabe: eine .md-Datei. Ausgabe, in dieser Reihenfolge:
- Detailvideo 16:9 (2 bis 4 Min.), das die gesamte MD durchläuft.
- Kurzfassungen 9:16 (2 oder 3, unter 60 s): jede greift einen Erkenntnis aus dem Detailvideo auf.
- Ein
publicacion.mdpro Stück (Titel, Beschreibung, Hashtags und Alternativtext).
Alles mit der ausgewählten Stimme, Untertiteln und eigener Hintergrundmusik.
- Motor:
motor/, innerhalb dieses Skills (Playwright 1.63.0 + ffmpeg; Python 3 ohne Abhängigkeiten).MOTOR= absoluter Pfad dieses Ordners. - Projekt: ein Ordner pro Video, z. B.
videos/AAAA-MM-TT_thema/, mit einem Unterordner pro Stück:largo/,short-1-…/,short-2-…/. Jedes Stück enthält sein eigenesstoryboard.json. - Installation (einmalig): siehe
README.md.
Ausgewählte Stimme
Standardmäßig die geklonte Stimme „audio_pmm“ von HeyGen:
Feld von create_speech | Wert |
|---|---|
voiceId | b088805628184836963fa5d2881bb23b |
engine | elevenlabs |
settings | {"model_id": "eleven_v4"} |
language | es |
Wenn die Person, die das Video bestellt, eine andere Stimme wünscht, suche sie mit mcp__heygen__list_voices und bestätige sie vor der Generierung.
Ablauf
1. MD lesen und Stücke vorschlagen
Die gesamte MD-Datei lesen. Den Verlauf des Detailvideos (alle Erkenntnisse in Reihenfolge) und eine Erkenntnis pro Kurzversion (die stärkste zuerst) festlegen. Die Liste der Stücke vor dem Schreiben der Storyboards anzeigen.
2. Storyboards → Freigabe
Eine Szene pro Idee. Das Detailvideo: 8 bis 16 Szenen; eine Kurzversion: 4 bis 7 Szenen, mit einem Aufhänger (destacado) in der ersten. Vollständiges Beispiel: motor/ejemplos/storyboard-desalacion-16x9.json.
{"id": "03-sesiones", "tipo": "barras", "kicker": "Sitzungen pro Fall", "titulo": "Wo am meisten gesprochen wurde",
"items": [{"etiqueta": "Caleta Chañaral", "valor": 6}], "destacar": 0, "nota": "Quelle…",
"subtitulo": "Chañaral de Aceituno war der Fall mit den meisten Sitzungen.",
"voz": "Chañaral de Aceituno war der Fall mit den meisten Sitzungen."}
Kopfzeile des Storyboards: titulo, serie (was neben „Rizoma ·“ oben steht), formato ("16:9" für das Detailvideo, "9:16" für die Kurzfassungen), fuente_md und optional musica (siehe Schritt 5).
Szenentypen (alle akzeptieren kicker, tono: "oscuro" und lluvia: true):
| Typ | Felder | Verwendungszweck |
|---|---|---|
portada | titulo, bajada | Detailvideo eröffnen |
cifras | titulo, items[{valor, prefijo?, sufijo?, texto, detalle?}] (1 bis 3), destacar | Zahlen, die hochzählen |
barras | titulo, items[{etiqueta, valor, rotulo?}] (bis 8), destacar, nota | Mengen vergleichen |
hito | fecha, etiqueta, titulo, texto, progreso{i, n} | Ein Ereignis in einer Zeitleiste |
lista | titulo, items[{marca?, texto, alerta?}] (bis 6) | Argumente oder Schritte |
cita | fecha, texto, quien, nota | Was jemand gesagt hat |
destacado | texto, bajada | Der Satz, den man sich merken muss; der Aufhänger einer Kurzversion |
cierre | bajada, url, fuente | Marke und Quelle |
Redaktionelle Regeln:
- Nur Fakten aus der MD. Was die MD als zweifelhaft markiert, bleibt außen vor oder wird als solches benannt.
vozist das, was gesprochen wird: Zahlen, Jahre, Prozentangaben und Abkürzungen werden ausgeschrieben (texto_voz.pylehnt Ziffern ab).subtituloist das, was zu sehen ist, mit Ziffern.textoist der Text auf dem Bildschirm beihito,citaunddestacado.- Kurze Sätze, neutrales chilenisches Spanisch, ~2,9 Wörter pro Sekunde. Eine Kurzversion überschreitet nicht ~140 Wörter Sprachausgabe.
- Was aus einer automatischen Transkription stammt, wird als Paraphrase markiert (
nota). - Was veröffentlicht wird, nennt keine Kunden oder internen Plattformen. Der Schluss enthält die Quelle.
Jedes Storyboard als Tabelle anzeigen (Szene · Typ · was zu sehen · was gesprochen wird) und auf die Genehmigung warten: jede Vertonung verbraucht Stimmkontingent.
3. Stimme (ein Aufruf pro Stück)
python3 $MOTOR/texto_voz.py <stueck>
Den ausgegebenen Text (die Stimme jeder Szene verbunden mit <break time="1.2s"/>) an mcp__heygen__create_speech mit der ausgewählten Stimme übergeben. Mit der zurückgegebenen audio_url:
python3 $MOTOR/bajar_voz.py <stueck> "<audio_url>"
Das Audio herunterladen und anhand der Pausen szenenweise zuschneiden. Falls gemeldet wird, dass Pausen fehlen, mit niedrigerem Schwellwert erneut über das bereits heruntergeladene Audio laufen: python3 $MOTOR/bajar_voz.py <stueck> <stueck>/voz/narracion.wav --pausa 0.7 (in der Praxis kürzt ElevenLabs manchmal eine Pause etwas). Falls es dennoch fehlschlägt, hat die Stimme einen <break> nicht respektiert: vor der Neugenerierung nachfragen. Nie die Generierung allein nach einem Fehler wiederholen.
4. Bauen und rendern
bash $MOTOR/producir.sh <stueck> # komplettes Video
bash $MOTOR/producir.sh <stueck> --hasta 15 --salida test.mp4 # kurzer Test
Jede Szene dauert so lange wie ihre Sprachausgabe. Das MP4 liegt unter <stueck>/salida/video.mp4; die Dauer entspricht in etwa der Videolänge.
5. Hintergrundmusik
Automatisch: Ambient-Klangteppich mit ffmpeg synthetisiert (keine Rechte Dritter), 14 dB unter der Stimme, mit sanftem Ducking und Endmischung auf -16 LUFS. Im Storyboard: "musica": {"bajo_voz_db": 18} senkt sie ab; {"archivo": "track.mp3"} verwendet einen eigenen Track (nur lizenzfrei, mit Lizenzvermerk); false schaltet sie aus.
6. Kurzfassungen
Nach Genehmigung des Detailvideos jede Kurzfassung als separates Stück anlegen (formato: "9:16"), dabei Szenen des Detailvideos wiederverwenden: Aufhänger → 2 bis 4 Datenszenen → Schluss. Gleicher Schritt 3 (ein Sprachaufruf pro Stück) und Schritt 4.
7. Prüfung und Abgabe
- 4 bis 8 Einzelbilder mit ffmpeg extrahieren und prüfen: dass der Untertitel kein Datum verdeckt, kein Text aus dem Rahmen ragt und keine Szene leer bleibt.
publicacion.mdpro Stück schreiben: Titel (≤ 60 Zeichen), Beschreibung mit Quelle, 3 bis 5 Hashtags, Alternativtext und was vor der Veröffentlichung noch zu überprüfen ist.- Die MP4s mit klaren Namen nach
~/Downloadskopieren (Video_Thema.mp4,Short_Nr_Thema.mp4). Audio und MP4s kommen nicht ins Git (**/voz/*.wav,**/salida/).
Von einem eigenen animierten HTML
Falls bereits ein HTML mit window.seek(t) und Szenen mit festen Zeiten existiert, wird guion.json von Hand geschrieben (html: [a, b] pro Segment) und preparar.py + render.mjs ausgeführt. Für manuell erstellte Kurzfassungen: motor/plantillas/motor-vertical.js.
Format und sichere Zonen
- 16:9: 1920×1080, Untertitel 34 px unten, Zeilen bis zu 58 Zeichen.
- 9:16: 1080×1920, Untertitel 54 px bei 400 px Abstand vom unteren Rand, Zeilen bis zu 34 Zeichen; Inhalt zwischen y=400 und y=1380 (oben/unten liegen die Buttons der jeweiligen Plattform).
- Kein Untertitel endet mit „que“, „las“, „por“ und Ähnlichem.
Bekannte Fehler
- Kein Netzwerk: Googles Schriften laden nicht und das Rendering fällt auf Arial zurück.
- ffmpeg ohne libass (Homebrew): deshalb werden Untertitel innerhalb der Seite gezeichnet.
- Unbekannter Szenentyp: das Video bleibt weiß;
tipoprüfen.