Communitygithub.com

Qsnh/video-make

ナレーション付き解説動画、チュートリアル、製品プロモーション動画をコードで作成するスキル。TTS音声合成、字幕、HTMLアニメーションのフレームレンダリングによるMP4出力、カバー画像、チャプタータイムスタンプ、公開用コピー文案を生成します。TTSの発音ミス、字幕と音声のズレ、フレームレンダリングの破綻、カバー画像のトリミング問題も解決します。

video-make とは?

このスキルは、コードベースでナレーション付き動画を生成するための包括的なワークフローを提供します。B站(横画面チュートリアル)、Douyin/RedNote/微信视频号(縦画面ショート動画)向けに最適化されています。テキストスクリプトからTTS音声を生成し、ASR(音声認識)で発音を検証、音声に基づいて正確なタイムラインを作成します。HTMLでアニメーションを定義し、フレームごとにレンダリングしてffmpegで合成するため、編集の再現性が高く、音声を変更してもアニメーションのタイミングを自動調整できます。また、動画カバー画像(B站用4:3、Douyin用9:16)や公開用のタイトル、タグ、紹介文も生成します。対応プラットフォームは主にB站、Douyin、RedNote、微信视频号で、解説・チュートリアル(2~5分)や製品プロモーション(20~40秒)に適しています。

対応~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/Qsnh/video-make-skill/tree/HEAD/skills/video-make

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

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

ドキュメント

コードでナレーション動画を作成する

概要

1本の動画 = 確定した台本 → 文ごとのTTS → 文ごとのASR検証 → タイムライン → HTMLアニメーション → フレームキャプチャ → ffmpeg合成。

核心原則:タイムラインは音声に基づく。 まず各文をTTSで生成し、検証し、各字幕セグメントの実際の開始・終了時間を測定します。その後、すべての画面アニメーションをこれらの時間に同期させます。画面に秒数をハードコードせず、ナレーションを変更したらタイムラインを再実行するだけです。レンダリングは、ページをフレームごとに __seek(t) でキャプチャし、結果は確定して再現可能です。

適用:解説・チュートリアル(2~5分)、製品プロモーション動画(20~40秒)、字幕とチャプター付きの知識系動画。 不適用:実写出演の編集、実写素材が必要な動画、純粋な音楽MV。

フロー

各ステップにはチェックポイントがあり、前のステップが完了していなければ次のステップに進みません。

#ステップ成果物チェックポイント参考
0初期化作業ディレクトリbash scripts/init.sh <dir> が成功後述
1テーマ選定、検証、台本script.md、audio/make_script.py事実を検証済み(実験が必要なものは先に実行);ユーザーが台本に明示的に同意してからナレーション開始references/script.md
2ナレーションaudio/raw/NN.wav → audio/clips/NN.wav(1.3倍速)各文をASRでチェック、問題があれば再録音references/voice.md
3タイムラインbuild/narration.wav、build/timeline.json字幕セグメントが音声と一致references/timeline.md
4素材実際の画面キャプチャ、実際のターミナル出力ナレーション内容と一致。サンプルドメインにはexample.comを使用references/capture.md
5合成comp/index.htmlコマ撮りとコラージュを1枚ずつ確認references/composition.md
6レンダリングdist/video.mp4長さ=タイムライン、ラウドネス -14 LUFSreferences/render.md
7カバー・コピーdist/cover-bili.png、dist/cover-douyin.png、dist/copy.txtカバーが各プラットフォームのトリミングセーフゾーン内にあるreferences/publish.md
8納品・クリーンアップユーザーに送付;ソースファイルをアーカイブユーザーが保存を確認してからクリーンアップ後述

初期化

bash scripts/init.sh ~/work/<プロジェクト>/video-<エピソード名> で、template/ を作業ディレクトリにコピーし、scripts/ を tools/ にコピーし、playwright-coreをインストールします。テンプレートはそのまま実行可能な30秒のデモです。作業開始前に以下のサンプルコンテンツを置き換えてください:

  • script.md、audio/make_script.py:今回の台本。チャプターは make_script.py の CHAPTERS でのみ定義し、チャプター間のポーズ、チャプターバー、チャプタータイムスタンプはすべてそこから導出します。
  • audio/direction.txt:TTSディレクションプロンプトの【シーン】。
  • asr-prompt.txt:今回の用語集(正式な表記、必要に応じて読み方付き)。
  • comp/index.html のシーンとアニメーション、comp/cover-*.html のカバー内容。

よく使うコマンド

作業ディレクトリ内で実行:

コマンド効果
python3 audio/make_script.pyaudio/script.json と audio/lines.json を生成
python3 tools/tts.py audio/lines.json audio/raw文ごとにナレーションを生成;テキストが同じ場合は既存の音声を再利用。台本を変更したらそのまま再実行
bash tools/speed.sh audio/raw audio/clips 1.3ピッチを変えずに速度変更
python3 tools/asr.py audio/clips --en文ごとに認識:プレーン / 用語プロンプト / 英語モード
python3 tools/takes.py 3,7 33、7番目の文をそれぞれ3テイク録音してスコアリング
python3 tools/takes.py audio/var.json 2同じ文の複数の言い回しをそれぞれ2テイク録音
python3 tools/tts.py audio/lines.json audio/raw --adopt 3 audio/takes/03-0-1.raw.wav特定のテイクを採用
python3 tools/build_audio.py audio/clips build audio/script.jsonナレーションを連結し、タイムラインを生成
python3 tools/align_chunks.py audio/clips build/timeline.json audio/script.json字幕セグメントを実際の発音にアライメント
node tools/render.mjs --timeline=build/timeline.json --stills=2,8.5,20コマ撮りを build/stills に出力(毎回空にしてから)
bash tools/contact.sh build/stills build/sheets2x2コラージュ、Readで画像確認
bash tools/render-par.sh build/timeline.json build/narration.wav dist/video.mp4 88プロセスで並列レンダリングと音声ミックス
node tools/render.mjs --html=comp/cover-4x3.html --width=1440 --height=1080 --png=dist/cover-bili.pngカバー画像出力
python3 tools/bili_kw.py "nginx 配置ssl证书" "宝塔 https"テーマ調査:B站のキーワード上位6件の再生数

依存関係:ffmpeg、Node 18+、ローカルのGoogle Chrome、Python 3 + requests + openai-whisper(small モデル)。TTSはXiaomi MiMoを使用、APIキーは環境変数 MIMO_API_KEY または MIMO_ENV_FILE が指すファイルから読み取り、どちらもなければユーザーに問い合わせます。他のTTSに変更する場合は、各文が1つのWAVファイルになることを保証してください。

最も間違いやすいポイント

  • 承認なしでナレーションを生成する。 台本はまずユーザーに送信し、「続けて」「開始」「OK」を同意とみなします。発音のために言い回しを変えた場合は、納品時に1つずつユーザーに伝えます。
  • 字幕とナレーションを同じテキストで書く。 字幕は人が見るもの(Nginx、443、1.3)、ナレーションはTTSが読むもの(Engine X、四四三、一点三)です。make_script.py では P(字幕, 読み方) で分けて記述し、各セグメントの読み方を連結すると全文のTTSテキストと一致するようにします。
  • 全体のミックスだけを聞く。 全体認識では英語の用語を誤認識するため、必ず文ごとに認識します。テイク選定ではプレーンスコアと --en の結果のみを使用します。用語プロンプト付きのprimeは、読み間違いも「修正」してしまうため、判定ルールはvoice.mdを参照してください。
  • 秒数をアニメーションにハードコードする。 最初の文以降のアニメーションはすべて T(文, セグメント) で記述します。速度変更や再録音で時間は変わります。
  • ページの先頭が空のまま。 カードが表示されるまで2~3秒間空で、止まっているように見えます。コンテンツはそのチャプターの最初の字幕セグメントで表示されるようにします。
  • 同じ要素に複数の fill: both アニメーションや重複したID。 WAAPIはエラーを報告せず、要素が完全に消えたり、誤った状態で停止したりします。詳細はcomposition.mdを参照。
  • file:// でページを開いてレンダリングする。 CSSマスクなどが機能しません。render.mjs は内蔵のローカルHTTPサーバーを起動します。
  • カバーがプラットフォームでトリミングされる。 B站は1枚の画像を4:3と16:9で同時にトリミングし、Douyinは9:16を3:4にトリミングします。コンテンツはセーフゾーン内に配置します。
  • ルール違反の誘導。 画面、カバー、コピーに実際のサイトURL、QRコード、連絡先を入れず、「見てみて」「検索して」と書きません。example.com などの予約済みサンプルドメインは、デモのインターフェースやターミナルで使用できます。クロスプラットフォーム公開の動画では、特定のコンテンツプラットフォームを例示しません。プロモーション動画では価格に触れません。
  • 成功を確認してから結果を見る。 進捗メッセージは、コマンドが完了し出力を確認した後に送信します。

納品とクリーンアップ

  1. 納品:完成動画、B站用4:3カバー、Douyin用9:16カバー、dist/copy.txt(タイトル、タグ、概要、チャプタータイムスタンプ)。B站動画はデフォルトでDouyinなどのプラットフォームにも配信されるため、縦型カバーとDouyin用コピーも合わせて出力します。ユーザーが明示的に1つのプラットフォームのみと指定した場合は、そのセットのみ出力します。発音のために変更した言い回しをすべてリストアップし、自信のないタイミングポイントはユーザーに確認を依頼します。
  2. ファイルがチャットツールのサイズ上限(一般的に30MB)を超える場合は、まず crf 22 のプレビュー版を送信し、高画質版の場所を説明します。大容量ファイルの送信がタイムアウトして再送した場合は、ユーザーが2通受け取る可能性があることを伝えます。
  3. ユーザーが素材の保存を確認した後:再利用可能なソースファイル(comp/ と使用した素材、audio/make_script.py、バリアント仕様、script.md、copy.txt、direction.txt、asr-prompt.txt、キャプチャスクリプト、lab/)をユーザーのテンプレートライブラリにアーカイブします(取り決めがない場合は保存場所をユーザーに確認、例:~/work/<プロジェクト>/video-template/<エピソード名>/)。diff -r で1つずつ比較して一致を確認してから、作業ディレクトリ、一時的なブラウザプロファイル、コンテナ、開発サーバー(PIDで強制終了、事前にコマンドラインを確認)、およびキャプチャのためにのみインストールしたフロントエンド依存関係を削除します。whisperモデルキャッシュとDockerイメージは保持します。

関連スキル