video-edit について
動画編集やソーシャルメディア向け制作に使える、7 つのスクリプトからなるツールキットです。無音除去、自動字幕、縦型クロップ、YouTube の分割、圧縮、3D トランジションを扱います。
主な機能
- 01音声検出で無音部分を除去
- 02字幕を生成して動画に焼き込み
- 03顔を追跡して縦型にクロップ
- 04YouTube 動画を取得して章ごとに分割
- 05プラットフォーム別プリセットで圧縮
- 063D スイベルのティーザーを挿入
活用シーン
- 01ソーシャル動画の無音除去と字幕付け
- 02横長映像を縦型動画にクロップ
- 03YouTube 動画を章ごとのクリップに分割
- 04投稿先に合わせて動画を圧縮
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ aiagentwithdhruv/ skills --skill video-editインストール後、Claude Code で/video-editを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/auto_captions.pycompress_video.pyinsert_3d_transition.pyjump_cut_vad_singlepass.pysimple_video_edit.pyvertical_crop.pyyoutube_clip.py詳細
動画編集ツールキット
目標
無音区間の削除、自動字幕生成、縦向きクロップ、YouTube のクリップ作成、圧縮、3D トランジションまで、動画制作の全工程に対応します。
スクリプト(全7本)
| スクリプト | 用途 |
|---|---|
jump_cut_vad_singlepass.py | ニューラル VAD(Silero)で無音区間を削除します |
auto_captions.py | スタイル付き字幕を生成して焼き込みます(Whisper + FFmpeg) |
vertical_crop.py | 顔追跡で 16:9 → 9:16 に自動クロップします |
youtube_clip.py | YouTube からダウンロードし、AI でチャプターごとにクリップします |
compress_video.py | プラットフォーム別プリセットでソーシャルメディア向けに圧縮します |
simple_video_edit.py | 全工程のパイプライン:無音区間の削除 + 文字起こし + メタデータ + アップロード |
insert_3d_transition.py | 3D スイベルのティーザーを挿入します |
クイックスタートのレシピ
レシピ 1:ソーシャルメディア向け全工程パイプライン
# 1. Remove silences
python3 ./scripts/jump_cut_vad_singlepass.py input.mp4 .tmp/edited.mp4
# 2. Add captions
python3 ./scripts/auto_captions.py .tmp/edited.mp4 .tmp/captioned.mp4 --word-level --max-words 2
# 3. Crop to vertical for Shorts/Reels
python3 ./scripts/vertical_crop.py .tmp/captioned.mp4 .tmp/vertical.mp4
# 4. Compress for platform
python3 ./scripts/compress_video.py .tmp/vertical.mp4 output.mp4 --preset instagram-reel
レシピ 2:YouTube → Shorts パイプライン
# 1. Download + auto-clip YouTube video
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --auto-clip --output-dir clips/
# 2. Add captions to best clip
python3 ./scripts/auto_captions.py clips/chapters/01_intro.mp4 .tmp/captioned.mp4 --word-level
# 3. Crop to vertical
python3 ./scripts/vertical_crop.py .tmp/captioned.mp4 .tmp/vertical.mp4
# 4. Compress for YouTube Shorts
python3 ./scripts/compress_video.py .tmp/vertical.mp4 short.mp4 --preset youtube-shorts
レシピ 3:クイック編集 + アップロード
# All-in-one: silence removal + transcription + metadata + Auphonic upload
python3 ./scripts/simple_video_edit.py --video input.mp4 --title "My Video"
スクリプト 1:VAD による無音区間の削除
ファイル: ./scripts/jump_cut_vad_singlepass.py
仕組み
- 音声を WAV(16kHz モノラル)として抽出します
- Silero VAD を実行して音声区間を検出します
- 近接した区間を結合し、パディングを追加します
- FFmpeg の trim+concat を使い、1 回の処理で区間を結合します
- hevc_videotoolbox(H.265、17Mbps、30fps)でハードウェアエンコードします
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--min-silence | 0.5 | カットする無音時間の最小値(秒) |
--min-speech | 0.25 | 残す音声時間の最小値(秒) |
--padding | 100 | 音声の前後に追加するパディング(ミリ秒) |
--merge-gap | 0.3 | この時間より近い区間を結合します(秒) |
--keep-start | true | 常に 0:00 から開始します |
使用方法
python3 ./scripts/jump_cut_vad_singlepass.py input.mp4 output.mp4
python3 ./scripts/jump_cut_vad_singlepass.py input.mp4 output.mp4 --min-silence 1.0 --padding 200
処理時間
49 分の 4K 動画で約 8 分
スクリプト 2:自動字幕生成
ファイル: ./scripts/auto_captions.py
仕組み
- faster-whisper を使って動画を文字起こしします(単語レベルのタイムスタンプ)
- SRT 字幕を生成します(セグメントレベルまたは単語レベル)
- FFmpeg でスタイル付き字幕を動画に焼き込みます
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--model | base | Whisper モデル:tiny、base、small、medium、large-v3 |
--language | auto | 言語を指定します(en、es、hi など) |
--word-level | false | 短くテンポのよい字幕にします(一度に 1~3 語) |
--max-words | 3 | 単語レベルモードでの字幕あたりの最大単語数 |
--font-size | 22 | 字幕のフォントサイズ(縦向き動画では自動調整) |
--font-color | white | テキストの色:white、yellow、cyan、green、red、orange、pink |
--outline-color | black | アウトラインの色 |
--position | bottom | 字幕の位置:bottom、top、middle |
--srt-only | false | SRT のみを生成し、焼き込みは行いません |
--srt-path | auto | SRT の出力先を指定します |
--bold | true | テキストを太字にします |
使用方法
# Basic captions
python3 ./scripts/auto_captions.py input.mp4 output.mp4
# Word-level (CapCut/Submagic style)
python3 ./scripts/auto_captions.py input.mp4 output.mp4 --word-level --max-words 2
# Yellow captions at top
python3 ./scripts/auto_captions.py input.mp4 output.mp4 --font-color yellow --position top
# SRT only (no burn)
python3 ./scripts/auto_captions.py input.mp4 --srt-only
# High accuracy
python3 ./scripts/auto_captions.py input.mp4 output.mp4 --model large-v3
依存関係
pip install faster-whisper
スクリプト 3:縦向きクロップ
ファイル: ./scripts/vertical_crop.py
仕組み
- 動画全体からフレームをサンプリングします
- OpenCV Haar cascade を使って顔を検出します
- 顔の位置を平滑化し、揺れを抑えます
- 話者を中央に配置して 16:9 → 9:16 にクロップします
- 動く被写体の場合:動画を 2 秒のチャンクに分割し、チャンクごとに追跡します
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--ratio | 9:16 | 目標のアスペクト比(例:9:16、4:5、1:1) |
--position | auto | クロップ位置:auto(顔追跡)、left、center、right |
--smoothing | 30 | 平滑化に使用するフレーム数 |
--sample-interval | 5 | 検出のために N フレームごとにサンプリングします |
使用方法
# Auto face-tracking crop
python3 ./scripts/vertical_crop.py input.mp4 output.mp4
# Square crop (Instagram post)
python3 ./scripts/vertical_crop.py input.mp4 output.mp4 --ratio 1:1
# 4:5 crop (Instagram feed)
python3 ./scripts/vertical_crop.py input.mp4 output.mp4 --ratio 4:5
# Center crop (no tracking)
python3 ./scripts/vertical_crop.py input.mp4 output.mp4 --position center
依存関係
pip install opencv-python numpy
スクリプト 4:YouTube クリップ
ファイル: ./scripts/youtube_clip.py
仕組み
- yt-dlp で動画をダウンロードします(最大 4K)
- 利用可能な場合は YouTube のチャプターを抽出します
- 利用できない場合は AI でチャプターを生成します(Whisper + Claude)
- 動画をチャプターごとのファイルに切り分けます
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--download-only | false | ダウンロードのみ実行し、クリップは作成しません |
--max-quality | 1080 | 最大画質:480、720、1080、1440、2160 |
--audio-only | false | 音声のみダウンロードします(MP3) |
--start | none | クリップの開始位置を手動で指定します(秒) |
--end | none | クリップの終了位置を手動で指定します(秒) |
--auto-clip | false | AI によるチャプター検出とクリップ作成 |
--use-yt-chapters | true | 利用可能な場合は YouTube のチャプターを使用します |
--max-clips | none | クリップ数を制限します |
--whisper-model | base | 文字起こしに使用する Whisper モデル |
--reencode | false | クリップを再エンコードします(正確なカット) |
--output-dir | .tmp/clips | 出力ディレクトリ |
使い方
# Download only
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --download-only
# Auto-clip into chapters
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --auto-clip
# Extract specific range
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --start 60 --end 180 -o clip.mp4
# Download audio only
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --audio-only
# Top 3 clips only
python3 ./scripts/youtube_clip.py "https://youtube.com/watch?v=..." --auto-clip --max-clips 3
依存関係
pip install yt-dlp faster-whisper anthropic
スクリプト 5:動画圧縮
ファイル: ./scripts/compress_video.py
プラットフォームのプリセット
| プリセット | 解像度 | CRF | 最大時間 | 最大サイズ | 備考 |
|---|---|---|---|---|---|
youtube | 1080p | 18 | なし | なし | 高画質 |
youtube-shorts | 1080x1920 | 20 | 60s | なし | 縦向き |
instagram-reel | 1080x1920 | 23 | 90s | なし | 縦向き |
instagram-post | 1080x1080 | 23 | 60s | なし | 正方形/縦向き |
tiktok | 1080x1920 | 23 | 180s | なし | 縦向き |
twitter | 1080p | 23 | 140s | 512MB | ビットレートを自動調整 |
linkedin | 1080p | 23 | 600s | 200MB | ビットレートを自動調整 |
telegram | 720p | 28 | なし | 50MB | ボット用 |
whatsapp | 720p | 28 | 120s | 16MB | 強力な圧縮 |
small | 480p | 30 | なし | なし | 手軽な共有 |
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--preset | none | プラットフォームのプリセット(上の表を参照) |
--resolution | 1080 | 最大高さ(ピクセル) |
--crf | 23 | 画質(0=無劣化、51=最低画質) |
--audio-bitrate | 128k | 音声ビットレート |
--target-size | none | 目標ファイルサイズ(MB) |
--max-duration | none | 最大時間(秒) |
--list-presets | false | すべてのプリセットを表示 |
使い方
# Platform preset
python3 ./scripts/compress_video.py input.mp4 output.mp4 --preset instagram-reel
python3 ./scripts/compress_video.py input.mp4 output.mp4 --preset whatsapp
# Target file size
python3 ./scripts/compress_video.py input.mp4 output.mp4 --target-size 25
# Custom
python3 ./scripts/compress_video.py input.mp4 output.mp4 --resolution 720 --crf 28
# List all presets
python3 ./scripts/compress_video.py input.mp4 output.mp4 --list-presets
スクリプト 6:シンプルな動画編集(全工程)
ファイル: ./scripts/simple_video_edit.py
仕組み
- FFmpeg で無音を検出してカットします
- 音声を正規化します(loudnorm)
- Whisper で文字起こしします
- Claude が YouTube のメタデータ(概要+チャプター)を生成します
- Auphonic にアップロードし、YouTube に非公開の下書きとして投稿します
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--video | required | 入力動画のパス |
--title | required | YouTube のタイトル |
--thumbnail | none | サムネイル画像のパス |
--no-upload | false | Auphonic へのアップロードをスキップします |
--no-normalize | false | 音声の正規化をスキップします |
--upload-only | false | 編集をスキップし、アップロードのみ実行します |
--silence-threshold | -35 | 無音しきい値(dB) |
--silence-duration | 3.0 | 無音の最小時間(秒) |
使い方
# Full pipeline
python3 ./scripts/simple_video_edit.py --video input.mp4 --title "My Video"
# Local only
python3 ./scripts/simple_video_edit.py --video input.mp4 --title "Test" --no-upload
依存関係
pip install anthropic faster-whisper requests python-dotenv
# Requires: ANTHROPIC_API_KEY, AUPHONIC_API_KEY in .env
スクリプト 7:3D スイベルティーザー
ファイル: ./scripts/insert_3d_transition.py
仕組み
- 動画の後半からフレームを抽出します(デフォルト:60 秒以降)
- Remotion を使って 3D 回転する「スイベル」アニメーションを作成します
- 動画を分割します:イントロ → トランジション → メインコンテンツ
- 音声を保持したまま再エンコードして結合します
CLI 引数
| 引数 | デフォルト | 説明 |
|---|---|---|
--insert-at | 3 | ティーザーの挿入位置(秒) |
--duration | 5 | ティーザーの時間(秒) |
--teaser-start | 60 | コンテンツのサンプリング開始位置(秒) |
--bg-color | #2d3436 | 背景色(16 進数) |
--bg-image | none | 背景画像のパス |
最終タイムライン
[0-3s intro] [3-8s swivel teaser @ 100x] [8s onwards: edited content]
Audio: Original audio plays continuously
依存関係
pip install torch # For Silero VAD (jump_cut script)
brew install ffmpeg node # macOS
cd video_effects && npm install # For Remotion 3D rendering
すべての依存関係(一度だけインストール)
# Core (required for all scripts)
brew install ffmpeg
# Silence removal
pip install torch
# Auto-captions + YouTube clip
pip install faster-whisper
# Vertical crop
pip install opencv-python numpy
# YouTube download
pip install yt-dlp
# AI features (chapters, metadata)
pip install anthropic
# Full pipeline (simple_video_edit)
pip install requests python-dotenv
# 3D transitions
brew install node
cd scripts/video_effects && npm install
トラブルシューティング
| 問題 | 解決策 |
|---|---|
| カットが不自然に感じる | jump_cut で --padding 200 を指定します |
| カットが多すぎる | jump_cut で --min-silence 1.0 を指定します |
| 字幕が小さすぎる | auto_captions で --font-size 32 を指定します |
| 縦型動画が検出される | フォントのサイズが自動的に 1.3 倍になります |
| QuickTime で再生できない | hvc1 コーデックタグが設定されていることを確認してください |
| 顔が検出されない | vertical_crop で --position center をお試しください |
| YouTube のダウンロードに失敗する | yt-dlp を更新します:pip install -U yt-dlp |
| ファイルサイズが大きすぎる | --preset whatsapp または --target-size 25 を使用します |
| ハードウェアエンコーダーが失敗する | ソフトウェア(libx264)に自動的に切り替わります |
技術的な詳細
- macOS:ハードウェアエンコーディング(hevc_videotoolbox / h264_videotoolbox)
- フォールバック:CRF を使用した libx264/libx265
- オーディオ:AAC 128-192kbps
- QuickTime との互換性のために
hvc1コーデックタグを使用します - すべてのスクリプトで
--helpを指定すると、引数の一覧を確認できます
スキーマ
入力
| 名前 | 型 | 必須 | 説明 |
|---|---|---|---|
input_video | file_path | はい | 入力動画ファイルのパス |
recipe | string | いいえ | パイプラインのレシピ:full-social、youtube-shorts、quick-edit |
preset | string | いいえ | 圧縮プリセット:youtube、instagram-reel、tiktok、whatsapp など |
出力
| 名前 | 型 | 説明 |
|---|---|---|
output_video | file_path | 処理済み動画ファイルのパス |
認証情報
| 名前 | ソース |
|---|---|
ANTHROPIC_API_KEY | .env(AI のチャプター用) |
AUPHONIC_API_KEY | .env(アップロード用) |
組み合わせ可能なもの
このスキルと組み合わせやすいスキル:pan-3d-transition、recreate-thumbnails
コスト
ローカルでは無料(FFmpeg + Silero VAD)
コメント
Markdown 対応