openjutsu
영상에서 원클릭으로 인물 교체, ComfyUI·MiniMax H3 기반 오픈소스 로컬 힉스필드 겐주츠 대안, FLUX.3 Klein 재조명 지원
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗日本語の一文から、声や効果音まで入った短い縦動画を作る Web アプリです。
いまは 練習モード で動きます。外部の動画 AI や LLM は一切呼ばず、public/samples/ のサンプル動画を返すので、お金はかかりません。
| # | 画面 | ファイル |
|---|---|---|
| ① | 用途を選ぶ(SNS縦型・自由。商品紹介と漫画・アニメ風は近日公開) | src/app/page.tsx |
| ② | 一文・雰囲気・長さ・音・字幕を選ぶ。写真を選べば、その写真から作る | src/app/create/page.tsx |
| ③ | AI が直した指示文を見て、下書き2本から選ぶ | src/app/drafts/page.tsx |
| ④ | 本番を生成中 | src/app/generating/page.tsx |
| ⑤ | 字幕の切り替え・MP4 保存・共有 | src/app/done/page.tsx |
| — | 編集(トリミング・文字入れ・BGM・字幕の焼き込み)。端末の中で処理して MP4 に書き出す(src/lib/edit/) | src/app/edit/page.tsx |
| — | 作った動画の履歴 | src/app/history/page.tsx |
| — | 共有ページ(リンクを開いた人が見る) | src/app/v/[id]/page.tsx |
Node.js 20 以上が必要です。
npm install
npm run dev
ブラウザで http://localhost:3000 を開きます。スマホの幅で見ると本番に近い見た目になります。
その他のコマンド:
npm test # 指示文づくりのテスト
npm run examples # 課題セットの変換結果(rule-based.md)を作り直す
npm run lint # 書き方のチェック
npm run build # 公開用にまとめる
POST /api/plan。設計図の形と LLM への指示書は tools/prompt-expander/system-prompt.md。
練習モードでは LLM を呼ばず、src/lib/plan/mockPlanner.ts が一文を辞書(src/lib/plan/lexicon.ts)で読み解いて設計図を作ります。
場所・時間・天気・季節・人物や動物(固定の見た目)・動き・効果音・環境音・看板の文字を英語の指示にし、動きの順にカットを分けます。
辞書にない言葉は日本語のまま指示文に残すので、一文の要素は落ちません(画面の「AIが決めたこと」にも出ます)。
用途ごとの課題セット43本(src/lib/plan/cases.ts、写真から作る例を含む)で、抜け・セリフ・カットの長さ・同じ入力で同じ出力になるかをテストし、
結果を tools/prompt-expander/examples/rule-based.md に書き出しています。辞書や変換を変えたら npm run examples で作り直します。
設計図から各モデル向けの文章と字幕を作るのは src/lib/plan/build.ts(Python の試作 build_prompts.py を移したもの。テストで同じ出力になることを確かめています)。src/lib/models.ts)。src/components/PhotoPicker.tsx・src/lib/photo.ts)。
生成を頼むときに長い辺1280pxで切り取って POST /api/jobs の image(data URL)で送り、サーバーは形式・大きさ・縦横を確かめてから回数を使う(src/lib/startImage.ts)。写真はサーバーにもジョブIDにも残さない。
動かし方の一文は空欄でもよく、そのときは「自然にゆっくり動き出す」で作る。練習モードではほかと同じくサンプル動画が返る。POST /api/jobs で始め、GET /api/jobs/:id で進み具合を見ます。練習モードではジョブIDに開始時刻を入れ、経過時間から進み具合を計算します(サーバーに状態を持たないので Vercel の無料プランでもそのまま動きます)。src/lib/flow.tsx)。タブやホーム画面アプリを閉じても、トップの「前に作った…」から続きを見られます。src/lib/history.ts)。端末をまたいで見られるようにするのはこれから。/v/:id のアドレスを送ります(src/lib/share.ts)。どれも API キーやログインは要りません。練習モードではジョブIDからサンプル動画を割り出すので、サーバーに何も保存しません。UTSUSHIE_MODE の1つだけ(src/lib/mode.ts)。何も設定しなければ練習モードです。
live にすると本番モードになり、動画を本物の API に頼みます(下の「本番モード」)。⚠️ 本番モードは 1本ごとにお金がかかります。テストはすべて偽の通信で行っていて、本物の API はまだ一度も呼んでいません。
| セリフあり | セリフなし | |
|---|---|---|
| モデル | Kling 3.0(公式 API) | Veo 3.1(Gemini API) |
| 下書き2本 | std・5秒・音なし | Veo 3.1 Fast・8秒 |
| 本番 | pro・10秒/15秒・音あり | 8秒を作ってから「延長」でつなぐ(720p) |
| コード | src/lib/video/kling.ts | src/lib/video/veo.ts |
無料で試す(CogVideoX-Flash):UTSUSHIE_VIDEO=free と ZHIPU_API_KEY を入れると、本番モードの動画をすべて智谱 BigModel の無料モデル CogVideoX-Flash に頼みます(src/lib/video/cogvideo.ts)。お金もクレジットも使いません。
ただし数秒の1本しか作れず(10秒/15秒を選んでも短い)、日本語のセリフの声や口の動きは出ず、動画に AI 生成の印が付きます。指示文は512文字までなので、最初のカットだけを送ります。
無料の機能は利用規約で「非商用・個人の研究や学習」に限られるため、オーナーが自分で仕上がりを確かめるときだけに使い、一般公開の前に外してください。
写真から作るときは、セリフの有無にかかわらず Kling 3.0 の画像→動画(/v1/videos/image2video、写真は base64 で渡し、縦横比は写真で決まる)を使います。下書き・本番の設定は上の表と同じです。
src/lib/video/live.ts。練習モードと同じくサーバーに状態を持たず、動画 API のタスクIDを 署名付きのジョブID に入れます(作り替えたIDで勝手に生成を始められないように)。GET /api/jobs/:id/video からサーバー経由で返します(Veo の動画は API キーがないと読めないため)。.env.example を見てください。足りないときは API を呼ばずにエラーになります。本番に切り替える前にやること
kling-v3、画像→動画で sound が使えるか、Veo の延長リクエストの形)。最初は1本だけ試すSupabase の環境変数(.env.example の3つ)を入れると、次のようになります。入れなければ今まで通りログインなしで使えます。
/login)。Supabase で Google を有効にすれば Google でも入れます。
リンクはページを開いたのと別のブラウザで開かれることが多い(ホーム画面アプリ、Gmail アプリ → Chrome など)ので、合言葉の要らない implicit 方式にしています。
リンクを開いたブラウザでログインするので、ホーム画面アプリの中ではログインが続きません。数字のコードでのログインも作ってあり、独自のメール送信(SMTP)をつないで Supabase のメールの文面に {{ .Token }} を足し、NEXT_PUBLIC_UTSUSHIE_EMAIL_CODE=1 にすると出ます(標準のメール送信では文面を変えられません)。
画面は Supabase の公開キーでログインし、サーバーへ頼むときにトークンを付けます。サーバーはトークンを Supabase に確かめてから受け付けます(src/lib/account.ts)。use_generation で、同時に頼まれても上限を超えません。回数は生成を頼む 前 に使い、動画 API の設定が足りないときは使う前に止めます(src/lib/quota.ts)。videos(公開・50MB まで)に ユーザーID/推測できない名前.mp4 で移します。
履歴や共有ページはそちらを指すので、動画 API 側の動画が消えても見られます。移せなかったときは今まで通りサーバー経由で返します。無料プランの保存容量は 1GB(15秒の動画で数十本〜百本ほど)。/api/owner?key=…)を一度開くと、その端末に約400日残るクッキー(JavaScript からは読めない)を置き、以後はログインなしで作れます。スマホと PC など、端末やブラウザごとに一度開きます。外すときはログインの画面の「この端末のオーナーの設定を外す」。
コードには合言葉の SHA-256 だけを置き、合言葉そのものは置きません(src/lib/owner.ts)。合言葉を変えるときは環境変数 UTSUSHIE_OWNER_KEY_SHA256 に新しい SHA-256 を、止めるときは off を入れます。
練習モードではオーナーの回数を数えません(上限なし)。本番モードでは既定でほかの人と同じ上限になり、UTSUSHIE_OWNER_DAILY_DRAFTS / UTSUSHIE_OWNER_DAILY_FINALS で変えられます。本番モードで数えるには、回数を記録する Supabase のユーザーID を UTSUSHIE_OWNER_USER_ID に入れます(ないと本番の生成は止まります)。全員の合計の上限はオーナーにもかかります。Supabase の表・関数・保存場所は supabase/schema.sql にまとめてあり、Supabase の「SQL Editor」に貼って「Run」を押すと作られます(何度実行しても大丈夫)。
どれもシークレットキーを持つサーバーからしか読み書きできません。
メールでのログインは、Supabase の標準のメール送信を使うので 1時間に数通まで です。一般公開の前に、Google ログインを有効にするか、メール送信サービス(Resend など、無料枠あり)を Supabase につなぎます。
bash scripts/make-samples.sh # ffmpeg が必要
○○.vercel.app のアドレスで見られます