リールの編集
すべての処理はユーザー自身のMac上で実行されます。有料サービスは一切不要です。処理を行うスクリプトはレポジトリルートのscripts/edit.shで、このファイルと同じディレクトリにあるscripts/edit_reel.pyを呼び出します。
ユーザーは技術に詳しくありません。平易な日本語で、短い文、専門用語を使わずに話してください。何をするかを事前に伝え、その後で何が起こったかを説明します。ダッシュ記号(―)は使用しないでください。
目次
- クイックパス
- 動画の入手方法
- 1回の編集で行われること
- ユーザーが変更を依頼できる設定
- 引き渡す前のチェック
- 結果の報告方法
- 問題が発生した場合
- 厳守ルール
クイックパス
- セットアップが完了しているか確認します:
scripts/setup.sh --check。NOT READYと表示された場合は、CLAUDE.md(オンボーディング)に従ってください。インストールを自己判断で行わないでください。 - 動画を入手し(下記参照)、次を実行します:
- ファイル名指定:
scripts/edit.sh "<動画ファイルのパス>" - Inboxフォルダの最新N個:
scripts/edit.sh --latest 3
- ファイル名指定:
- 下記のチェックを実行し、画像を確認し、キャプションを読んでから報告します。
30〜60秒のクリップは、Appleシリコン搭載Macで約1〜2分、古いMacではそれ以上かかります。
動画の入手方法
次の順序で、最初に成功した方法を使用します:
- ユーザーが指定またはドラッグしたファイル。 元の場所で使用します。元のファイルを移動したり削除したりしないでください。
- Inboxフォルダ。 ユーザーがAirDropまたは
Inbox/(レポジトリフォルダ内)にドロップしたファイル。 - iCloud写真。 iCloudがセットアップされている場合のみ(
docs/ICLOUD.md)。Apple IDのメールアドレスはconfig.jsonのicloud_apple_idにあります。scripts/icloud-fetch.sh <apple id> 30を実行します。- 成功すると
ICLOUD_FETCH_OKと表示されます。最新の動画がInbox/に保存されます。 - サインインの期限が切れている場合(約2ヶ月有効)または最初から実行されていない場合、
ICLOUD_FETCH_FAILEDと表示されます。自分で修正しようとせず、ユーザーに伝え、docs/ICLOUD.mdの「再サインイン」手順を案内してください。ユーザー自身がターミナルでパスワードと6桁のコードを入力します。チャットでは決して入力させないでください。 - 「最新」とは、最も最近撮影されたものを意味します。撮影したばかりの動画がiCloudに反映されるまでには数分かかることがあるため、該当の動画が見つからない場合はその旨を伝え、1分後に再試行することを提案してください。
- 編集前に、最新の動画を長さとともに一覧表示し(
ffprobeで長さを確認)、不明な場合はどれを意味するか確認してください。
- 成功すると
- 何も機能しなかった場合。 代替案として、動画をMacにAirDropするか、Inboxフォルダにドラッグするよう提案します。
1回の編集で行われること
順番に:
- 音声によるカット。 音声のラウドネスから、実際に声が始まる場所と終わる場所を検出します(キャプションタイム、つまりクリップの先頭にある音声認識タイムは無音内に位置し、デッドエアを隠す可能性があるため)。先頭と末尾の無音部分をトリミングし、長い間を短縮します。カットは最も近い無音の瞬間に配置され、各継ぎ目には15msのフェードが適用されるため、単語が途切れることはありません。文はそのまま保持され、デッドエア以外は削除されません。
- ミラーチェック。 フロントカメラのクリップはしばしばミラーリング(反転)されています。フレーム内のテキスト(看板、画面、服のロゴなど)をOCRで正方向と反転方向で読み取り、実際の単語が反転方向で正しく読めた場合のみ動画を反転します。目視による判断は行いません。読み取れるテキストがない場合は動画をそのままにし、その旨を報告に含めます。
- 9:16にクロップし、1080x1920にリサイズします(横向きクリップは中央がクロップされます)。
- カラー調整。 数フレームを測定し、露出、コントラスト、彩度を控えめに補正します。やりすぎにならないように上限が設定され、before/afterシートが生成されます。HDRのiPhoneクリップはまず標準色域にマッピングされます。
- スタジオサウンド。 ノイズ除去、ボイスイコライジング、ディエッサー、コンプレッサー、リミッター、そしてラウドネスを-14 LUFSに調整します。これは測定に基づいて調整されています。耳で判断します:音が耳障りだったり、薄かったり、過度に処理されていると感じる場合は、
audio.strengthをlightに設定します。 - キャプション。 クリーンアップされた音声を文字起こしし、Pillowを使用してキャプションを描画します。スマートフォンのセーフゾーン内(1080x1920フレーム上でx: 90〜960、y: 250〜1520)に配置されるため、ボタンやアプリのテキストで隠れることはありません。アクティブな単語の色が変わります。アウトラインは暗いままです。単語の後ろに色付きのボックスは配置しません。顔の上にボックスがかかると柔らかく見えるためです。
- 出力。
Edited/<名前>-edited.mp4と、Edited/checks/<名前>/内に:contact-sheet.jpg、colour-before-after.jpg、caption-frame.png、captions-words.txt、report.json。
ユーザーが変更を依頼できる設定
すべてconfig.json(レポジトリルート、config.default.jsonから作成され、config.default.jsonは編集されません)にあります。ユーザーはファイルに触れることはありません。ユーザーが平易な言葉で依頼し、あなたが変更して編集を再実行し、結果を表示します。設定の完全な対応表はdocs/STYLE.mdにあります。
例:
- 「キャプションを黄色にして」は
captions.highlight_color(アクティブな単語)またはcaptions.color(すべての単語)を設定します。不明な場合はどちらかを尋ねてください。 - 「キャプションを大きくして」は
captions.sizeを約12増やします(デフォルト78)。結果がセーフゾーン内に収まるようにしてください。スクリプトがinside_safe_zoneを報告します。 - 「キャプションを上に移動して」は
captions.positionをmiddleまたはupperに設定します。 - 「一度に一単語ずつ」は
captions.styleをwordに設定します。「行単位」でlineに戻します。 - 「キャプションなし」は
captions.enabledをfalseに設定します。 - 「色を控えめに」は
grade.strengthを0.2下げます。「カラーグレーディングなし」はgrade.enabledをfalseに設定します。 - 「もっとタイトにカットして」は
cuts.tightnessをtightに設定します。「余白をもっと残して」はgentleに設定します。 - 「音が処理されすぎ」:
audio.strengthをlightに設定します。 - 「顔をもっと近くに」:
framing.zoomを1.15に設定します(最大1.4)。 - キャプションの名前の綴りが間違っている場合:
vocabularyに追加します(リスナーが正しく認識するのに役立ちます)。それでも間違っている場合は、replacementsに{"heard": "正しい綴り"}として追加します。
変更後、同じ動画で編集を再実行し、新しい結果を表示します。Edited/のファイルを使用します。再実行すると、同じ名前の古い編集は置き換えられます。
引き渡す前のチェック
スクリプトはサマリーを出力し、report.jsonを書き込みます。それでもあなたが確認する必要があります。
- 数値。
loudness_ok、start_ok、end_okがすべてtrueである必要があります。先頭の無音は0.45秒以下、末尾の無音は0.75秒以下である必要があります。そうでない場合はその旨を伝え、--tightness tightを付けて再実行します。 - 画像を確認 読み取りツールで:
contact-sheet.jpg(顔がフレーム内にあるか、画像が自然に見えるか、キャプションが画面内にあるか)、colour-before-after.jpg(左がオリジナル、右がグレーディング後: 肌が自然でオレンジや灰色になっていない、白が飛んでいない、黒がつぶれていない)、caption-frame.png(すべての単語を拡大して読み、背景に対して各単語が読めるか)。 - キャプションを読む。
captions-words.txtを開きます。音声認識は名前やローカルな単語(ブランド名など)を聞き間違えることがあります。vocabularyとreplacementsで修正し、再実行します。レポートのcaption_vs_sound_matchを確認します。0.9未満の場合は何かがおかしいので調査します。 - ミラー。
report.jsonのmirrorを確認します。decisionがunknownで、フレーム内にテキスト(看板、画面)がある場合、フレームを確認してテキストが正しく読めるかチェックします。逆になっている場合は、framing.mirror_fixをalwaysに設定して再実行します。 - 音声によるデッドエア。 スクリプトは最終ミックスに対して
silencedetectを実行します。この目的でキャプションタイムを信頼しないでください。
あなたは音声を聞くことはできません。その旨を正直に伝えてください。音声は調整され測定されていますが、最終的な判断はユーザーの耳に委ねられます。
結果の報告方法
短く、平易に、次の形式で:
- ファイルの場所と、開き方(Finder、リールエディタフォルダ内の
Editedフォルダ)。 - 何をカットしたか(「先頭の1.1秒の無音を取り除き、2箇所の長い間を短縮しました。36秒から33秒になりました」)。
- 画像が反転されたかどうかとその理由。
- 音声の現在の測定値(「約-14で、InstagramやTikTokの通常レベルです」)。
- キャプション: フォント、色、変更した単語。
- 修正できなかった点と、それを変更するためにユーザーが何と言えばよいか。
その後、変更したい点を尋ね、上記の設定リストから1〜2のアイデアを提案します。
問題が発生した場合
- 「音声が見つかりません」: クリップが無音か音楽のみです。その旨を伝えてください。
- キャプションの位置が間違っている、または切れている: レポートの
inside_safe_zoneを確認します。sizeを小さくします。 - フォントが見つからない: スクリプトはArial Blackにフォールバックし、その旨を出力します。内蔵フォント(
docs/STYLE.md)のいずれかを提案するか、Google Fonts(fonts.google.com)から無料フォント(.ttf)を~/.reel-editor/fonts/にダウンロードし、captions.fontをファイル名(.ttfなし)に設定します。 - セットアップツールがない:
scripts/setup.shを実行します。Homebrewがない場合は、CLAUDE.mdに従ってください。 - 編集に非常に時間がかかる: 3分を超える4Kクリップは負荷が高いです。その旨を伝えて実行を続行します。
厳守ルール
- ユーザーの元の動画を決して削除したり変更したりしないでください。
- パスワードや6桁のコードをチャットで要求したり受け取ったりしないでください。
- 有料サービスは使用せず、ユーザーの動画をどこにもアップロードしないでください。すべてこのMac上に留まります(iCloudからのダウンロードを除く)。
- ユーザーが依頼しない限り、スクロールプロンプトや「フォローしてね」のようなオーバーレイは追加しないでください。
- ユーザーが言っていないことは追加しないでください。キャプションには発言された内容のみを表示します。