edit-video について
edit-videoは、単一動画や複数クリップを会話形式で編集するスキルです。文字起こしとペースの信号からEDLを作成し、プレビュー、時間調整、レンダリング、任意の字幕追加を行えます。
主な機能
- 01動画をJSONとMarkdownに文字起こし
- 02無音と発話ペースの信号を確認
- 03EDLで編集を計画
- 04編集をプレビューして時間を調整
- 05ffmpegのストリームコピーでレンダリング
- 06動画への字幕焼き込み(任意)
活用シーン
- 01録画動画の不要部分をカット
- 02複数クリップから選んだ箇所を結合
- 03物語の意図に沿って場面を並べ替え
- 04ショート動画に字幕を追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ silvabyte/ skills --skill edit-videoインストール後、Claude Code で/edit-videoを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
bun.lockpackage.jsontsconfig.jsonreferences/caption-style.mdedl-schema.mdnarrative-patterns.mdsignal-interpretation.mdscripts/adjust.test.tsadjust.tscaption.tspreview.tsrender.tstranscribe.tsscripts/lib/analyze.tsaudetic.tscaption.tsconfig.tsedl.test.tsedl.tsffmpeg.tstranscript.ts詳細
動画を編集する
文字起こし、編集の計画、レンダリングの3つのフェーズで、会話しながら動画を編集します。
前提条件
- bun — TypeScript ランタイム
- ffmpeg / ffprobe — 動画処理用(PATH に含まれている必要があります)
環境変数(任意。デフォルト値があります):
| 変数 | 用途 | デフォルト |
|---|---|---|
AUDETIC_API_URL | Audetic 文字起こしサービスの URL | https://audio.audetic.link |
コマンド
すべてのパスは、このスキルのディレクトリからの相対パスです。bun run で実行します。
| コマンド | 用途 |
|---|---|
scripts/transcribe.ts <video> | 単一の動画ファイルを文字起こしします — ファイルと同じ場所に JSON、Markdown 形式の文字起こし、分析ファイルを生成します |
scripts/transcribe.ts <directory> | ディレクトリ内のすべての動画ファイルを文字起こしします — ディレクトリ内に統合された JSON、Markdown 形式の文字起こし、分析ファイルを生成します |
scripts/preview.ts <edl.json> | レンダリング前に EDL を検証してプレビューします |
scripts/render.ts <edl.json> | ffmpeg のストリームコピーを使って EDL から最終動画をレンダリングします |
scripts/adjust.ts <edl.json> --segment N --start/--end <value> | 既存の EDL のタイムスタンプを調整するか、セグメントを削除します |
scripts/caption.ts <video> <transcript.json> | Shorts 風のキャプションを動画に焼き込みます(任意で --edl、--output を指定) |
ワークフロー — 単一ファイル
1. 文字起こし
bun run scripts/transcribe.ts <video-file>
音声を MP3 に圧縮して audetic 文字起こしサービスにアップロードし、動画と同じ場所に3つのファイルを生成します。
.json— 文字起こし結果(ツールで使用)-transcript.md— 読みやすい文字起こしテーブル-analysis.md— 信号フラグ(無音、発話速度など)を含む文字起こし
2. 編集を計画する
文字起こしと分析の両方を読みます。分析には機械的な信号が示されています。
| フラグ | 意味 |
|---|---|
gap:Xs | このセグメントの前にある X 秒間の無音 |
slow | 1秒あたりの単語数が0.5未満(タイピング、長い間、無音) |
silence | セグメント内で単語が検出されなかった |
| WPS 列 | 1秒あたりの単語数(値が高いほど発話が密) |
信号の詳細については、references/signal-interpretation.md を参照してください。
これらの信号と内容の理解を組み合わせて、どこを残し、どこをカットするか判断します。ツールが検出するのは無音と発話のペースです。不要な部分か内容のある部分かは、あなたが判断します。
編集プランが決まったら、EDL(Edit Decision List)JSON ファイルを作成します。
{
"output": "/absolute/path/to/output.mp4",
"segments": [
{ "source": "/absolute/path/to/video.mp4", "start": "00:00:00.000", "end": "00:02:15.500", "label": "Introduction" },
{ "source": "/absolute/path/to/video.mp4", "start": "00:05:30.000", "end": "00:12:45.200", "label": "Main discussion" }
]
}
- 各セグメントには、ソース動画の絶対パスを指定した
sourceフィールドが必要です - タイムスタンプは
HH:MM:SS.mmm形式(ffmpeg ネイティブ形式)で指定します - セグメントは再生順です。並べ替えると出力の順序も変わります
labelは任意で、各セグメントの内容を伝えるのに役立ちます- 出力に含まれるのは指定したセグメントのみで、それ以外はすべてカットされます
スキーマの全容については、references/edl-schema.md を参照してください。
3. プレビュー
bun run scripts/preview.ts <edl.json>
レンダリング前に必ずプレビューしてください。セグメントの内訳、残す部分とカットする部分の割合を表示し、EDL を検証します。
3a. 調整(反復編集)
プレビュー後、EDL を書き直す代わりに adjust.ts を使って、対象を絞って調整します。
# Trim 0.5s off the end of segment 1
bun run scripts/adjust.ts <edl.json> --segment 1 --end -0.5s
# Move the start of segment 2 earlier by 1 second
bun run scripts/adjust.ts <edl.json> --segment 2 --start -1s
# Extend the end of segment 3 by 2 seconds
bun run scripts/adjust.ts <edl.json> --segment 3 --end +2s
# Set end of segment 1 to an exact timestamp
bun run scripts/adjust.ts <edl.json> --segment 1 --end 00:05:30.000
# Remove segment 2 entirely
bun run scripts/adjust.ts <edl.json> --remove 2
セグメント番号は1始まりで、プレビュー出力に対応しています。相対的な差分には +Xs/-Xs を使います(小数にも対応)。絶対値は HH:MM:SS.mmm 形式で指定します。ツールは結果を検証し、更新された概要を出力します。
編集が適切になるまでプレビューと調整を繰り返してから、レンダリングします。
4. レンダリング
bun run scripts/render.ts <edl.json>
ffmpeg のストリームコピーを使います(高速ですが、最も近いキーフレームでカットします)。最終動画を生成します。
5. キャプション(任意)
bun run scripts/caption.ts <edited-video.mp4> <transcript.json> --edl <edl.json>
太字で中央揃えのキャプション(Hormozi スタイル)を動画に焼き込みます。編集後の動画のタイムラインに文字起こしの時間を対応させるには、--edl を使います。全体の再エンコードが必要です。
スタイルのデフォルト設定とカスタマイズについては、references/caption-style.md を参照してください。
ワークフロー — 複数のクリップ(ディレクトリ)
ユーザーが複数の短いクリップを1本の動画に編集したい場合に使用します。
1. すべてのクリップを文字起こしする
bun run scripts/transcribe.ts <directory>
すべての動画ファイル(*.mp4、*.mkv、*.mov、*.webm、*.ts)を検出してそれぞれ文字起こしし、次のファイルに統合した出力を作成します。
transcript.json— 各セグメントにsourceフィールドを含む、統合済みの文字起こしtranscript.md— Source列を含む、統合済みの読みやすい表analysis.md— Source列を含む統合済みの分析(クリップの境界でギャップ検出をリセットします)
2. 編集を計画する
単一ファイルの場合と同じ手順ですが、文字起こしと分析にSource列が含まれ、各セグメントの元のクリップが分かります。セグメントごとにsourceパスを指定したEDLを作成します。
{
"output": "/absolute/path/to/combined.mp4",
"segments": [
{ "source": "/absolute/path/to/clip001.mp4", "start": "00:00:02.000", "end": "00:00:12.000", "label": "Opening" },
{ "source": "/absolute/path/to/clip003.mp4", "start": "00:00:00.000", "end": "00:00:08.500", "label": "Key moment" },
{ "source": "/absolute/path/to/clip007.mp4", "start": "00:00:01.000", "end": "00:00:14.000", "label": "Closing" }
]
}
3. プレビューしてレンダリングする
単一ファイルのワークフローと同じです。プレビューでは、すべてのソースとその再生時間が一覧表示され、各セグメントのソースファイル名も表示されます。
4. キャプション(任意)
単一ファイルの場合と同じです。レンダリングした出力に対して、caption.tsを--edl付きで実行します。
ナラティブ編集
ユーザーが「不要な部分をカットする」以上の目標(テーマ、トーン、目標時間、対象視聴者など)を提示した場合は、ナラティブ編集を使用します。
パターンの全カタログについては、references/narrative-patterns.mdを参照してください。
思考プロセス:
- 文字起こしと分析を読み、個別の場面やコンテンツの要点を特定します。
- 指定されたナラティブの目標に合う場面を決めます。
- 最適な順序を決めます。時系列順も選択肢の1つですが、冒頭にフックを置く、段階的に盛り上げる、問いと答えを組み合わせる、冒頭と結末を呼応させる構成も検討します。
- 各セグメントにナラティブ上の役割を付けます。
- セグメントの再生時間を合計し、目標時間に合うか確認します。
ナラティブ上の役割を示すラベル:labelフィールドを使って役割を記録します(例:"HOOK: the punchline"、"SETUP: context"、"PAYOFF: resolution")。
**ナラティブのメモ:**EDLの任意フィールドnarrative_notesを使って、編集上の判断理由を記録します。
例:
{
"output": "/path/to/output.mp4",
"narrative_notes": "Goal: 60s punchy clip. Led with the reaction for hook, then backed into the setup.",
"segments": [
{ "source": "/path/to/video.mp4", "start": "00:05:30.000", "end": "00:05:55.000", "label": "HOOK: surprised reaction" },
{ "source": "/path/to/video.mp4", "start": "00:01:00.000", "end": "00:02:15.500", "label": "SETUP: reading the tweet" },
{ "source": "/path/to/video.mp4", "start": "00:06:00.000", "end": "00:06:30.000", "label": "PAYOFF: final take" }
]
}
出力ファイル名
単一ファイルモード
scripts/lib/config.tsのoutputPaths関数は、動画を基準とした標準パスを生成します。
| 出力 | パターン |
|---|---|
| 文字起こしJSON | <name>.json |
| 文字起こしMD | <name>-transcript.md |
| 分析MD | <name>-analysis.md |
| EDL | <name>-edl.json |
| 編集済み動画 | <name>-edited.mp4 |
| キャプション付き動画 | <name>-captioned.mp4 |
ディレクトリモード
directoryOutputPaths関数は、ディレクトリ内にパスを生成します。
| 出力 | パターン |
|---|---|
| 文字起こしJSON | transcript.json |
| 文字起こしMD | transcript.md |
| 分析MD | analysis.md |
セッションの流れ
単一ファイル
- ユーザーから動画ファイルのパスを受け取ります
- そのファイルに対して
transcribe.tsを実行します -analysis.mdファイルと-transcript.mdファイルを読みます- 残す部分やカットする部分についてユーザーと相談します(または、ナラティブの目標を受け入れます)
- EDL JSONファイルを作成します(各セグメントの
sourceは動画を指します) preview.tsを実行して検証し、ユーザーと一緒に確認します 6a. 調整が必要な場合は、adjust.tsを実行して対象を絞って調整します(必要に応じてプレビューと調整を繰り返します)render.tsを実行して最終動画を作成します- (任意)ユーザーがShorts形式のキャプションを希望する場合は、
--edl付きでcaption.tsを実行します - 出力パスと最終的な再生時間を報告します
複数のクリップ
- ユーザーからクリップを含むディレクトリを受け取ります
- そのディレクトリに対して
transcribe.tsを実行します - ディレクトリ内の統合済み
analysis.mdとtranscript.mdを読みます - 使用するクリップやセグメントについてユーザーと相談します
- EDL JSONファイルを作成します(各セグメントの
sourceは対応するクリップを指します) preview.tsを実行して検証し、ユーザーと一緒に確認します 6a. 調整が必要な場合は、adjust.tsを実行して対象を絞って調整します(必要に応じてプレビューと調整を繰り返します)render.tsを実行して結合した動画を作成します- (任意)ユーザーがShorts形式のキャプションを希望する場合は、
--edl付きでcaption.tsを実行します - 出力パスと最終的な再生時間を報告します
ヒント
- キーフレームによる精度の限界:ストリームコピーでは最も近いキーフレームでカットするため、カット位置が最大で約0.5秒ずれる場合があります。再エンコードせずに高速でレンダリングするためのトレードオフです。
- 長い動画:文字起こしにかかる時間は動画の長さに比例します。30分を超える動画の場合は、時間がかかる可能性があることをユーザーに伝えてください。
- 必ず最初にプレビューする:プレビューせずにレンダリングしてはいけません。プレビューで検証エラーを検出でき、確定前にユーザーが内容を確認できます。
- 再生時間の目標設定:目標の再生時間が指定された場合は、選択したセグメントについて、分析結果の
Dur列の値を合計してください。EDL が目標に収まるまで調整を繰り返します。 - シグナルを捉え直す:間は単なるカット候補ではなく、トピックの境界を示しています。テンポの遅いセグメントも、必ずしも退屈とは限りません。気づきの前の間がドラマチックな効果を生むこともあります。
- コーデックの混在:異なるソースのクリップを組み合わせると、プレビューツールがファイル拡張子の混在を警告します。同じデバイス/アプリで撮影したクリップであれば、通常は問題ありません。
- 字幕の再エンコード:字幕の焼き付けにはフルビデオエンコードが必要(ストリームコピーではありません)なため、レンダリングより時間がかかります。開始前にこの点をユーザーに伝えてください。
- 反復的な調整:最初の EDL を作成した後、トリミングやセグメントの延長といった細かな調整には
adjust.tsを使用してください。タイムスタンプの計算を処理するため、小さな変更のたびに EDL を書き直す必要はありません。 - 字幕を提案する:ユーザーが Shorts、Reels、TikTok、またはショート動画について言及した場合は、レンダリング後に Shorts 風の字幕を追加することを提案してください。