1仕組みと動作原理
開始条件の厳格化:ナレーションタイムラインが確定した後にのみ実行し、audio-sync-assemblyとのタイミング主導権の競合を回避。
Use this skill after the narration timeline is stable.
二重の信頼できる情報源(SoT)の分離:テキスト文面はユーザーの台本原本から、表示タイミングは最終版の無音BGMナレーションマスターから取得し、両者を混同・代替しない。
- Use the user's script as wording source. - Use the final narration-only master as timing source.
字幕タイミングの鉄則:先頭の単語と同時に表示、常に1行のみ表示、句読点と大文字小文字を維持、無音のフックや無音CTAには字幕を出さない。
Start the caption when the first word is spoken.
スタイル変更時は全編焼き込み前に必ず単一フレームプレビューを実施:最も視覚的密度の高いフレームを抽出し、フォントサイズ、背景ボックス透明度、マージン、横幅を調整した上で全編焼き込みを実行。
Preview style before burning the full video when style changes.
BGMベッドの合格基準は「ストリームの存在」ではなく「実際に聴こえること」:ダッキングパラメータとミキシングチェーンを提示し、技術的に存在していても聴こえない場合はベッド音量を上げるか閾値を下げることを明記。
If music is "technically there" but inaudible, raise bed or reduce ducking threshold.
音源テイル戦略:原曲が動画より先に終了する場合は、音楽的に意味のある後半セクションから再開し、最終拍を切り落とさない十分な長さを確保、緩やかにフェードアウトさせ、ユーザー指定の末尾無音を保持。
If the music source ends early, restart from a musically useful tail section.
主観的な音量判断を網羅した10ステップのベッド構築手順(ソースオフセット、フック音量、ナレーションベッド音量、密な説明区間の音量、ポーズ時のダッキング維持、CTA音量、終了位置、フェードアウト、リミッターミキシング)。
1. Probe source music duration. 2. Pick source start offset.
2コア機能
3外部依存関係
| Kind | Dependency / Endpoint |
|---|---|
| cli | ffmpeg 滤镜链(aresample / aformat / asplit / sidechaincompress / amix / alimiter)用于旁白与音乐床的 ducking 混音 |
| package | ASS(Advanced SubStation Alpha)字幕格式与样式头,由 templates/caption-style.ass 提供起点 |
| package | 仓库根脚本 scripts/build_ass_captions.py(把 JSON/CSV 的 start/end/text 事件展开为单行 ASS,默认每行 ≤58 字符)——本 skill 只点名样式模板未点名该脚本,脚本归属在仓库层 |
| package | 输入素材:用户提供的脚本文本、最终旁白母版、音乐源文件(本地资产,非外部服务) |
| package | 字体 Arial(写死在 ASS 样式行的 Fontname 字段;渲染机无此字体会被 libass 替换字体,影响观感) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトまたはコマンドの実行: (ホストエージェントによる実行)ffmpeg:字幕焼き込みおよび音声ミキシングチェーン(aresample/aformat/asplit/sidechaincompress/)
- 本地工作目录: ファイルの読み書きと成果物出力: captions/ 配下の ASS 字幕ファイル
5二重目の独立検証
- [ok] 「无外部依赖、素材不出网」是否成立 — 本目录正则扫描零命中 URL/fetch/token;音乐源与脚本均声明为用户提供(Music source rules 只讲 offset/duck/tail)。无上传、无生成服务、无账号额度消耗,不构成橙档。
- [ok] ducking 片段是否是可执行 filter_complex — music-ducking.md 给的是四行完整链(asplit 出 narr/side 经 sidechaincompress 得 ducked 再 amix inputs=2 duration=first 后 alimiter=limit=0.95),参数(threshold=0.028:ratio=4:attack=18:release=260)具体非占位,可原样拼接。
- [ok] ASS 模板能否被仓库脚本直接复用 — templates/caption-style.ass 结构与 scripts/build_ass_captions.py 的 header_from_template 期望一致:脚本取 Dialogue: 之前的部分当 header;模板 [Events] Format 行的字段数(Layer,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text)与脚本输出的 Dialogue 行匹配。
- [discrepancy] 「本 skill 负责生成 ASS」是否被 SKILL.md 声明 — SKILL.md 只给样式起点与规则,未点名 scripts/build_ass_captions.py;把字幕文件从哪来写进脚本清单的是 render-qa-and-surgical-changes 与仓库 README。若只加载本件,agent 需自行决定生成方式(手写 ASS 或调仓库脚本)。
- [discrepancy] 字体依赖是否被声明 — ASS 样式行写死 Fontname=Arial,但 SKILL.md 与 references 均未提示字体缺失风险;Linux 渲染机常无 Arial,libass 会回退替换字体,字号与行宽观感与预览不同。该风险真实存在但文档未覆盖。
- [ok] QA 判据是否可自动验证 — SKILL.md 把听觉/视觉可读列为主判据(Check music is present and audible, not merely technically in the stream.),并给 probe 音频流作为辅助——即承认脚本只能验一半,另一半需人耳/人眼预览。
6結論
07c0b567449820c1…