0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI動画生成の試行条件をTypeScriptで記録する:差分を一つに絞るための小さな設計

0
Posted at

短いAI動画を何度か生成していると、「前回は何を変えたのか」が分からなくなりやすい。プロンプト、参照画像、画角、長さ、モデルを同時に変更すると、結果が改善しても理由を説明できない。

この記事では、生成サービス固有のAPIには依存せず、ブラウザ上で行った試行をローカルのJSONへ記録するための小さなTypeScript設計を考える。目的は生成を自動化することではなく、次の試行で変更する条件を一つに絞ることにある。

記録したい情報

最低限、次の情報を残す。

  • 試行IDと作成時刻
  • 利用した入力方式(テキストまたは参照画像)
  • モデル名と画面比率
  • プロンプト
  • 表示されていたクレジット見積もり
  • 判定(採用、トリム、再試行、中止)
  • 次回に変更する項目

クレジット値や対応する長さ・解像度はモデルや時点によって変わるため、固定値としてコードへ埋め込まず、その試行時に画面へ表示された値を記録する。

type InputMode = "text" | "image";
type Decision = "keep" | "trim" | "retry" | "stop";

type Trial = {
  id: string;
  createdAt: string;
  inputMode: InputMode;
  model: string;
  aspectRatio: string;
  durationSec?: number;
  resolution?: string;
  prompt: string;
  referenceImageId?: string;
  displayedCreditCost?: number;
  decision?: Decision;
  note?: string;
  nextChange?: keyof Trial;
};

referenceImageId には画像そのものや公開URLではなく、ローカルで管理する識別子を入れる。個人情報や未公開素材をログへ複製しないためである。

変更点が一つかを検査する

比較可能な試行にするには、前回から変わった生成条件を列挙する。判定やメモなど、結果側のフィールドは比較対象から外す。

const conditionKeys = [
  "inputMode",
  "model",
  "aspectRatio",
  "durationSec",
  "resolution",
  "prompt",
  "referenceImageId",
] as const satisfies readonly (keyof Trial)[];

function changedConditions(before: Trial, after: Trial): (keyof Trial)[] {
  return conditionKeys.filter((key) => before[key] !== after[key]);
}

function validateSingleChange(before: Trial, after: Trial): string[] {
  const changed = changedConditions(before, after);

  if (changed.length === 0) {
    return ["生成条件が変わっていません"];
  }

  if (changed.length > 1) {
    return [`変更点を一つに絞ってください: ${changed.join(", ")}`];
  }

  if (after.nextChange !== changed[0]) {
    return ["nextChange と実際の変更項目が一致しません"];
  }

  return [];
}

これは因果関係を証明する仕組みではない。生成結果には揺らぎがあるため、同じ条件でも異なる結果になり得る。それでも変更点を一つにすると、「何を意図して比較したか」は後から確認できる。

リトライ回数ではなく予算を先に決める

「もう一回だけ」を繰り返さないため、シーン単位で上限を持たせる。回数だけでなく、画面に表示されたクレジット見積もりの合計も確認する。

type RetryBudget = {
  maxTrials: number;
  maxDisplayedCredits: number;
};

function canStartNextTrial(
  trials: Trial[],
  nextDisplayedCost: number,
  budget: RetryBudget,
): boolean {
  const used = trials.reduce(
    (sum, trial) => sum + (trial.displayedCreditCost ?? 0),
    0,
  );

  return (
    trials.length < budget.maxTrials &&
    used + nextDisplayedCost <= budget.maxDisplayedCredits
  );
}

見積もりが取得できない場合に 0 と扱うと判断を誤る可能性がある。実運用では displayedCreditCost が未入力なら生成前に確認を促す方が安全である。

サービスの画面とログを分離する

テキストまたは参照画像から短いクリップを作る場合、モデル別の設定を選べる動画生成ワークスペースのようなブラウザツールを利用しても、試行ログは別のローカルファイルで管理できる。

生成ツール側でプレビューとダウンロードができても、字幕、正確なブランド表記、複数カットの接続、音源条件、SNSへの投稿は別工程である。参照画像を使っても、人物・形状・文字が完全に維持される保証はない。ログには「生成できたか」だけでなく、編集へ渡せる連続区間があるかも記録するとよい。

JSONとして保存する

Node.jsで扱うなら、試行ごとに配列へ追記して保存できる。

import { readFile, writeFile } from "node:fs/promises";

async function appendTrial(path: string, trial: Trial): Promise<void> {
  let trials: Trial[] = [];

  try {
    trials = JSON.parse(await readFile(path, "utf8"));
  } catch (error) {
    if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
  }

  trials.push(trial);
  await writeFile(path, JSON.stringify(trials, null, 2), "utf8");
}

実際の運用では、JSON SchemaやZodで入力値を検証し、秘密情報やローカルの絶対パスを保存しないルールも追加したい。

まとめ

AI動画生成の試行ログでは、項目数を増やすことよりも、比較できる形を保つことが重要になる。

  1. 試行時に表示された条件とコストを記録する
  2. 前回から変える条件を一つにする
  3. 回数とクレジットの上限を生成前に決める
  4. 採用・トリム・再試行・中止を明示する
  5. 編集と公開は別工程として確認する

この形なら、生成結果が期待どおりでなかった場合も、次に何を変えるかを具体的に残せる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?