コードで映画を制作する
映画はプログラムです。すべてのフレームはあなたが書いたコードによって描かれる時間の純粋な関数であり、声、音楽、そしてすべての音もコードから生まれます。画像や動画の生成ツールは一切使用しません。そのため、どの秒でも変更して再レンダリングでき、別の言語への対応は新しい編集ではなく再実行となります。
このパイプラインは、ロシア語と英語で5分16秒の映画を制作しました。16ビート、57キュー、10個の3D挿入、スクリプトから最初の言語まで約1.5〜2時間、ラップトップでのレンダリングは言語あたり14〜16分です。その映画のコードは assets/examples/court-astronomer/ にあります。
唯一のアイデア:声を優先する
マーカー付きでスクリプトを書きます。音声サービスにそれを読み上げさせ、すべての単語のタイミングを報告させます。そうするとマーカーは絶対的な秒数になり、画像と音声の両方がその秒数に依存します。
Придворные астрономы {plant}поставили её на карту и {cut}записали дату.
CUE.plant = 9.21 手が星を置く:ドスン、火花
CUE.cut = 10.50 証書にカット、羽ペンが書き始める
各言語は自身のテイクから個別のタイムラインを取得するため、ロシア語と英語の映画は追加作業なしで異なるカットになり、書き換えた文はその後のすべてを移動させます。これが、以下の順序がスクリプト、音声、画像、音響であり、決して画像が最初でない理由です。
script/script.json ─ tools/tts.py ─> audio/voice/<lang>/ + web/timing_<lang>.js
│
┌─────────────────────────────────────────┴───────┐
web/film.js + shots + space.js audio/score.py
│ render.py │
renders/film_<lang>/film_<lang>.mp4 audio/mix/<lang>.wav
└───────────────── tools/finish_film.py ──────────┘
final/<stem>.mp4, -phone.mp4, .srt
プロジェクトを開始する
python <this-skill>/scripts/check_env.py
python <this-skill>/scripts/new_project.py <folder>
プロジェクトは、映画の名前を付けたフォルダに、短いパスで、十分な容量のあるドライブに配置します。フレームはエンコーダにストリーミングされ、保存されることはないため、5分の映画には約1 GiBが必要です。
新しいプロジェクトは、月の満ち欠けに関する25秒の動作デモで、2言語に対応しています。new_project.py が出力するコマンドを実行し、何かを変更する前にコンタクトシートを確認します。デモが動作すれば、それ以降の失敗はすべてあなたのものであり、機械のものではありません。
テンプレートのステータス。 パイプラインは実際の映画を制作しましたが、このテンプレートはその後抽出されました。デモでは、tts.py、ミックス、およびサウンドチェックが実行されています。配信ツールは黒いクリップに対して実行され、render.py はスタブページに対して、フラットピクチャロジックはスタブキャンバスに対して両言語で全フレーム実行されています。テンプレートは実際のフレームを描画したことがなく、その3Dショットも実行されたことがありません。したがって、最初の静止画はテンプレートのテストでもあります。失敗した場合は、レンダリングに成功したコードである assets/examples/court-astronomer/ と比較してください。
次に、コンテンツを置き換え、仕組みはそのまま維持します。
| 各映画で置き換えるもの | 通常はそのままにするもの |
|---|---|
script/script.json | tools/ |
web/shots.js(フラットショット) | render.py、server.py |
web/film.js:SHOT と SEQ | web/main.js、web/lib.js、web/labels.js |
web/space.js:ビルダー | web/space.js:ビルダーより上のキット |
audio/score.py | audio/mixlib.py、audio/synth.py |
ワークフロー
2分以上かかるコマンドはバックグラウンドで実行します。マシンにジョブキューやサーマルルールがある場合(プロジェクトノートやメモリを確認)、レンダーはそれを介して実行します。
1. リクエストを確定する
デフォルトにできないものだけを尋ねます:件名、言語、投稿先。デフォルトは1920x1080、24 fps、-15 LUFS、スクリプトに応じた長さです。一部分を磨く前に、完全なラフな映画を構築します。人々は完璧な10秒よりも、完全な映画の方がはるかに適切に判断し、多くの場合、最高品質は後回しでよいと率直に言います。
2. リファレンスがあれば読む
推測するのではなく測定します:カット、リズム、パレット、キャラクターの更新頻度、線の太さ、粒状感。これはビデオをダウンロードせずにブラウザでフレームごとに行えます。references/reference-analysis.md を読みます。数値をプロジェクトのREADMEに短いスタイルシートとして書き留めます。
技法を取り入れ、内容は残しません。独自のキャラクター、ストーリー、デザインを考案します。リファレンスのフレーム、キャラクター、ロゴ、または認識可能な曲を再利用せず、新しい名前であっても特定の作品を再現しないでください。
3. 10秒のトライアルを作成する
最終的なルックの1ショットを、無音で作成します。ここではハードコードされた時間でも問題ありません。これはルックのみをテストするためです。ユーザーに送信します。これはプロジェクト全体で方向転換するのに最もコストがかからない瞬間です。
4. 事実を収集し、スクリプトを書く
references/script-and-voice.md を読みます。映画を10〜35秒のビートに分割し、各ビートは1つのアイデアで、通常は1ショットです。単語数を予算化します:ロシア語で約125語/分、英語で150語/分、ポーズを含みます。画面上で何かが起こるべき単語にキューを配置します。
正確な事実と解釈を、フィルム内でもノート内でも、視覚的に分離して保持します。何かを計算する場合は、フィルムが読み取るファイルにデータを保持し、画面上のものがデータ通りのものであるようにします。
件名がデリケートな場合やユーザーが承認を求めた場合は、スクリプトをユーザーに見せます。それ以外はそのまま進め、ユーザーにはフィルムに反応してもらいます。
5. 音声、次にタイムライン
python tools/tts.py
各キューを name=word@seconds として出力します。それらの行を読みます:間違った単語のキューは、ここで見つける方がはるかに安上がりです。合計時間を目標と照らし合わせます。長すぎる場合はテキストを削減します。音声を約+10%以上速くしないでください。
6. ショットを書く
references/picture.md を読みます。画面上のすべては (g, t) の関数であり、すべての時間は CUE または BEAT から派生します。フラットショットはCanvasキットで描画します。3Dショットはコンポーザーを介して同じ2Dキャンバスにレンダリングします。すべてのフレームの最後に1回のグレインパスと1組のラベルにより、2つが1つのフィルムとして読み取れます。
7. 静止画を確認し、修正し、繰り返す
python render.py renders/check "lang=ru×=25,66,241,273"
python tools/contact.py renders/check 4
references/review-and-render.md を読み、どの瞬間を選択し、何を探すべきかを確認します。シートを開き、実際に検査します:ほとんどの欠陥はコードでは見えず、画像では明らかです。質問はまとめて行います。連続したレビューレンダリングは、ラップトップを熱くし、セッションを遅くする原因です。
8. サウンドを書く
references/sound.md を読みます。セクションは音声ビートで始まり、エフェクトは画像と同じキュー名に配置され、音楽は音声の下に潜り、ミックスは-15 LUFSに収まります。
python audio/score.py ru
python tools/bands.py ru
python tools/qa_audio.py ru whisper
あなたはそれを聞くことができないので、数値を使用します。すべてのビートで音声が残りの約10 dB上になることを目指します。実際のフィルムは6.7〜14.2 dBで、ほとんどが7〜9 dBだったため、その範囲を下回らないようにします。まだ誰も聞いていないことを率直に伝えます。
9. すべての言語で静止画、次にフルレンダリング
python render.py renders/check_en "lang=en×=25,66,241,273"
THREADS=6 CRF=17 python render.py renders/film_ru "lang=ru&fps=24&file=film_ru.mp4"
最初に各言語で静止画パスを行います。ある言語での小数点のカンマの間違いは、後で全体の再レンダリングにつながります。一度に1つの負荷の高いジョブを実行します。サウンドのみの変更には画像のレンダリングは不要です。ミックスを再作成し、finish_film.py を再度実行します。
10. 配信、クリーンアップ、報告
python tools/finish_film.py ru
python tools/telegram_copy.py ru
python tools/chapters.py ru
プラットフォームのコピー、説明、レポートについては references/delivery.md を読みます。ユーザーが特定の投稿を依頼しない限り、ユーザーに代わってアップロードや投稿を決して行わないでください。ドラフトは削除する代わりにゴミ箱またはトラッシュに移動し、最終版とそれらを再作成するために必要なすべてのものを保持します。
最も手戻りを減らすルール
- フレームは
tのみに依存します。 クロック、シードなしの乱数、前のフレームからの状態は使用しません。そうしないと、静止画がフィルムと一致せず、部分的な再レンダリングが隣接フレームと一致しません。 - 時間はキューから取得します。 キューからのオフセットは問題ありません。手入力された絶対秒数は、他の言語や書き換え後に壊れます。
- 画面上のすべてのテキストは
T_を通過させます。数字も含みます。29,5 дняと29.5 daysは異なる文字列です。これは実際のフィルムの英語版マスターに出荷されたバグです:23,4°。 - 言語間でキューの順序を想定しないでください。 単語の順序は異なるため、
CUE.a < CUE.bはそのうちの1つの言語でのみ成立する可能性があります。2つのキューから構築されたスパンをガードします。 - ラベルは2Dであり、
project()で配置します。 そうすることで、フラットショットとレタリング、グレイン、言語処理を共有します。 - カメラは回転するものの外側に配置します。 移動の極端な点を、中央だけでなくシート上で確認します。
- 静的レイヤーは
plate()に入れます。 詳細な背景を毎フレーム再描画することがレンダリングを遅くする原因です。 - 変更したら、確認し、報告します。 フレームを確認するまでは、修正済みとは呼ばないでください。
確認できず、伝えなければならないこと
- サウンド。 ラウドネス、バランス、スペクトログラム、文字起こしは確認できます。実際の聞こえ方はわかりません。
- フロー。 フレームは確認できますが、視聴者の体験は確認できないため、ペーシングは最も弱い判断になります。リズムについて具体的にユーザーに尋ねてください。
- プラットフォーム。 ファイルがユーザーのTelegramやYouTubeアカウント内でどのように動作するかは確認できません。
検証されたものとされなかったものを、その言葉で報告します。決定(アイデア、方向性、何を削除するか)はユーザーのものです。
バンドルファイル
| パス | 内容 | いつ読むか |
|---|---|---|
references/reference-analysis.md | テスト済みのブラウザスニペット、動画測定用、スタイルシートテンプレート | リファレンス動画がある場合 |
references/script-and-voice.md | script.json、キュー文法、単語予算、音声、事実 | スクリプト作成前 |
references/picture.md | タイムライン、フラットキット、キュー上の演技、テキスト、グレイン、3Dキット、サンプルコードのマップ | ショット作成前 |
references/sound.md | 楽器、スコア構造、音声チェーン、ミックス数値、チェック | スコア作成前 |
references/review-and-render.md | シートで確認すべき点、レンダリングモードとオプション、負荷 | 初回レビュー前、フルレンダリング前 |
references/delivery.md | マスター、電話、Telegram、YouTube、X、字幕、クリーンアップ、レポート | 最後 |
references/pitfalls.md | 症状、原因、修正、パイプライン全体 | 何かおかしい場合 |
scripts/check_env.py | マシンの状態 | 最初 |
scripts/new_project.py | テンプレートからプロジェクトを作成 | 2番目 |
assets/template/ | プロジェクトスケルトン、動作デモ | new_project.py によってコピーされる |
assets/examples/court-astronomer/ | 実際の映画のコード:10個の3Dビルダー、フラットショット、ハンドリグ、フルスコア | 技法を検索するために使用。単独では実行不可 |