name: history-long-video
既存ショート動画を結合して、YouTube向けロング動画(横長 1920x1080)を制作するスキル。
output/{slug}/final.mp4)1. 企画定義(series.json の long フィールド)
2. AI監査: 事実確認 + 読み確認(Phase 1.5 参照)
3. ソースショート動画の確認(全 final.mp4 が存在するか)
4. compose-long-video.py でロング動画合成
5. Web UIで動画プレビュー確認
6. ユーザー確認(タイトル・説明文・サムネイルを提示)
7. YouTube アップロード(private → 確認 → public)
8. LEARNINGS.md に学びを追記
ロング動画は series.json の各シリーズ内 long フィールドで定義する。
構造例は references/example-series-long.json を参照。
各フィールド:
id: 出力ディレクトリ名(output/{id}/final.mp4)title: 動画タイトル。| で区切ると改行表示。【前編】【後編】 で分巻を明示chapters[].title: {時代名} — {サブタイトル} 形式。— で分割してカード表示chapters[].sourceSlug: ソースショート動画のスラグhistory-video-base の「AI監査ポリシー」に従い、合成前に必ず実行する。
Claude Code が series.json の long フィールド内テキストを監査する:
title: 動画タイトルの歴史的正確さchapters[].title: 各チャプター名の時代名・サブタイトルが正しいかチャプタータイトルは VOICEVOX でナレーション化される。
Claude Code が各タイトルの難読語・歴史固有名詞を抽出し、base-dictionary.json に辞書エントリがあるか確認。
未登録なら base-dictionary.json と VOICEVOX ユーザー辞書の両方に追加。
audio_query API に投げ、返ってきたカタカナ読みを全文チェックpriority: 10 で辞書再登録し、修正後に全テキストを再テストテストスクリプト: scripts/voicevox-reading-test.py
3レイヤーすべて通過してから合成に進む。
すべてのソースショートが制作済みか確認する。
# 各ソースの final.mp4 存在確認
for slug in jomon-yayoi kofun-asuka nara ...; do
ls scripts/video-gen/output/$slug/final.mp4
done
未制作のショートがあれば、先に history-short-video スキルで制作する。
VOICEVOX Engine を起動してから実行すること。 VOICEVOX の設定詳細は history-video-base を参照。
cd ~/Dev/content-studio/scripts/video-gen
python3 compose-long-video.py {long-id}
# e.g., python3 compose-long-video.py jidai-long-zenpen
ベース辞書登録(register_base_dict())
base-dictionary.json の全語を VOICEVOX ユーザー辞書に一括登録VOICEVOX でナレーション生成
"{シリーズ名}。{タイトル}。""第N章、{時代名}。{サブタイトル}。"オープニングカード生成(横長 1920x1080)
チャプターカード生成(各章の冒頭)
ショート動画を横長変換
クロージングカード(CTA エンドカード)
assets/cta-endcard-landscape.png(横長版、QRコード付き)全セグメント結合
YouTube チャプターマーカー生成
output/{id}/chapters.txt に MM:SS チャプター名 形式で出力| 項目 | 正しい方法 | やってはいけないこと |
|---|---|---|
| concat 時の音声 | -c:v copy -c:a aac -b:a 128k | -c copy(音声もコピーするとシーク時にデコーダ破綻) |
| カードの音声チャンネル | -ac 2(ステレオに統一) | モノラルのまま結合(ショートがステレオなので不一致でノイズ発生) |
| moov atom | -movflags +faststart 必須 | faststart なし(シーク時に無音・ガチャガチャ音) |
| 動画配信 | public/video-output symlink で静的配信 | 自作 Range request ハンドラ(バグの温床) |
音声チャンネル統一方針・ffmpeg 共通オプションの詳細は history-video-base を参照。
動画プレビューの仕組みは history-video-base を参照。
http://localhost:3001/videos/series/{series-id}
YouTubeサムネイル(1280x720)を作成する。
output/{id}/thumbnail.html)サムネイルデザイン方針:
cd ~/Dev/content-studio/scripts/youtube-upload
python3 upload.py \
--video {long-id} \
--test \
--title "タイトル" \
--description "説明文"
スクリプト: scripts/youtube-set-thumbnail.py
テンプレートと注意事項: references/template-youtube-description.md
スクリプト: scripts/youtube-publish.py