name: history-video-base
日本史動画(ショート/ロング共通)の制作基盤スキル。音声合成、画像調達、BGM、FFmpeg設定、ブランドカラー、プレビュー環境など、全動画で共通する仕様をまとめている。
全動画はステレオ(2ch), 44100Hz, AAC で統一する。
-ac 2 でステレオ変換assets/bgm_safe.mp3(ステレオ、44100Hz)amix でミックスするとステレオに統一される-ac 2 でステレオ変換が必要| エンジン | ポート | 用途 | イントネーション品質 |
|---|---|---|---|
| AivisSpeech | 10101 | ポッドキャスト動画(推奨) | BERTベースで自然 |
| VOICEVOX | 50021 | ショート動画ナレーション | pitch操作で補正が必要 |
AivisSpeech推奨の理由: Style-Bert-VITS2ベースでBERT(DeBERTa V2)がテキストの意味を理解し、調整なしでも自然なイントネーション・語尾を生成。MOSスコアで人間の録音と統計的に有意差なし(arXiv:2505.17320)。VOICEVOXのpitch操作による後処理が不要。
エンジン切り替えは characters.json の voice.engine フィールドで制御。 generate-podcast-video.py が自動でエンジン別のURLとパラメータ調整を行う。
# AivisSpeech を起動(port 10101)してから実行
python3 scripts/video-gen/synthesize-narration.py {テーマ名}
# VOICEVOXにフォールバックする場合
python3 scripts/video-gen/synthesize-narration.py {テーマ名} --engine voicevox
--engine voicevox でVOICEVOX(四国めたん, ID: 2)にフォールバック可能# AivisSpeech を起動(port 10101)してから実行
python3 scripts/video-gen/generate-podcast-video.py --template templates/{テーマ名}
漢数字→アラビア数字変換: AivisSpeechは「一六〇〇」を「16」と誤読する。preprocess_tts_text() / kanji_num_to_arabic() で自動変換。VOICEVOX用の synthesize-narration.py にも同機能あり。
scripts/video-gen/base-dictionary.json — 全テーマ共通のベース辞書(188語+)。新たに誤読を修正したら必ずここに追加scenes.json の dictionary フィールド — テーマ固有の難読語/user_dict_word API)POST /user_dict_word?surface=享保&pronunciation=キョウホウ&accent_type=0&word_type=PROPER_NOUN&priority=9
POST /accent_phrases?text=テキスト&speaker={id}
verify_readings() で数字の誤読を検出非推奨TTS: Google Cloud TTS(辞書登録不可)、Pollinations.ai TTS(日本語品質が低い)、macOS say(機械的)
すべての動画制作フローで、テキスト生成後・音声合成前に AI 監査を通すこと。 監査を通さずに合成・公開に進んではならない。
3レイヤー構成: 事実確認 → 読みAI監査 → 実文脈読みテスト
詳細は references/ai-audit-policy.md を参照。
セットアップスクリプト: scripts/ffmpeg-setup.sh
libfreetype, libass, harfbuzz が有効になり、ASS字幕方式が使える。
| オプション | 用途 | 備考 |
|---|---|---|
-movflags +faststart | moov atom をファイル先頭に移動 | 必須。 これがないとブラウザでのシーク時に無音や音割れが発生する |
-pix_fmt yuv420p | ブラウザ互換ピクセルフォーマット | 全動画で統一 |
-c:v libx264 -preset slow -crf 20 -profile:v high -level 4.1 | H.264 エンコード設定 | 高品質エンコード(v2: CRF 20, preset slow) |
画像ソース判断、Wikimedia Commons取得、AI生成(Pollinations.ai)、リサイズ、カラーグレーディングの詳細は references/image-procurement.md を参照。
基本ルール:
https://gen.pollinations.ai/image/{prompt}(他URLは誤り)BGMポリシー、ミックス手順、ラウドネス正規化、著作権チェックの詳細は references/bgm-policy.md を参照。
基本ルール:
| 名前 | HEX | 用途 |
|---|---|---|
| bg | #2E3B2D | 背景色 |
| accent-moss | #51704A | アクセント(ボックス背景) |
| accent-leaf | #6B8F71 | アクセント(バッジ) |
| bg-cream | #FAFAF5 | テキスト色 |
| highlight | #A8D5A2 | ハイライト |
制作した動画は Web UI でプレビュー・シーク確認できる。
http://localhost:3001/videos/{テーマ名} # 個別動画
http://localhost:3001/videos/series/{id} # シリーズ一覧(ショート/ロングタブ)
仕組み:
web/public/video-output → ../../scripts/video-gen/output への symlink<video src="/video-output/{slug}/final.mp4"> で Next.js が静的配信自作の Range request ハンドラ API route は使わないこと。 バッファ管理のバグでシーク時に無音や音割れが発生する。静的配信が最もシンプルかつ確実。
# gh api を使う。raw URL は 404 になる
gh api repos/ksato8710/history-quiz-app/contents/web/src/pages/admin/tiktok/data.ts --jq '.content' | base64 -d
詳細な対策表は [references/troubleshooting.md](ref