OpenSource-Hub

OpenMontage

CLI ツール

calesthio/OpenMontage

世界初のオープンソース Agent 動画制作システム。

概要

OpenMontage は、AI コーディングアシスタントを本格的な動画スタジオへと変え、12 のパイプラインと 52 のツールを提供し、リサーチ、スクリプト、素材生成、編集をサポートします。無料と有料の両方のワークフローに対応しています。

README プレビュー

\n  \n\n\nOpenMontage\n\nThe first open-source, agentic video production system.\n\n\n  Paste A Video  · \n  Quick Start  · \n  Try These Prompts  · \n  Pipelines  · \n  How It Works  · \n  Providers  · \n  Agent Guide\n\n\n\n  \n\n\nFollow The Build\n\n\n  \n  \n  \n\n\n---\n\nTurn your AI coding assistant into a full video production studio. Describe what you want in plain language — your agent handles research, scripting, asset generation, editing, and final composition.\n\n**Important distinction:** OpenMontage can make image-based videos, but it can also make a real **video video** for free/open-source workflows: the agent builds a corpus from free stock footage and open archives, retrieves actual motion clips, edits them into a timeline, and renders a finished piece. That is not the usual "animate a handful of stills and call it video" trick.\n\n\n  \n\n\n> **"SIGNAL FROM TOMORROW"** — a cinematic sci-fi trailer fully produced through OpenMontage: concept, script, scene plan, Veo-generated motion clips, soundtrack, and Remotion composition.\n\n\n  \n\n\n> **"THE LAST BANANA"** — a 60-second Pixar-style animated short about a lonely banana who finds friendship with a kiwi. 6 Kling v3-generated motion clips (via fal.ai), Google Chirp3-HD narration, royalty-free piano music, TikTok-style word-level captions, and Remotion composition. Total cost: **$1.33**.\n\n\n  \n\n\n> **"VOID — Neural Interface"** — a product ad produced with just one API key (OpenAI). 4 AI-generated images (gpt-image-1), TTS narration, auto-sourced royalty-free music, word-level subtitles via WhisperX, and Remotion data visualizations. Total cost: **$0.69**. Zero manual asset work.\n\n\n  \n\n\n> **"Afternoon in Candyland"** — a Ghibli-style anime animation. A little girl's whimsical afternoon adventure through candy gates, gumdrop rivers, and lollipop gardens. 12 FLUX-generated images with multi-image crossfade, cinematic camera mot

FAQ (5)

トラブル対応
FFmpegの`afade=t=out`により、遅延させたaudio_mixerトラックが最初の数秒以降に無音になってしまう問題を修正するにはどうすればよいですか?

これは、afade=t=out:d=N のデフォルトが st=0 であるため、フェードアウトがストリームの先頭から開始されることが原因です。N 秒が経過すると、トラックは遅延されたセグメントを含め、残りの時間は無音のままになります。

各ソーストラックの長さをプローブし、フェードアウトの開始時刻を明示的に設定することで修正します。adelay の前に、ソースタイムライン上でフェードを適用してください:

import subprocess

duration = float(
    subprocess.check_output([
        "ffprobe", "-v", "error",
        "-show_entries", "format=duration",
        "-of", "csv=p=0",
        track_path,
    ]).strip()
)

if fade_in > 0:
    filters.append(f"afade=t=in:st=0:d={fade_in}")

if fade_out > 0:
    fade_out_start = duration - fade_out
    filters.append(
        f"afade=t=out:st={fade_out_start:.4f}:d={fade_out}"
    )

# ソースタイムライン上のフェードの後に adelay を追加します。
filters.append(f"adelay={int(start_seconds * 1000)}|{int(start_seconds * 1000)}")

afade を adelay の後に適用する場合は、次のようにします:

fade_out_start = start_seconds + duration - fade_out
filters.append(f"afade=t=out:st={fade_out_start:.4f}:d={fade_out}")

同じ修正を _mix() と _duck() の両方に適用してください。一時的な回避策としては、fade_out_seconds を削除するか、最終出力タイムラインを使用して amix の後に単一の afade フィルターを配置する方法があります。

参照 Issue #347
トラブル対応
なぜ hyperframes_compose は MP4 が正常にレンダリングされたにもかかわらず、「render exited 0 but output file missing」と報告するのですか?

相対パスの output_path は 2 つの異なる作業ディレクトリに対して解決されます。レンダーのサブプロセスは cwd=workspace で実行されるためワークスペース配下にファイルを書き込みますが、続く output_path.exists() のチェックはツールプロセスの CWD(通常はリポジトリのルート)に対して実行されます。レンダリング前に出力パスを一度だけ絶対パスに解決することで修正してください:

output_path = Path(
    inputs.get("output_path") or (workspace / "renders" / "final.mp4")
).expanduser().resolve()

同じ絶対パスを --output 引数と存在チェックの両方に使用してください。回避策としては、絶対パスの output_path を渡すか、そのメッセージを実際のレンダリング失敗として扱う代わりに、正常にレンダリングされたファイルを <workspace>/<relative-output> 配下で探してください。

参照 Issue #360
トラブル対応
FFmpeg の chromakey オーバーレイで 1x1 の単色動画が生成され、被写体が失われる問題を修正する方法

背景が 1x1 のままになるのは、scale=iw:ih が color ソース自身の寸法を使用し、overlay が最初の入力のサイズを使用するためです。オーバーレイする前に、scale2ref を使って 1x1 の背景を前景フレームに合わせてスケーリングしてください:

ffmpeg -y -f lavfi -i "color=c=0x0E172A:size=1x1" -i frame.png \
  -filter_complex "[0:v][1:v]scale2ref[bg][fgbase];[fgbase]chromakey=color=0x00FF00:similarity=0.3:blend=0.08[fg];[bg][fg]overlay=0:0" \
  -frames:v 1 out.png

同等のフィルターグラフ:

[0:v][1:v]scale2ref[bg][fgbase];
[fgbase]chromakey=color=0x00FF00:similarity=0.3:blend=0.08[fg];
[bg][fg]overlay=0:0

GreenScreenProcessor._process_chromakey で、実質何もしていない [0:v]scale=iw:ih[bg] ステップをこの scale2ref フローに置き換えてください。次のコマンドで結果を確認します:

ffprobe -v quiet -show_entries stream=width,height -of csv=p=0 out.png

1,1 ではなく、320,240 のようなソースフレームの寸法が報告されるはずです。

参照 Issue #336
トラブル対応
transformers 5でCLIPエンベッディングがすべて失敗した際に、corpus_builderが空のindex.jsonlで成功を報告してしまう問題を修正する方法

これは、transformers>=5.0 で get_image_features() の戻り値の型が変更された一方で、lib/clip_embedder.py が 5.x 以前のテンソル API を想定しているために発生します。その結果、すべての画像が失敗しますが、古いバージョンの corpus_builder は clips_added=0 の場合でも success=True を返します。

暫定的な回避策: Transformers を最新の 4.x リリースにダウングレードします:

pip install "transformers<5"

例:

pip install "transformers==4.46.3"

次に、空の index.jsonl を削除して corpus_builder を再実行します。clip_search や検索を実行する前に、結果が clips_added > 0 を報告することを確認してください。

恒久的な修正:

1. requirements.txt またはインストール手順で依存関係を固定します:

transformers<5

2. lib/clip_embedder.py を更新し、必要に応じてテンソルまたは pooler_output をアンラップすることで、transformers>=5 の戻り値に対応できるようにします。
3. 候補が1つも埋め込まれなかった場合に corpus_builder.execute() がフェイルクローズするようにします:

if candidates_seen > 0 and clips_added == 0:
    return ToolResult(
        success=False,
        error=f"All {candidates_seen} candidates failed to embed",
        data={"errors": errors},
    )

高い失敗率のチェックを追加することもできますが、本質的な条件は、空でない実行でクリップが0件となった場合に、成功を報告したり、有効に見える空のコーパスインデックスを書き込んだりしてはならないということです。

参照 Issue #357
トラブル対応
ComfyUI で WAN 2.2 text-to-video が、有効な MP4 内にちらつく無関係な静止画を生成してしまう問題を修正するには、どうすればよいですか?

画像ラテントではなく、時間軸を持つ動画ラテントを使用してください。同梱の wan22-t2v-4step.json で、ノード11の EmptyLatentImage を EmptyHunyuanLatentVideo に置き換えます:

"11": {
  "class_type": "EmptyHunyuanLatentVideo",
  "inputs": {
    "width": 832,
    "height": 480,
    "length": 81,
    "batch_size": 1
  }
}

次に、ComfyUIVideo._build_t2v を更新して、batch_size にフレーム数を設定しないようにします。代わりに length をパッチする必要があります:

node_11["inputs"].update({
    "width": width,
    "height": height,
    "length": num_frames,
    "batch_size": 1,
})

EmptyLatentImage(batch_size=81) は81枚の独立した画像を生成するため、ストロボ効果が発生します。EmptyHunyuanLatentVideo(length=81, batch_size=1) は、一貫性のある1つの81フレーム動画ラテントを生成します。これは ComfyUI の公式 WAN 2.2 t2v テンプレートと一致しています。

MP4 コンテナ、コーデック、再生時間、フレーム数はすべて有効であるため、ffprobe ではこの問題を検出できません。出力を視聴するか、隣接するフレームを比較して確認してください。壊れたレンダリングではフレーム間の差異が大きく現れますが、一貫した動きでは差異が小さく滑らかになります。メンテナンスされているリリースを使用している場合は workflow/builder PR を適用し、必要に応じて関連する validation PR からランタイムのストロボ検出を追加してください。

参照 Issue #526