Communityライティング&編集github.com

muyunxue/dance-mmd-subtitle-kit

ASS/SSA 字幕编写と libass 焼き込みのための厳格なルール、テンプレート、ffmpeg コマンド、および障害診断。このスキルは、ASS ファイル作成前や、焼き込みが「成功」しても文字が表示されない場合、テキストの位置ずれ・サイズ過大、\p1 描画オフセット、透過オーバーレイ書き出しレシピが必要な場合に読み込んでください。本プロジェクトで実際に遭遇した落とし穴(タイムスタンプ形式、スタイル色の末尾アンパサンド、fontsdir、描画アンカー、連鎖 \t、Permanent Marker のサイズ問題)をすべて含んでいます。

dance-mmd-subtitle-kit とは?

このスキルは、ASS/SSA 字幕を正しく作成し、libass を使用して ffmpeg で映像に焼き込むための実戦的な知識を提供します。ユーザーが実際に遭遇した4つの致命的なフォーマット上の落とし穴(タイムスタンプ形式は `H:MM:SS.cc` でなければならない、スタイル行の色末尾に `&` をつけてはいけない、fontsdir は相対パスと作業ディレクトリ管理が必須、ASS ファイルは `utf-8-sig` かつ ASCII ファイル名にする)を詳細に解説します。さらに、色とアルファの意味論、フォントファミリー名の厳密な指定(PIL による確認方法)、一般的なアニメーションタグの一覧とその使用上の注意、\(\p1\) 描画アンカーや連続 \t の競合といった実践的なトラップを網羅しています。ffmpeg を用いた直接焼き込み、透明オーバーレイ(VP9 + alpha)、フレーム抽出検証のコマンド例、さらに Python による ASS ジェネレーターの骨格コードも含まれており、Claude Code や Cursor のような AI エージェントが自動字幕生成や修正を実行する際の信頼できるベースラインとなります。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/muyunxue/dance-mmd-subtitle-kit/tree/HEAD/skills/ass-render-playbook

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ASS 書き込み / libass 焼き込み 実戦マニュアル

1. ヘッダーテンプレート(そのままコピー)

[Script Info]
ScriptType: v4.00+
PlayResX: 2560
PlayResY: 1080
WrapStyle: 2
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.709

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: X,Microsoft YaHei,100,&H00F4F1EA,&H00F4F1EA,&H00140F11,&HFF000000,0,0,0,0,100,100,0,0,1,0,0,5,30,30,30,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.39,0:00:03.75,X,,0,0,0,,{\an5\pos(500,300)\fnAnton\fs150\1c&H00F4F1EA&\bord3\3c&H00140F11&\frz-4\fscx118\fscy118\t(0,130,\fscx100\fscy100)\fad(100,100)}WALK

2. 四つの致命的なフォーマット落とし穴(本プロジェクトですべて経験済み)

  1. タイムスタンプは H:MM:SS.cc でなければならない
    • 正:0:00:01.50、0:01:02.30
    • 誤:0:01.50(libass が Bad timestamp を報告、その行全体が破棄 → 動画全体に字幕が表示されないが、ffmpeg は終了コード 0)
  2. Style 行の色の末尾に & をつけてはいけない
    • 正:&H00F4F1EA,&H00F4F1EA,&H00140F11,&HFF000000
    • 誤:&H00F4F1EA&,... → Style 行の解析に失敗 → 同じく「成功したが字幕なし」
    • イベント内のインラインタグの色には & が必要:\1c&H00F4F1EA&
  3. フォントディレクトリ fontsdir は相対パス + 作業ディレクトリ管理
    • 出力ディレクトリに fonts/ を置き、cd でそのディレクトリに移動してから ass=x.ass:fontsdir=fonts とする。
    • ドライブ文字を含む絶対パスはフィルターグラフで問題を起こしやすい。日本語の相対パスは問題ない(cwd は日本語可だが、フィルター引数内はできるだけ ASCII にすること)。
  4. ASS ファイルは utf-8-sig で書き、ASCII ファイル名にする
    • フィルター引数内の日本語ファイル名は不安定。_s4.ass のような名前にする。

診断コマンド(libass が実際に何を読み取っているか確認する):

& $ff -hide_banner -v verbose -f lavfi -i "color=c=0x303040:s=2560x1080:r=30:d=2" `
  -vf "ass=_s4.ass:fontsdir=fonts" -c:v libx264 -crf 22 -pix_fmt yuv420p _t.mp4 2>&1 | Select-String 'Bad timestamp|Style|font file'

3. 色 / アルファの意味論

  • 色:&HBBGGRR&(青・緑・赤の順)、例:白 &H00F4F1EA&、墨黒 &H00140F11&、ピンク &H00B35CFF&、ラベンダー &H00FFA4C4&、クリーム &H00D7EEF8&、金 &H0054C9FF&。
  • 透明度 \1a:&H00& は完全不透明、&HFF& は完全透明(16進数が大きいほど透明)。初期バージョンで点滅が効かなかったのはアルファが逆だったため。
  • Style 行の PrimaryColour は &HAABBGGRR(AA が先頭、末尾 & は不要)。

4. フォント

  • libass は fontconfig/directwrite を使用するため、ファミリー名が正確でなければならない。PIL で確認する:
from PIL import ImageFont
ImageFont.truetype(r"...\fonts\Anton-Regular.ttf", 40).getname()  # ('Anton','Regular')
  • 本プロジェクトで使用するフォント:Anton / Archivo Black / Bebas Neue / Permanent Marker / Silkscreen / Rubik Glitch / Bungee / Monoton / Pirata One / UnifrakturCook;システムフォントの Georgia、Microsoft YaHei は直接 \fnGeorgia、\fnMicrosoft YaHei で指定可能。
  • Permanent Marker は libass 内で実際には約 0.79×fs になる。この係数に基づいてフォントサイズや色ブロックの寸法を調整すること。
  • グリフ不足(♥ ★ など)は自動的に ArialMT にフォールバックされる。表示はされるが字形が異なる。正確に表示したい場合は \fnMicrosoft YaHei を使用する。

5. アニメーションタグ早見表

タグ使用法
\fad(in,out)ミリ秒単位のフェードイン/アウト
\move(x1,y1,x2,y2,t1,t2)位置移動(\pos とは排他的、move が優先)
\t(t1,t2,\tag...)時間補間、例 \t(0,130,\fscx100\fscy100\blur(0))
\frz / \fscx / \fscy回転/拡縮(負の値で反転可能)
\blur(n)ぼかし(大きな文字が現れる前にぼかし→クリアにすると効果的)
\clip(x1,y1,x2,y2)矩形クリッピング(スライス/スキャンライト/出現効果)
\org(x,y)回転/拡縮の中心点
\p1+描画コマンドm 0 0 l w 0 w h 0 h 矩形など

落とし穴:同一属性に連続した \t を2つ指定すると片方しか適用されない(例:ルールラインの収縮アニメーション)。これは2つのイベントに分割するか、2回に分けて描画することで回避する。 落とし穴:\p1 描画の座標は左上隅をアンカーとし、さらに libass はブロック全体を高さの半分だけ上に移動させる。\an7\pos(左上隅) + 絶対座標が最も安定。回転/スキャンアウトには \org で原点を指定する。 落とし穴:蛍光ペンの色ブロックをテキストの後ろで「スキャンアウト」させたい場合、描画レイヤーで \fscx0 → \t(0,150,\fscx100) とし、原点は \org で指定する。

6. レンダリングコマンド

6.1 直接焼き込み(最も一般的)

cd 出力ディレクトリ
& $ff -v error -y -i _base_30s.mp4 -vf "ass=_s4.ass:fontsdir=fonts" `
  -c:v libx264 -preset medium -crf 16 -pix_fmt yuv420p -movflags +faststart OUT.mp4

30秒 / 2560×1080 / 中文字幕量 で約 1–3 分。

6.2 透明オーバーレイ(編集ソフト用)

& $ff -v error -y -f lavfi -i "[email protected]:s=2560x1080:r=30,format=rgba" `
  -vf "fps=30,ass=_sub.ass:alpha=1" -t 154.6 `
  -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -crf 30 -row-mt 1 -auto-alt-ref 0 `
  -metadata:s:v:0 alpha_mode=1 OUT_alpha.webm
  • デコードには -c:v libvpx-vp9 が必須。ネイティブの vp9 デコードではアルファが失われる。
  • 互換性優先の「スクリーンオーバーレイ」mp4:黒背景+明るい文字。編集ソフトでスクリーン/覆い焼き(リニアライト)ブレンドモードを使用。

6.3 フレーム抽出での確認(レンダリングログではなく画像で確認)

& $ff -v error -ss 12.4 -i OUT.mp4 -frames:v 1 -q:v 2 -y _check.jpg

注意:-ss を -i の前に置いた場合(入力シーク)、特定の状況で ASS タイムラインが出力に相対的にリダイレクトされ、プレビューが空白になることがある。検証用のフレーム抽出には出力側シーク(-i OUT.mp4 -ss 12.4)を使用するか、全体を切り出してからフレームを選ぶこと。

7. トラブルシューティング早見表

現象原因修正方法
映像全体に文字が一切表示されないタイムスタンプ形式 / Style 色末尾 &H:MM:SS.cc に修正。Style 色の末尾 & を削除
一部の文が表示されないその行のタイムスタンプが間違っている、または start>end各行を確認
文字が非常に小さい/書体が異なるフォントファミリー名が間違っているPIL getname() で確認
\p1 色ブロックが上/下にずれる描画アンカー + libass が高さの半分だけ上に移動\an7 +左上絶対座標 +実測でフレームをキャリブレーション
回転中心が合わないデフォルト中心が意図と異なる\org(x,y) を追加
フェードアウトが効かない/点滅が逆アルファの意味が逆&H00 不透明、&HFF 透明
30秒のレンダリングで最初の4行だけしか表示されないループが最初の数行しか処理していないイベント生成ループの範囲を確認
日本語パス/ファイル名でレンダリング失敗フィルター引数内に非ASCII文字が含まれているASS と元動画は ASCII ファイル名を使用し、日本語の cwd はそのままにする

8. ジェネレーター骨格(Python)

def ts(sec):
    h=int(sec//3600); m=int(sec%3600//60)
    return "%d:%02d:%05.2f" % (h,m,sec-h*3600-m*60)

class Ass:
    def __init__(self,path,w=2560,h=1080): self.ev=[]; self.path=path; self.w=w; self.h=h
    def add(self,layer,t0,t1,tags,text): self.ev.append((layer,t0,t1,tags,text))
    def write(self):
        head = open("template_header.ass",encoding="utf-8").read()  # またはコード内にインライン化
        lines=[]
        for layer,t0,t1,tags,text in sorted(self.ev,key=lambda e:(e[0],e[1])):
            lines.append("Dialogue: %d,%s,%s,X,,0,0,0,,{%s}%s"%(layer,ts(t0),ts(t1),tags,text))
        open(self.path,"w",encoding="utf-8-sig",newline="\n").write(head+"\n".join(lines)+"\n")

参照実装:字幕/build/styles_anim.py(S2/S4/S6)、flare_wide.py、neon_wide.py、avoid_side2.py。

Individual skills in this repo

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

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.

muyunxue/dance-mmd-subtitle-kit

Subject-aware colour grading for the MMD dance videos in this workspace — make the dancer stand out (background dim/cool/desat, subject lift/warm/sharpen/bloom) using either a soft stage-light ellipse or a hard character matte, with ffmpeg recipes, measured parameter sets and known failure modes (cast-shadow matte contamination, banding, truncated sources). Load this when asked to 调色/突出人物/压背景/统一色调, or when a graded clip shows weird bright blobs around the dancer.

関連スキル