据え置きPCで、いまも回っています

8時間ごとに、
勝手に1本できている。

Codex が API でワーカーを叩き、据え置きPCが台本から動画まで作ります。1日3本。 リール用のサムネイルと、投稿する本文とハッシュタグまで用意して止まる。人がやるのは、確認して投稿することだけです。

Cutlock は「AIが作った動画を、壊さずに確定させる」ためのツール。自動運転はその上に載っています

  • 0シーンごとの画像候補
    クリックで採用を切替
  • 030秒・10カットの生成費
    LTX-2 pro・候補2本での目安
  • 0予算上限
    超えたら生成を止める
  • 0意図しない変更
    派生パッチは明示記録

できたもの

人が触っていない状態で、ここまで出てきます

縦型 1080×1920。動画とカバー画像、投稿用の本文とハッシュタグまでが1回の実行で揃います。

実物はこれから載せます

自動で作られたリールと、その回に出たカバー画像・本文・ハッシュタグをそのまま並べる場所です。

自動運転

起きているのは、据え置きPCの中です

クラウドに常駐プロセスを置いていません。手元の機械が次の予定を取りに来て、 作り終わったら終わったと報告する。それだけの往復です。

  1. 01

    予定を取りに来る

    据え置きPCのワーカーが /api/automation/v1/schedule を叩き、 次に回す番が来ているかを聞きます。まだなら何もせず帰ります。

  2. 02

    1本ぶん作る

    台本・ナレーション・画像・動画・レンダリングまで、画面で押すのと同じ工程を通ります。 入口が違うだけで、中身は手で作るときと1つも変わりません。

  3. 03

    投稿の材料まで用意する

    1080×1920 のカバー画像と、日本語の本文(導入 → 材料と分量 → 番号付きの作り方 → 保存の呼びかけ → ハッシュタグ最大5個)。文字はフィードで切られない位置に収めます。

  4. 04

    終わったと報告して止まる

    /schedule/complete を返すと次回時刻が繰り上がります。投稿はしません。そこは人が見てから手で出します。

自動運転のトークンは、自動運転にしか効かない

ワーカーが持つ Bearer トークンは自動制作 API 専用です。一般の生成 API にも管理 API にも 通りません。サーバーが保存しているのは SHA-256 だけで、原文は持っていません。

財布止める線を先に引いてある

1回あたりと24時間あたりの上限を持っていて、超えるなら実行しません。 有料の工程そのものも、明示的に有効化したときだけ動きます。寝ているあいだに請求が伸び続けることはありません。

課題

AI動画の修正は、なぜ収束しないのか

生成そのものは速くなりました。詰まるのは、そのあとです。

01

1カット直すために、全部を焼き直す

3カット目を詰めたら、5カット目が別物になっている。直していないところが動く限り、確認は終わりません。

02

どの操作が、どこを変えたのか残らない

履歴が「生成し直した回数」しか持っていない。気づいたときには、2手前の良かった状態へ戻す道が無い。

03

プレビューが嘘をつく

軽いプレビューで詰めた字幕が、書き出すと数ピクセルずれる。結局、確認のたびに完成尺を待つことになる。

できること

書くところから、確定するまで

縦型 1080×1920 の短尺を対象にしています。ここに挙げたものは、いま app.cutlock.jp で動いています。

  1. 01

    チャットから始める

    作りたいものを書くと、Claude が台本を書き、シーンに割り、各シーンの画像・動画プロンプトまで起こします。参考にしたい画像は5枚まで添えられます。

  2. 02

    ナレーション

    音声を選んで生成すると、単語タイムスタンプが返ります。そこから各シーンの尺が小数で確定します。読みにくい語は読み方を指定できます。

  3. 03

    画像を3枚ずつ

    シーンごとに候補を3枚。サムネイルをクリックすれば採用が入れ替わります。シーン単位で元画像をアップロードして効かせることもできます。

  4. 04

    構成ゲート

    動画を作る前に Claude の一次判定を挟みます。ここを通ってはじめて、いちばん高い動画生成の費用が出ます。

  5. 05

    動画

    採用画像から image-to-video。1本およそ26秒で返り、採用と採用区間が自動で入ります。ナレーションの実測で尺が動いても、採用区間はそれに追随します。

  6. 06

    実寸で詰める

    各カードは 1080×1920 を縮小した実寸プレビュー。字幕は上下にドラッグ、文字はクリックで書き換え。すべて1操作1 Undo。

  7. 07

    見た目をそろえる

    使用カラーと書体を選べます。書体は登録簿から引くので、実行環境が変わっても字形は変わりません。

  8. 08

    区間だけ焼く

    直した区間に絞ってレンダリングできます。実測では、480p へ縮小するより区間を絞るほうが効きます。

  9. 09

    Claude で部分編集

    「3カット目を0.4秒詰めて」と書くと、当たるパッチが返ります。既定はドライラン。中身を見てから適用します。

  10. 10

    進み具合を1画面で

    ダッシュボードに、どのプロジェクトがどこまで進んでいるかが並びます。複製して別案を作ることもできます。

原則

解き方は1つ。
全体再生成をやめて、部分差分にする。

映像業界の picture lock — 編集を確定させ、これ以上映像を変更しない状態 — から取った名前です。 汎用の動画編集ソフトは目指しません。

01唯一の変更手段は JSONパッチ

プロジェクトJSON が真実で、画面はその投影にすぎません。GUI のドラッグも、CLI も、Claude の tool use も、 すべて同じ applyTransaction を通ります。フィールドへ直接代入するコードは、どこにも存在しません。

021操作 = 1トランザクション = 1 Undo

シーン尺を変えれば後続シーンの start を詰め直す必要があります。それは派生パッチとして 明示的に記録されます。ユーザーが触っていないフィールドが黙って動くことはありません。

03プレビューと完成物は同一HTML

プレビューはレイアウトを縮めません。1080×1920 で組んだ stage を transform: scale() で 縮めるだけ。だから字幕の座標計算は完成物と完全に同一です。

04区間だけを焼く

指定した区間に重なる要素だけを 0 秒起点にリベースした派生コンポジションを出力します。 5.8秒の確認のために、30秒を待つ必要はありません。

仕組み

入口は3つ。出口は1つ。

だから「Claude で編集」は、GUI とまったく同じ入口の上に薄く乗っているだけです。

  1. 01

    編集する

    タイムラインのドラッグ、CLI のコマンド、あるいは「3カット目を0.4秒詰めて」。入口は違っても、次に来る形は同じです。

  2. 02

    パッチを当てる

    applyTransaction が JSONパッチを1トランザクションとして適用し、逆パッチを積みます。 パスは scenes.#scene_03.duration のように id 参照で書けるので、並べ替えてもズレません。

  3. 03

    コンポジションを生成する

    プロジェクトJSON から HyperFrames のコンポジションHTML を生成します。区間が指定されていれば、 その区間に重なる要素だけを 0 秒起点へリベースした派生版を出します。

  4. 04

    焼く

    ブラウザで描いて FFmpeg で焼きます。ローカルは HyperFrames CLI、サーバーは HeyGen の HyperFrames クラウド。 コンポジションHTML を作る部分は両方で共有しています。

  5. 05

    確定する

    同じ JSON からは同じバイト列が出ます。確認したものが、そのまま納品物になります。picture lock。

構成

生成はすべて API 経由。
ローカル推論は使いません。

モデルIDはコードに埋めず、Model Registry から引きます。差し替えても過去のプロジェクトは履歴として残ります。

台本・パッチ変換・部分編集ClaudeOpus 5 既定 / Sonnet 5 / Haiku 4.5
画像gpt-image-2.5参照素材を全シーンに添付
動画LTX-2image-to-video / pro $0.06・fast $0.04 per 秒
ナレーションHeyGen TTS単語タイムスタンプ付き
書体Google Fonts登録簿にある17書体。環境が変わっても字形が同じ
レンダリングHyperFramesサーバーは HeyGen クラウド / ローカルは CLI
費用

実行する前に、いくらかかるか出す

見積と実績を分けて、provider・モデル・用途ごとに記録します。べき等キーで重複課金を防ぎ、 1日の上限(既定 $20)を超えたら生成そのものを拒否します。

素材

生成物の URL は失効する前提で扱う

レンダリングの完了を検知したら、即座に自前のストレージへコピーします。コピーが終わってはじめて完了扱いにする。数日後に素材が消えないのはこのためです。

検証

部分差分が成立するか、最初に潰しました

レンダリング基盤そのものの性質を、生成APIから切り離して確かめたものです。合成素材のみで実行しています。

ランダムアクセス

PASS

登録された paused タイムラインに、外から seek(t) できるか。

t=1s  62597a26…t=12s 0addbf3f…t=20s 7bd65a1f…

撮影順を逆にしても同一時刻は同一画像。順次再生ではなく、ランダムアクセスで解いています。

決定性

PASS

同一JSONを2回焼いて一致するか。

run1 53cacd35187632cd…run2 53cacd35187632cd…SHA-256 一致

mp4 はファイル全体がバイト一致。PNGシーケンスでも全30フレームが画素単位で一致しました。

区間レンダー

PASS

区間レンダーが実用速度に乗るか。合否ラインは 30秒尺を 60秒以内。

5.8s 区間 @270×480  10.0s5.8s 区間 @1080×1920  12.8s全尺 30s @270×480  33.6s

確認の単位が「完成尺」から「直した区間」へ落ちます。

正直なところ

いまできないこと

先に書いておきます。使ってみて詰まる場所は、だいたいこの3つです。

  • 同じ動きは再現できない

    動画側の公式APIに seed がありません。再生成は「近い候補をもう1本引く」までです。 seed が要る場面ではゲートウェイを切り替えられるようにしてあります。

  • 素材が重いと、一度に焼けない

    レンダリングへ渡せる素材の合計にはサイズの上限があります。超えたときは、 どれが大きいのかを名前で挙げて中止します。区間を絞れば通ります。

  • 投稿まではやらない

    カバー画像と本文とハッシュタグは用意しますが、Instagram へ出すのは人の手です。 アカウント連携も直接投稿も入れていません。最後に一度、人が見る場所を残してあります。

  • 汎用の動画編集ソフトではない

    縦型の短尺を、壊さずに確定させることに絞っています。タイムラインに何でも置ける道具ではありません。

触ってみてください。

アカウント発行制です。登録されたアドレスにマジックリンク(と6桁コード)が届きます。パスワードはありません。