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
문제 해결
MP4가 성공적으로 렌더링되었는데도 hyperframes_compose가 "render exited 0 but output file missing"이라고 보고하는 이유는 무엇인가요?

상대 output_path는 서로 다른 두 개의 작업 디렉터리를 기준으로 해석됩니다. 렌더 서브프로세스는 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. 임베딩된 후보가 없을 때 corpus_builder.execute()가 명시적으로 실패하도록(fail closed) 만드세요:

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

높은 실패율 검사를 추가할 수도 있지만, 핵심 조건은 클립을 하나도 생성하지 못한 비어 있지 않은 실행이 성공을 보고하거나 유효해 보이는 빈 코퍼스 인덱스를 작성해서는 안 된다는 것입니다.

원본 Issue #357
문제 해결
ComfyUI에서 WAN 2.2 text-to-video가 정상적인 MP4 파일 안에 깜빡이고 서로 관련 없는 스틸 이미지를 생성하는 문제를 어떻게 해결하나요?

이미지 latent 대신 템포럴 비디오 latent를 사용하세요. 번들로 제공되는 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)는 일관성 있는 하나의 81프레임 비디오 latent를 생성합니다. 이는 ComfyUI의 공식 WAN 2.2 t2v 템플릿과 일치합니다.

ffprobe는 MP4 컨테이너, 코덱, 재생 시간, 프레임 수가 모두 유효하기 때문에 이 문제를 감지할 수 없습니다. 출력물을 직접 보거나 인접한 프레임들을 비교하여 확인하세요. 깨진 렌더는 프레임 간 차이가 크게 나타나는 반면, 일관된 모션은 작고 부드러운 차이를 보입니다. 유지 관리되는 릴리스를 사용하는 경우 workflow/builder PR을 적용하고, 선택적으로 함께 제공되는 validation PR의 런타임 스트로빙 감지를 추가하세요.

원본 Issue #526