cinematic-film について
Cinematic filmは、単一のビジュアルボード上でカメラを動かし、ナレーションの言葉に合わせて映像要素を配置するコードベースの制作手順です。PythonとSkiaを使い、解説、ドキュメンタリー、製品紹介などを再現性のある形でレンダリングします。
主な機能
- 01ストーリーボードとナレーションのタイミング管理
- 02一つのビジュアルボード上を移動するカメラ
- 03発話単位に合わせた映像イベント
- 04ライセンス情報付きの画像取得
- 05地図、画像、音声、字幕の生成
- 06プレビューとMP4レンダリング用スクリプト
活用シーン
- 01歴史や調査を扱うナレーション映像の制作
- 02製品や創業者のストーリー制作
- 03科学・工学の解説映像の制作
- 04字幕、音声、クレジットを含む映像の出力
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ moh4696/ cinematic-skill --skill cinematic-filmインストール後、Claude Code で/cinematic-filmを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlassets/template/map.jsonphotos.jsonscene.pyscript.jsonassets/wright-flyer/map.jsonphotos.jsonscene.pyscript.jsonreferences/archive.mdfilm.mdperformance.mdsound.mdstory.mdvoice.mdscripts/build_narration.pybuild_sfx.pyburn_captions.pycaptions.pycheck_setup.pyengine.pyfetch_commons.pyget_fonts.pymake_beats.pymake_map.pymix_soundtrack.pynew_project.pyprep_assets.pyrender.pysplit_takes.py詳細
シネマティック・フィルム
この方法で制作するフィルムは、ひとつの世界をひと続きのカメラワークで映します。写真、カード、切り抜き、地図、数字のすべてがひとつの大きなボード上にあり、物語の進行に合わせて、カメラが糸やルート、矢印に沿ってそれらの間を移動します。あらゆるビジュアルの見せ場は、ナレーターがその言葉を話すタイミングに合わせます。すべてコード(Python の Skia)で構成されているため、毎回同じようにレンダリングでき、どんな題材にも対応し、新しい音声に差し替えるとフィルム全体のタイミングが自動で調整されます。
アル・カポネを題材にした 5:22 のドキュメンタリーを制作し、その後、あらゆる題材に使えるように拡張しました。ここに記載したルールは、制作中に問題が起きた経験をもとにまとめたものです。
ツール
| ファイル | 機能 |
|---|---|
scripts/check_setup.py | Python、skia-python、ffmpeg、フォント、メモリを確認し、インストールが必要なものを示します |
scripts/get_fonts.py | このマシンに必要なテキスト用途のフォントがない場合、オープンライセンスのフォント(Bebas Neue、Homemade Apple)を取得します |
scripts/new_project.py | assets/template/(実行可能な解説動画)または --example を指定してドキュメンタリーのサンプルからプロジェクトを開始します |
scripts/make_beats.py | 承認用の表 beats.md を作成します。時系列、行の長さ、読み上げテキスト内の数字をチェックします |
scripts/tts_say.py | 最終的な音声を用意する前にフィルムのタイミングを調整するための無料の仮音声を作成します(macOS の say、espeak-ng、または任意の TTS コマンドを使用) |
scripts/split_takes.py | セクション全体のテイクを行ごとにひとつのクリップに分割し、問題がありそうなカットを検出します |
scripts/build_narration.py | 行を結合して audio/narration.m4a と audio/timing.json を作成します。これをもとにフィルムを制作します |
scripts/fetch_commons.py | Wikimedia Commons を検索し、ライセンスとクレジット情報を添えてダウンロードします。フリーでないファイルは拒否し、credits.md を作成します |
scripts/make_map.py | 地図用に、パブリックドメインの境界線(任意の国や地域)を投影します |
scripts/prep_assets.py | すべての画像を統一したルック(白黒、セピア、自然な色)に調整し、ボードのテクスチャを生成します |
scripts/engine.py | フィルムエンジン:カメラ、スポットライト、アイテム、地図、ルック、仕上げ |
scripts/render.py | スチル画像、コンタクトシート、キューリスト、並列処理による MP4 レンダリングを生成します |
scripts/build_sfx.py | キューリストからすべての効果音を合成します(サンプルを使わないため、ライセンスも不要です) |
scripts/mix_soundtrack.py | 音声、効果音、オプションの音楽をミックスし、ダッキングとラウドネスの正規化を行います |
scripts/burn_captions.py | 完成したフィルムに 4 種類の字幕スタイルからひとつを焼き込み、SRT を作成します |
Python 3.9 以降、pip install skia-python numpy pillow(scipy は任意)、および ffmpeg が必要です。まず scripts/check_setup.py を実行してください。Linux または Windows では、プロジェクトごとに scripts/get_fonts.py も実行してください。すべてのコマンドで --project <folder> を指定します。
フィルムを選ぶ
| 種類 | ルック | 画像 | 典型的なアイテム |
|---|---|---|---|
| 歴史、実録犯罪、調査 | wall、slate | アーカイブ写真と文書、bw に調整 | プリント、破れた切り抜き、スタンプ、赤い糸、地図上のルート |
| 製品発表、ブランド、創業者のストーリー | studio、charcoal | 製品写真とチーム写真、natural に調整 | カード、大きな数字、カウンター、矢印 |
| 科学、エンジニアリング、仕組みの解説 | blueprint、paper | 図、アーカイブ画像、AI スチル | カード、カウンター、ペンの書き込み、地図 |
| テクノロジー、宇宙、予告編 | night | スクリーンショット、レンダリング画像、AI スチル | 大きな文字、カウンター、ルート、カード |
自由に組み合わせてください。ルックはボードと仕上げを定めるもので、どのアイテムもすべてのルックで使えます。references/story.md には、種類ごとのストーリー構成が記載されています。
ルール
- 1行につき主役は1つ。 ナレーションの各行で、カメラが捉えるものは1つだけです。スポットライトで、それ以外のすべてを暗くします。
- 強調演出は話された単語に合わせます。 スタンプは行の始まりではなく、「charged」と言うタイミングで押されます。すべてのタイミングは
doc.W(line, "word")で指定します。 - フレーズの見せ方は1通りにします。 画面上に文字を表示するか、実際の書類に見せるかのどちらかにし、両方は使いません。書類の本文はグレーの行で表し、埋め草の単語は使いません。
- オープニングの後、時間は前にしか進みません。 コールドオープンでは先の時点に進んでもかまいません。その後は、橋渡しとなる1行(「Four years earlier...」)を入れたら、物語の時間は前にしか進みません。
- スマートフォンで1秒で読める文字にします。 大きく、幅の狭い大文字を使います。画面上のラベルは、フレームの高さの約3%以上にします。
- 少ないほど効果的です。 文字列は表示するタイミングが過ぎたらフェードアウトさせ、古い項目は暗くします。最後に引くカメラの画は、雑然とせず、構図が整っているようにします。
- 本物に見えるものを捏造しません。 実際の写真や書類にはクレジットを付けます。コードで描画した書類には再現であることを明記し、実際に書かれた言葉だけを引用します。AI 画像はイラストとして使えますが、実際の出来事や実在の人物の証拠としては使いません。
ワークフロー
4つのゲート(Gate と表示)で、ユーザーの承認を待ちます。
- ストーリー。 調査してから
script.jsonを作成します。行を含むテイク(セクション)を用意し、各行にtext、spoken(数字は単語で表記)、hero、typedを設定します。事実に関するメモも併記します。60~90秒の動画は約150~230語です。詳細はreferences/story.mdを参照してください。 - ビート表。
scripts/make_beats.pyを実行し、すべての lint 警告を修正します。Gate: 事実関係を含め、ユーザーにbeats.mdを承認してもらいます。 - 画像。 すべての画像について、ID、種類、入手元を
photos.jsonに記載します。- アーカイブ画像:
fetch_commons.py search、category、getを使用します。 - ユーザー自身のファイル:
<project>/assets/photos/に配置します。 - AI の静止画:1つのスタイルに統一して生成します(
motion-assetsスキルで計画し、費用を見積もります)。 - その他のアーカイブと権利に関するルールは
references/archive.mdを参照してください。
- アーカイブ画像:
- 仮ナレーション。
tts_say.py、次にsplit_takes.py、最後にbuild_narration.pyを実行します。split_takes.pyがフラグを付けた行をすべて聞きます。これでタイミングが確定します。 - 素材。 ストーリーに移動が含まれる場合は
make_map.pyを実行し、その後prep_assets.pyを実行します。 - シーン。
scene.pyを作成します。セクションごとにクラスターを組んでボードをレイアウトし、doc.L/doc.Wのタイミングで項目を追加した後、カメラとスポットライトのキー(film.shot)を設定します。references/film.mdを読んでください。付属の2つのプロジェクトにパターンの例があります。assets/template/scene.py(解説動画、スタジオ風)とassets/wright-flyer/scene.py(ドキュメンタリー、すべての項目タイプ)です。 - ルックテスト。 1280x720 で、行ごとに1枚の静止画に対して
render.py --probeを実行し、すべての画像を確認してから、大きなカメラ移動すべてに対して--stripを実行します。Gate: オープニングとルックの静止画をユーザーに見せます。 - ドラフト。 仮ナレーションを使い、最初の30秒を1280x720でレンダリングします。Gate: ユーザーに視聴してもらいます。
- 本番ナレーション。 TTS または人の声で録音します(
references/voice.md)。再度 split、build、probe を実行します。シーンには何も変更を加えません。 - サウンド。
render.py --cues、次にbuild_sfx.py、続けてmix_soundtrack.pyを実行し、必要に応じてスコアを追加します。references/sound.mdを読んでください。 - 仕上げ。 全編をレンダリングし、
burn_captions.pyと SRT を実行します。1440p または4Kでレンダリングする前にreferences/performance.mdを読んでください。動画と一緒にcredits.mdを引き渡します。
毎回セルフレビューする
動作していると言う前に、静止画を確認してください。実際のレンダリングで見つかったミスをすべて紹介します。
- 暗いボードに暗い文字:見えません。暗いルックには明るい文字を使うか、暗い文字の背後にラベルブロック全体を表示するには
bar_h=0.92を使ってください。 - カメラは移動したのにスポットライトがその場に残り、暗いフレームになりました。別々に動かす必要がなければ、
film.shot()を使ってください。 - 地図の縮尺が小さすぎました。海岸全体が写真1枚より小さくなっていました。プリントを置く各場所に十分なスペースができるように
Kを選んでください(references/film.md)。 - 地図ラベルが重なっています。隣のラベルから離れた側に配置してください。
- 地図の端にまたがるクラスター。クラスターは地図上に置くか、地図からはっきり離して置いてください。
- ハイライトが対象の単語から数ピクセルずれていました。
PaperDoc.phrase_spansとdoc.on(print, fx, fy)を使い、画像にグリッドを重ねて読み取った割合を指定してください。
リリース済みプロジェクト
assets/template/:「From Cherry to Cup」は、スタジオ風の25秒の解説動画です。カード、矢印、カウンターで構成され、画像は使っていません。new_project.py my-filmでコピーできます。仮のナレーションを用意すれば、レンダリングできます。assets/wright-flyer/:「Twelve Seconds」は、初飛行と、2度墜落した5万ドルのライバルについて描いた90秒のドキュメンタリーです。パブリックドメインの写真7枚、米国の地図、組版された文書2点、すべてのアイテムタイプを使っています。
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a
関連スキル
Open 3D Skills の motion-assets は、映画にイラストが必要な場合にAI静止画を計画して価格を見積もります。また、frame-capture はコードで描画した映画の代わりにウェブページを記録します。