トーキングヘッドクリップレビュー
生のトーキングヘッド映像を、誰かが手動でスクラブすることなく承認済みのセレクトに変換します。エージェントが文字起こし、位置合わせ、提案を行います。人は1つのページで承認します。エージェントは承認されたものを正確にアセンブルします。
文字起こしはマシン上に留まります。ソース動画は決して変更されません。
ハードルール
- ソース動画を変更、移動、再エクスポートしないでください。すべてはイン/アウトポイントと派生ファイルです。
- ユーザーの映像を削除したり、ゴミ箱を空にしたりしないでください。ディスク容量が不足している場合は、その旨を伝え、ユーザーに任せてください。
- スクラッチフォルダから作業してください。プレビュー、ポスター、レビューページ、セレクトのみがメディアの隣に配置されます。
- 文言をでっち上げないでください。クリップテキストはトランスクリプトから取得します。オプションのフレーズ修正は、
--fixで渡されるJSONマップに記述されています(references/term-corrections.example.jsonを参照)。サンプルファイルは適用しないでください。 - カメラで語られた事実(時刻、数字、「10分前」)は、選択する前に実際の録画と照合してください。
- 保持するスパンには、モニターの一瞥、マイクのバンプ、クリック音、呼吸音を含めないでください。再編集後は、最初のセレクト時だけでなく、必ず視線チェック(ステップ5)を再実行し、すべての編集ポイントを聞いてください。ノイズはミュートまたはカットし、その隣の単語は絶対にカットしないでください。
- ピックアップや再録音したラインは、メインテイクのトーン、レベル、部屋の響きと一致している必要があります(同じマイク、ゲイン、距離、EQ、ノイズ除去)。こもった音や箱の中のような音になるラインは、出荷せずにフラグを立ててください。
- ユーザーに書くものには、emダッシュではなくハイフンを使用してください。
- 単語境界は絶対的な制限です。プロンプトがタイトなカットや視線トリムを要求した場合でも同様です。クリップには、Whisperの単語時間(単語の端はしばしば早すぎたり遅すぎたりします)の前後に0.15秒のプリロールと0.25秒のテールを付けますが、隣接する単語に重ならないようにクランプします。ポーズと視線トリムは、単語間のギャップ内のみをカットし、各単語の隣に少なくとも0.1秒を残します。視線が外れている部分が話し言葉と重なる場合は、その単語を保持し、フラグを立ててください(
away_words、ストリンガウトでは赤い枠線)。決してカットしないでください。エッジトリムには、独自のトリミングスクリプトを書く代わりにbuild_review.py --gaze-trimを使用してください。手動で設定されたexact_spansも、単語エッジに押し戻されます。
セットアップ(マシンごとに1回)
scripts/check_deps.sh を実行してください。ffmpeg、ffprobe、python3、および1つのWhisperバックエンドが必要です。Swiftは視線ステップにオプションで必要です。インストール手順: references/setup.md
レイアウト
WORK/ スクラッチフォルダ、例: ./talk/
tx/<take>.wav|json|txt 16 kHz モノラルオーディオ、単語を含むWhisper JSON、読み取り可能なトランスクリプト
picks.json ビート+候補(エージェントが編集)
picks_resolved.json 単語精度のスパン、テキスト、時間(生成)
pose.json 視線外れインターバル(オプション、macOS)
REVIEW/ メディアの隣、例: ./review/
previews/<take>.mp4 ページ用の540p H.264コピー
posters/<beat>-<i>.jpg
"<Title> - take review.html"
"<Title> - picks stringout (540p).mp4"
SELECTS/ selects.json, selects.csv, selects.edl, selects.mp4
エピソードは作品にちなんで命名してください(例: launch-01)。テイクキーは短く(A、B、C)保ち、picks.json でファイル名にマッピングしてください。
ステップ
- インベントリ. 各テイクを
ffprobeで確認します(時間、サイズ、fps、回転)。スマートフォン映像は可変フレームレートで縦向きであることがよくあります。プレビューとレンダリングはそれを正規化します。どのファイルがカットするグレーディング済みエクスポートで、どれが無視するカメラオリジナルかを尋ねてください。 - 文字起こし.
python3 scripts/transcribe.py --out WORK/tx TAKE...を実行します。Whisperパッケージがデフォルトのpython3にない場合は、check_deps.shが報告したインタプリタを使用してください。ファイルがまだエクスポート中の場合は、バックグラウンドで--watch FOLDER --expect Nを使用します。各ファイルが30秒間成長を停止するまで待機します。Apple Siliconでの推奨モデル:mlx-community/whisper-large-v3-turbo、単語タイムスタンプ、condition_on_previous_textはオフにしてください。音声が英語でない場合は--langを設定してください。 - ピックをドラフトする。
- モード (a)、1つのスクリプトのテイク: 1行に1行または1トークポイント(IDが必要な場合は
id | name | text)を記述したWORK/script.txtを書き込みます。python3 scripts/segment.py takes --tx WORK/tx --script WORK/script.txt --out WORK/picks.json A=take-a B=take-b ...を実行します。各テイク内の各行の試行をすべて見つけ(あいまいな単語ウィンドウマッチ、再開は別の候補として表示されます)、最も流暢なものを事前にチェックします。 - モード (b)、1つの長い動画:
python3 scripts/segment.py single --tx WORK/tx --out WORK/picks.json A=long-takeを実行すると、1.2秒以上のポーズと文の終わりで区切り、4〜40秒のクリップに分割します。 - 次に、自分で
.txtトランスクリプトを読んでください。イン/アウトポイントを修正し、再スタートやグリッチにはcut: [[a,b]]を追加し、ビートをマージまたは分割し、候補ごとに実際のwhy(クリーン、再スタート、間違った単語、スクリーンレコーディングと一致)を記述してください。一致するスクリーンレコーディングで撮影されたテイクを優先してください。自動スコアは同点の場合のみ使用されます。
- モード (a)、1つのスクリプトのテイク: 1行に1行または1トークポイント(IDが必要な場合は
- ページをビルドする。
python3 scripts/build_review.py --work WORK --media SRC --out REVIEW --title "launch-01" --stringoutを実行します。スパンは0.6秒以上の単語間ギャップで分割され、silencedetect -35dB / 0.35sで締め付けられます。候補にkeep_pauses: trueを追加すると、その分割をスキップします。パディングフラグ:--pre 0.15 --tail 0.25 --guard 0.1。実際のフレーズマップがある場合にのみ--fix path/to/corrections.jsonを渡してください。HTMLをブラウザで開きます。動画はクリックで読み込まれるため、ページは高速に開きます。 - オプション、macOS: 視線。
python3 scripts/gaze.py --work WORK --review REVIEWを実行し、その後ステップ4を--stringout --gaze-trimで再実行します。視線が外れているフレームはストリンガウトで赤い枠線が表示されます。後でスクリーン映像でカバーし、オーディオは保持します。 - 人間によるレビュー。 ユーザーに何をすべきか伝えてください: 再生、Use/Skip、メモ、その後「Save decisions (JSON)」。
<slug>-decisions.jsonがダウンロードされます。「Copy as text」がフォールバックです。触っていないカードは提案を保持します。 - ノートを適用する。 決定JSONを読み取ります。すべてのノートを
picks.jsonの編集に変換します:cut、in/out、audio_only: true、grade: "eq=gamma=1.28:brightness=0.03"、optional: true。最初にバックアップを取ってください(cp picks.json picks.before-notes.json)。ステップ4を再実行し、各ノートと行った処理を要約します。 - アセンブルする。
python3 scripts/assemble.py --work WORK --media SRC --decisions /path/to/<slug>-decisions.json --out SELECTS --renderを実行します。フレーム精度のフル解像度selects.mp4、CMX3600selects.edl(Premiere、Resolve、Final Cutはインポート経由)、selects.csv、および視線外れ範囲とノートを含むselects.jsonが得られます。 - 検証する。 すべての編集ポイントを聞いてください(クリップされた最初または最後の音節、一瞥、ノイズがないこと)。
ffprobeでレンダリング時間をselects.jsonの合計と比較し、コンタクトシートを作成してください:ffmpeg -i selects.mp4 -vf "fps=1/6,scale=180:-1,tile=10x3" -frames:v 1 sheet.jpg。それを表示し、長さ、変更点、まだユーザーが必要なことを報告してください。
picks.json の形状
{"episode":"launch-01","mode":"takes","takes":{"A":"take-a","B":"take-b"},
"beats":[{"id":"01a","name":"Hook","script":"...","cands":[
{"take":"B","in":0.82,"out":21.2,"pick":true,"why":"Clean, matches the screen.","cut":[[51.4,53.82]],
"note":"","audio_only":false,"grade":null,"optional":false,"signals":{"dur":20.1,"wpm":162,"fillers":0,"repeats":0}}]}]}
ヒント
- 単語タイミングはトランスクリプトJSONでスポットチェックしてください。ノートの周辺の
word@start-endのダンプが、カットを配置する最も速い方法です。 - ffmpegに
drawtextがない場合は、テキストではなくdrawboxまたはhueでフレームをマークしてください。 - 大きなレンダリング: 最初に空きディスクを確認してください。4Kテイクはすぐに容量が増えます。