Communitygithub.com

muyunxue/dance-mmd-subtitle-kit

Subjektbewusste Farbkorrektur für MMD-Tanzvideos – hebt den Tänzer hervor, während der Hintergrund abgedunkelt, kälter und entsättigt wird. Bietet zwei Wege: weiches Bühnenlicht-Ellipsen-Matte oder harte Keying-Maske, mit ffmpeg-Rezepten, gemessenen Parametersätzen und bekannten Fehlermodi (Schattenkontamination, Banding, abgeschnittene Quellen).

Was ist dance-mmd-subtitle-kit?

Dieses Skill-Paket ermöglicht eine subjektbewusste Farbkorrektur für MMD-Tanzvideos, bei der der Tänzer hervorgehoben wird, ohne die umgebende Bühnenumgebung zu stören. Es bietet zwei Hauptansätze: (A) eine weiche Bühnenlicht-Ellipse (empfohlen, sauber) erzeugt einen radialen Verlauf, der den Tänzer aufhellt, wärmt, schärft und mit einem leichten Glow versieht, während der Hintergrund abgedunkelt, kälter, entsättigt und leicht unscharf wird. (B) eine harte Keying-Trennung (hohe Qualität, aber schmutzig) extrahiert eine Personenmaske über Frame-Differenz zum Hintergrund, ermöglicht separate Grading-Pässe; leidet jedoch unter Schattenkontamination, die helle Flecken um den Tänzer erzeugt. Es wird auf Plattformen wie der Windows-Eingabeaufforderung, PowerShell oder als Teil eines automatisierten Videopipelines mit ffmpeg und Python (PIL, numpy) ausgeführt. Die SKILL.md enthält vollständige ffmpeg-Filtergraphen, gemessene Parameterstufen (A natürlich, B verstärkt, Final-Richtung) und detaillierte Fehlermodi wie Cast-Shadow-Mattenkontamination, Median-Hintergrundverschmutzung, 8-Bit-Banding und Untertitelkontrast. Es soll geladen werden, wenn der Benutzer nach 调色/突出人物/压背景/统一色调 (Farbkorrektur/Person hervorheben/Hintergrund abdunkeln/einheitlicher Farbton) fragt oder wenn ein fertiger Clip seltsame helle Blobs um den Tänzer zeigt. Die empfohlenen Werkzeugpfade sind spezifisch für dieses Projekt (ffmpeg aus WinGet, Python aus dsh-Runtime), aber die Konzepte sind auf andere Szenen übertragbar.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/muyunxue/dance-mmd-subtitle-kit/tree/HEAD/skills/subject-color-grade

In Ihrer bevorzugten KI fragen

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

Dokumentation

MMD Subjektbewusste Farbkorrektur (Person hervorheben)

0. Fazit vorweg

  • MMD-Bühnenvideos, die „Person hervorheben“ möchten, haben zwei Wege:
    1. Lichtzonenmodellierung (empfohlen, sauber): Eine weiche Lichtellipse / radialer Verlauf um die Person – innerhalb der Ellipse wird die Person aufgehellt/warm/scharf/glühend, außerhalb der Hintergrund abgedunkelt/kalt/entsättigt/leicht unscharf; die Übergänge sind sehr weich, fast unsichtbar.
    2. Harte Keying-Trennung (hohe Qualität aber schmutzig): Frame-Differenz zum Hintergrundbild, um eine Personenmaske zu erhalten, Person und Hintergrund getrennt farblich bearbeiten und wieder zusammensetzen. Die Schwierigkeit ist der Schlagschatten (cast shadow) der Person, der sich mitbewegt und mit der Person verbunden ist; die Maske enthält dann große Schattenflächen → helle Flecken; aggressives Erodieren frisst wiederum Flügel/Federn.
  • Nur bei Endproduktion Weg 1 wählen; wenn eine Alpha-Ebene der Figur aus Blender/MMD gerendert werden kann, Weg 2 (höchste Qualität).

1. Material und Werkzeuge

GegenstandPfad
QuellvideoD:\mmd.mp4\0002-4956.mkv (komplett 165,166s) / Untertitel\0001-4956 - Kopie.mkv (abgeschnitten auf ~137s)
Grading-SkripteUntertitel\build\grade_ffmpeg.py (Lichtzone/weiches Licht), grade_final5s.py (5s-Endprodukt-Parameter), color_grade.py (alte Version Frame-Differenz-Matte), gothic_art.py (statischer Frame Gothic-Grading)
Validierungsskripteavoid_layout.py (Belegungsanalyse), avoid_side2.py (Belegung+Bbox)
ffmpegC:\Users\35530\AppData\Local\Microsoft\WinGet\Packages\Gyan.FFmpeg_Microsoft.Winget.Source_8wekyb3d8bbwe\ffmpeg-9.0-full_build\bin\ffmpeg.exe
PythonC:\Users\35530\.dsh\dsh-runtimes\dsh-primary-runtime\dependencies\python\python.exe (PIL/numpy, kein cv2/Deep Learning)

2. Weg A: Lichtzonenmodellierung (Standardvorgehen dieses Projekts)

2.1 Erstellen einer weichen Lichtmasken (einmalig PNG)

import numpy as np
from PIL import Image
W,H = 2560,1080
yy,xx = np.mgrid[0:H,0:W].astype(np.float32)
cx,cy = 0.515,0.565          # Personenmitte (bei 2560x1080 Hochformat etwa hier; bei anderen Videos Frame extrahieren zur Bestätigung)
rx,ry = 0.245,0.47           # Halbbreite / Halbhöhe (Anteil); zu klein → sichtbarer Kreis, zu groß → keine Trennung
q = ((xx-W*cx)/(W*rx))**2 + ((yy-H*cy)/(H*ry))**2
mask = np.clip(1.0-q,0,1)**0.55          # 0,5–0,7 recht weich
Image.fromarray((mask*255).astype(np.uint8)).save("_mask_final.png")

Referenz-Endprodukte: Untertitel\Ausgabe\Farbtest\_mask_final.png, Untertitel\Ausgabe\Untertitel-Muster\_mask_final.png.

2.2 ffmpeg-Synthese (schwebende Person + abgedunkelter Hintergrund)

Idee: Personen-Grading-Version + Hintergrund-Grading-Version, mit der Maske als Alpha-Blending:

[0:v]split=2[sv][bv];
[sv]eq=brightness=0.050:contrast=1.06:saturation=1.15,
    colorbalance=rs=0.02:bs=-0.02:rm=0.05:bm=-0.06:rh=0.02:bh=-0.02,
    split=2[sm][sh];[sh]gblur=sigma=14[blur];
    [sm][blur]blend=all_mode=screen:all_opacity=0.34[sub];
    [sub]format=yuva420p[suba];
[1:v]format=gray[gm];[suba][gm]alphamerge[subj];
[bv]eq=brightness=-0.045:contrast=1.07:saturation=0.87,
    colorbalance=rm=-0.03:bm=0.05,gblur=sigma=0.6[bg];
[bg][subj]overlay=0:0,format=yuv420p[v]

Befehl:

& $ff -v error -y -ss 36.5 -t 30 -i src.mkv -loop 1 -i _mask_final.png `
  -filter_complex "<obiger Graph>" -map "[v]" -t 30 `
  -c:v libx264 -preset medium -crf 16 -pix_fmt yuv420p OUT.mp4

Hinweis: Bei -loop 1 -i mask.png ist die Maske ein statischer Stream; nach dem overlay mit -t die Länge begrenzen. Parameterbedeutung: bg brightness negativ = abdunkeln, saturation<1 = entsättigen, bm>0 = Hintergrund bläulich (kalt), gblur = leichte Unschärfe; bei subj brightness/Sättigung/warme Töne/blend screen für Glow.

2.3 Gemessene Parameterstufen (2560×1080, lila Bühne MMD)

Stufebg brightnessbg satsubj gainsubj satbloomvignetteEffekt
A natürlich−0,0350,82+0,0301,080,200,30Leichte Aufhellung der Person, fast keine Änderung der Atmosphäre
B verstärkt−0,0750,70+0,0551,160,340,42Deutliche Trennung, Lichtzonenrand leicht sichtbar
Endprodukt-Richtung−0,0850,68+0,0501,150,300,38Sehr weiches Licht, empfohlen für das gesamte Untervideo

Parameter auf 5s testen, bei Zufriedenheit direkt auf 30s/Ganzvideo anwenden (ffmpeg läuft einmal durch, schneller als Frame-für-Frame mit Python).

3. Weg B: Harte Keying (für sauberere Masken)

3.1 Hintergrundbild

  • Aus dem gesamten Video jede 1/2s einen Frame ziehen, auf 1280×540 skalieren, pixelweise Median = Hintergrundbild bg_half.npy.
  • Befehl/Rückschau: Untertitel\build\color_grade.py's build_background().
  • Bekanntes Problem: Wenn die Person lange in der Mitte steht, wird der Median durch die Person „verschmutzt“ (manche Pixel der Person sind oft die Person) → Frame-Differenz ist am Rumpf zu klein → Maske hat Löcher. Mit fill_holes oder Bbox abfangen.

3.2 Frame-Differenz-Maske (1/4 Auflösung am schnellsten)

m = |frame_q - bg_q|.max(axis=2) > 38
m = MaxFilter(5) (expandieren) → größte verbundene Komponente → optional Löcher füllen/weichzeichnen
  • Verwendet für Belegungsanalyse/Ausweichen (siehe avoid-subtitles); für Farbkorrektur muss zusätzlich eine „Personenähnlichkeits“-Einschränkung hinzugefügt werden, sonst mischen sich Schatten/Lichtflecken ein.

3.3 Bekannte Fehlerquellen (in diesem Projekt getestet)

  • Schattenkontamination: Der Schatten der Person bewegt sich mit, die Maske verschmilzt → nach Farbkorrektur helle Flecken/Farbblöcke um die Person. Lösung: Frame-Differenz nicht als präzise Matte verwenden; entweder akzeptieren, dass der Schatten mit aufgehellt wird (seltsam), oder zurück zur Lichtzonenmodellierung.
  • Median-Hintergrundverschmutzung: Maske hat Löcher an Stellen, wo die Person stand → Rumpf wird nicht farblich bearbeitet, erscheint fleckig. Lösung: Löcher füllen / mit Bbox.
  • 8-Bit-Banding: Starke Farbverschiebungen führen zu Farbbändern in Himmel/Verläufen → 1–3 Stufen Rauschen hinzufügen (ffmpeg noise=alls=6:allf=t+u) oder 10bit/HEVC ausgeben.
  • Untertitelkontrast: Abgedunkeltes Untervideo macht weiße Schrift deutlicher; wenn zu stark abgedunkelt auch die Person dunkler wird, muss die Person wieder aufgehellt oder mit Bloom versehen werden.

4. Gothic/Neon etc. Stilisierte Farbkorrektur (für statische Frames)

  • Gothic Rot-Schwarz (vom Benutzer bereits abgelehnt, nur zur Dokumentation): Untertitel\build\gothic_art.py's gothic_grade(): abdunkeln um 0,42–0,52, entsättigen auf 0,30–0,42, Mitten lila/rot, starke Vignette, Nebel.
  • Themenfarbversion (die der Benutzer letztendlich wollte): Weiß/Elfenbeinweiß als Hauptfarbe + Lavendel/Magentarosa Glow, Hintergrund in tiefes Schwarz-Lila; siehe Farbkonstanten in gothic_art.py (BLOOD/LAV/PINK/VIOLET).
  • Neon-Version: neon_wide.py (ASS zeichnet Neon direkt, keine Farbkorrektur nötig).
  • Schnelle Farbanpassung: Die drei Werkzeuge eq + colorbalance + vignette reichen, um eine lila Bühne in jeden Farbton zu drücken:
    • Kalt-Blau: colorbalance=bs=0.10:bm=0.12:bm... (Blau verschieben), Sättigung reduzieren;
    • Warm-Glut: colorbalance=rs=0.10:rm=0.08, eq=saturation=1.1.

5. Validierungscheckliste

  • 3–5 Frames ziehen: Ist die Trennung von Personenhelligkeit und Hintergrund natürlich, gibt es einen sichtbaren Rand der Lichtzone?
  • Nahaufnahme/Porträt: Ist das Gesicht überbelichtet, ist der Hautton verfälscht?
  • Gibt es in dunklen Bereichen Tiefschwarz/Farbbänder (8bit)?
  • Zusammen mit Untertiteln prüfen: Ist die weiße Schrift deutlich genug?
  • Ausgabe mit ffprobe auf korrekte Dauer/Bildrate prüfen; 10bit-Ausgabe mit -pix_fmt yuv420p10le -c:v libx265

6. Ressourcen

  • 5s-Endproduktparameter und Vergleich: Untertitel\Ausgabe\Farbtest\ (A natürlich/B verstärkt/Endprodukt-Richtung + Vergleichsvideo)
  • 30s-Untervideo: Untertitel\Ausgabe\S4S6_30s\_base_30s.mp4 (nur leicht abgedunkelt, keine vollständige Farbkorrektur)
  • Früher versuchte, aber abgelehnte Richtungen: Gothic (Untertitel\Ausgabe\Untertiteldesign\G1…G3), FLARE-Überbelichtung, Neon (Untertitel\Ausgabe\Untertitel-Muster) – zur Dokumentation mit Parameterreferenz.

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

muyunxue/dance-mmd-subtitle-kit

Hard rules, templates, ffmpeg commands and failure diagnosis for authoring ASS/SSA subtitles and burning them with libass on this machine. Load this before writing any ASS file, when a burn "succeeds" but no text appears, when text is misplaced/too big, when \p1 drawings are offset, or when you need the transparent-overlay export recipe. Contains the exact pitfalls hit in this project (timestamp format, style colour trailing ampersand, fontsdir, drawing anchor, chained \t, Permanent Marker sizing).

muyunxue/dance-mmd-subtitle-kit

Character-avoiding subtitle layout for the MMD dance videos — measure the dancer's per-frame bounding box, compute a per-cue union, place text in safe side/top columns, and verify zero overlap on every frame. Load this when asked 字幕不要挡住人物/完全不挡/避让, or when text overlaps wings/body and you need a verified-free layout with measured overlap counts.

muyunxue/dance-mmd-subtitle-kit

End-to-end recipe for making subtitles for the MMD dance videos in this workspace (字幕/ project) — probe the source, pick a segment, map LRC cues, choose a style, build ASS, burn, verify, and deliver. Load this when starting or resuming any subtitle task (静态稿/5s小样/30s小样/全片/透明叠加层), when a render "succeeded" but the video has no text, or when you need this project's paths, font list, cue sheet and acceptance criteria.

muyunxue/dance-mmd-subtitle-kit

Design and deliver subtitle style mockups and animated comparison samples for the MMD/K-pop dance videos — S1–S6 style catalogue (Y2K chrome, minimal kinetic, glitch, mix&match editorial, graphic emphasis, hand-marker), PIL/numpy effect recipes, font list, contact-sheet/comparison video conventions, and the parallel-subagent workflow used for S4 vs S6. Load this when asked 出几个静态帧方案/参考女团PV字幕/做个小样/对比几个风格, or when choosing a visual direction before building a full-length subtitle track.

Verwandte Skills