name: history-short-video
日本史をテーマにしたショート動画(TikTok・YouTube Shorts)を制作するスキル。
テーマが指定されていない場合、以下の手順でユーザーに提案する:
totalParts が2以上なら、タイトルに【前期】【後期】等を付ける~/Dev/content-studio/scripts/video-gen/templates/{テーマ名}/scenes.json を新規作成scenes.json を読み、フォーマット・文体・シーン構成を踏襲~/Dev/content-studio/scripts/video-gen/output/{テーマ名}/1. テーマ選定 → scenes.json 作成(10〜12シーン推奨、フックシーン + 本編)
- display: テロップ表示テキスト兼TTS入力(漢字)
- image: 画像ソース情報(wikimedia / ai)+ caption(日本語、Wikimediaのみ)
- dictionary: 読み上げリスクのある用語のVOICEVOX辞書登録情報
2. 事実確認AI監査(scenes.json 作成直後に必ず実行)
→ Claude Code が scenes.json の全 display テキストを通読し、歴史的事実を監査
→ 詳細は Phase 1.5 を参照
3. タイトルカード生成(scene01 が `title-card` の場合)
→ title-card.html 作成 → スクリーンショット → scene01.jpg
4. 画像調達(詳細は history-video-base を参照)
5. コンテンツレビュー(テロップ・画像ソース・画像を一覧確認)
→ https://content-studio-kt.vercel.app/workflows/tiktok-video/images
6. 読み取得 + AI読み監査(合成前に必ず実行)
→ python3 synthesize-narration.py {テーマ} --readings-only
→ Claude Code が readings.json を読み、誤読パターンを監査(音読み/訓読み、人名、年号)
→ 問題があれば base-dictionary.json or scenes.json の dictionary に追加
→ 修正後、再度 --readings-only で確認。AI監査パスまで繰り返す
7. ナレーション合成(AI監査パス後に実行)
→ python3 synthesize-narration.py {テーマ}
8. テロップ生成(必ず `generate-from-scenes.py` を使うこと)
→ telop.ass を手動や別スクリプトで生成すると、craftgarden ブランドスタイルが崩れる
9. 動画合成(必ず `compose-video.py` を使うこと)
→ python3 compose-video.py {テーマ}
画像を差し替えた場合は該当シーンの _clip.mp4 を削除してから実行
10. 整合性チェック(verify-sync.py)
11. ユーザー確認(投稿タイトル・説明文・動画パスを提示して承認を得る)
12. TikTok投稿(tiktok-publisher)
13. X投稿(動画付きツイート — xurl media upload → post)
display はテロップ表示とTTS入力を兼ねる。
\n は改行として表示display_to_narration() が \n を自動処理
。 に変換(間を作る)例: "奈良時代\n80秒でわかる時代の流れ" → テロップ: 2行表示 / TTS: "奈良時代。80秒でわかる時代の流れ"
時代の流れシリーズは統一フォーマット:
{時代名}\n{尺}秒でわかる時代の流れ
例: "奈良時代\n80秒でわかる時代の流れ"
時代が前期/後期に分割されている場合(企画データで totalParts > 1):
{時代名}【前期】\n{尺}秒でわかる時代の流れ
{時代名}【後期】\n{尺}秒でわかる時代の流れ
例: "平安時代【前期】\n80秒でわかる時代の流れ"
分割判定: 企画データ(data.ts)の totalParts を必ず確認。2以上ならタイトルに【前期】【後期】(3分割なら【前期】【中期】【後期】)を付ける。タイトルだけ見てどのパートか分からない動画は視聴者を混乱させる。
読点(、)の配置がナレーションの「間」を作る。句点(。)= 長い間、読点(、)= 短い間。
| パターン | 読点を入れる | 例 |
|---|---|---|
| 主語が長い | 主語の後 | 「ヤマト政権は、各地の豪族を束ねた。」 |
| 接続詞の直後 | 接続詞+、 | 「しかし、蘇我氏の専横は止まらない。」 |
| 動作の列挙 | 動詞の連用形+、 | 「防人を配置し、水城を築く。」 |
| 強調したい語の前 | 語の前に、 | 「その権力の象徴が、巨大古墳。」 |
| 対比・転換 | 転換点に、 | 「豪族の連合体から、天皇中心の国家へ。」 |
声に出して読み、自然に息継ぎする位置に読点を打つ。
フォーマット例: references/example-scenes.json
各フィールド:
id: シーンID(scene00〜scene12)style: "hook"(冒頭フック、3秒程度の問いかけ)/ "title"(タイトルカード)。省略時は Body スタイルkeywords(任意): テロップ内でアクセントカラー(accent-leaf)で強調表示する語のリストimage.source: "wikimedia" / "ai" / "title-card"(scene01のみ)image.file / image.prompt: ソースに応じた取得情報image.credit: ライセンス情報(AI生成は null)。日本語推奨(例: "パブリックドメイン")image.caption(任意): Wikimedia画像の日本語説明。キャプション表示に使用display: テロップ表示テキスト兼TTS入力(漢字、\n で改行)dictionary(任意): VOICEVOX ユーザー辞書登録情報のリスト(読み上げリスクのある用語)scenes.json の安全な変更ルール(エージェント使用時に必須):
len(scenes) が変わったら変更をロールバック。シーンの追加・削除は禁止dictionary フィールドの書き方:
surface: 漢字表記(displayに含まれる語)pronunciation: カタカナ読みaccent_type(任意、デフォルト0)、word_type(任意、デフォルト PROPER_NOUN)、priority(任意、デフォルト9)synthesize-narration.py が自動で辞書に登録(既存の重複はスキップ)templates/{テーマ}/dictionary.json にも配置可能display の行幅制限(1行あたり最大15全角文字):
generate-from-scenes.py が自動チェックし、超過行を警告する\n で分割することこの1ファイルから生成されるもの:
telop.ass ← display + タイミング(シーンごとのナレーション実尺から計算)narration.txt ← display を display_to_narration() で変換(TTS入力用)credits.txt ← image.credit をまとめて出力fetch-images.sh ← image.source + file/prompt から画像取得コマンド自動生成ツール:
python3 scripts/vi