HiAPI
ブログ

チュートリアル

hiapi 上の Nano-Banana でキャラクターの一貫性を保つ:絵コンテとECで使えるワークフロー

キャラクターバイブル(character bible)技法により、同じ顔・同じ衣装・同じ雰囲気をまったく異なるシーンでも安定させられます。hiapi の非同期 /v1/tasks エンドポイントを使って Nano-Banana 上でエンドツーエンドに実演し、現在の概算予算は $0.41 です。

Jun 16, 2026
hiapi 上の Nano-Banana でキャラクターの一貫性を保つ:絵コンテとECで使えるワークフロー

概要

繰り返し登場するキャラクター——絵コンテのマスコット、ブランドの顔、ECの試着モデル——を生成しようとしたことがあるなら、失敗のパターンはすでにご存じでしょう。レンダリングのたびに「だいたい同じに見える人」ができあがり、2枚を並べた瞬間に差異がはっきりと露呈します。hiapi 上の Nano-Banana シリーズはまさにこの問題のためにチューニングされています。本記事は私が実際に使っているワークフローです:

  • hiapi 上の3つの Nano-Banana モデルはすべてキャラクター一貫性タグを備えています:nano-banana(固定 $0.05)、nano-banana-2(1K / 2K / 4K でそれぞれ $0.036 / $0.057 / $0.086)、そして nano-banana-pro(1K と 2K が $0.057、4K が $0.10)。これら3つはすべて POST /v1/tasks の背後にある非同期タスクです。
  • コツは参照画像ではなく、キャラクターバイブルです。密度が高く、再現性があり、決定論的な説明文字列を、シーンごとの各プロンプトの先頭に連結します。image-to-image もファインチューニングも LoRA も不要です。モデルのアップグレードにも耐え、ソース管理でのバージョン管理も非常に簡単です。
  • 本記事の2つのデモはどちらも hiapi 経由でリアルタイムにレンダリングされています。1つは同じキャラクター(「Mira」)がまったく異なる光と場所に現れる4枚の絵コンテシーケンス、もう1つは同じモデル(「Aria」)が一度着替える3枚のECシーケンスです。
  • Nano-Banana のレンダリング7枚すべてで $0.35。品質を並べて比較するために Pro ティアで Mira を1枚追加レンダリングして $0.057。本記事の総概算予算:$0.41。

「キャラクターの一貫性」とは実際に何を意味するのか

一貫性は単一の属性ではありません。複数回のレンダリングで同時に成立しなければ、同じ人物だと感じられない、小さな属性の集合です:

  1. 顔の幾何学。目の間隔、鼻の長さ、あごの幅、頬のボリューム。
  2. 肌と髪のマーカー。色調、そばかすやほくろ、髪色と髪質。
  3. 衣装とアクセサリー。あの特定のジャケット、あの特定のニット帽、あの特定のツールベルト。
  4. 雰囲気。姿勢と表情のレパートリー——このキャラクターが自分を表現する方法。

プロンプトが十分に密であれば、hiapi 上の Nano-Banana モデルは1、2、3をうまく扱えます。4はあなた——作者——がキャラクターバイブルに外見だけでなく姿勢や表情の手がかりを書き込むことで担保します。

hiapi 上の3つの Nano-Banana モデル

執筆時点でリアルタイムの /api/pricing カタログから抜粋:

モデル 解像度ティア 価格(米ドル/枚) 選ぶ理由
nano-banana アスペクト比のみ、解像度パラメータなし 固定 $0.05 高速イテレーション。キャラクターの草案に使うモデル。
nano-banana-2 1K / 2K / 4K $0.036 / $0.057 / $0.086 4K 出力、小さい文字のレンダリング能力がはるかに高い。現在のポリシーでは 2K ティアが 1K より高い。
nano-banana-pro 1K / 2K / 4K $0.057 / $0.057 / $0.10 ディテールがよりシャープで微細な特徴がより深く、激しいシーン変化の中でアイデンティティを最も頑強に保つ。

3つとも input.prompt と input.aspect_ratio を受け付けます。Pro と -2 のバリアントはさらに input.resolution(1K / 2K / 4K のいずれか)を受け付けます。固定価格の nano-banana は resolution フィールドを 400 で拒否します——ティア制モデルを選んだときだけ設定してください。

私の経験則:

  • バイブルは nano-banana-2 の 1K ティアでイテレーション——$0.036 は現在3つの中で最も安い。
  • 本番バッチは nano-banana-2 の 1K または 2K ティアでレンダリング。2K では価格が $0.057 で Pro と同じなので、どうせ 2K が必要なら Pro を試す価値があります。
  • キービジュアルショット——最終的にトップページ、メディアキット、印刷版ルックブックに載るフレーム——は nano-banana-pro で。

キャラクターバイブル技法

キャラクターバイブルは、そのキャラクターのすべてのプロンプトの先頭に連結する密度の高い段落です。モデルが迷い込む余地がないほど具体的でありながら、シーンの自由度を失わない程度に規定しすぎない必要があります。

本記事の絵コンテキャラクターのために私が書いた正確なバイブルはこちらです:

MIRA = (
    "Mira, a 28-year-old field engineer of mixed Filipina–Polish "
    "heritage, warm olive skin, narrow oval face, dark almond eyes "
    "with light crow's-feet, thick straight black eyebrows, a small "
    "mole on the right cheek, shoulder-length wavy black hair tied "
    "loosely behind, rust-orange beanie with a small embroidered "
    "antenna patch, dust-faded denim jacket over a graphite grey "
    "t-shirt, dark cargo trousers, scuffed brown leather work boots, "
    "a battered yellow toolbelt, friendly determined expression. "
    "Cinematic photography, 35mm lens look, natural film grain, "
    "neutral colour grade."
)

このバイブルには6つの意図的な設計があります:

  1. 彼女に名前をつける。「Mira」はモデルに安定したハンドルを与えます。名前が画像に現れなくても、プロンプトに名前があるとアイデンティティが固定されるようです。
  2. 混血の背景を明示し、両方の半分を名指しする。「女性」や「アジア人」は曖昧です。「フィリピン–ポーランド」はモデルを具体的な顔の融合へと追い込みます。
  3. 目、眉、髪、肌を個別に記述する。「美しい」や「自然な」に頼ってはいけません。幾何学を明確に書きます。
  4. 1つの独特な顔のマーカー。右頬のほくろ。たとえそれが時々動いても、このマーカーがあればモデルを特定のアイデンティティ空間へ押し込めます。
  5. 衣装は名指しで、緩く記述しない。「小さな刺繍のアンテナパッチがついた錆びたオレンジ色のニット帽」は再現可能。「帽子」ではダメです。
  6. 末尾に写真スタイルの刻印。「Cinematic photography, 35mm lens look, natural film grain, neutral colour grade.」これにより、本来まったく異なるシーン間で光の言語を一致させられます。

そうすればシーンごとのプロンプトは単に:バイブル + 区切り + 短いシーン段落。私は " | Scene: " を区切りとして使います。ログで読みやすく、モデルは後半を新しいリクエストとして扱います。

hiapi の非同期タスクエンドポイントを呼び出す

hiapi 上のすべての画像モデルは同じ非同期パターンを使います:POST /v1/tasks で作成、GET /v1/tasks/{taskId} でポーリング、成功後に data.output[0].url を読んでレンダリング画像を取得します。出力 URL は短命です(expireAt 付き)。すぐにバイトを自分のストレージへダウンロードしてください。

import os, json, subprocess, time

API = "https://api.hiapi.ai/v1/tasks"
TOKEN = os.environ["HIAPI_TOKEN"]


def submit(model: str, prompt: str, aspect_ratio: str,
           resolution: str | None = None) -> str:
    payload = {
        "model": model,
        "input": {"prompt": prompt, "aspect_ratio": aspect_ratio},
    }
    # Only nano-banana-pro and nano-banana-2 accept `resolution`.
    # The flat-priced nano-banana returns 400 on the extra field.
    if resolution and model in ("nano-banana-pro", "nano-banana-2"):
        payload["input"]["resolution"] = resolution

    r = subprocess.run(
        ["curl", "-s", "-X", "POST", API,
         "-H", f"Authorization: Bearer {TOKEN}",
         "-H", "Content-Type: application/json",
         "-d", json.dumps(payload)],
        capture_output=True, text=True, timeout=70,
    )
    data = json.loads(r.stdout)
    return data["data"]["taskId"]


def wait(task_id: str, timeout_s: int = 600) -> str:
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        r = subprocess.run(
            ["curl", "-s", f"{API}/{task_id}",
             "-H", f"Authorization: Bearer {TOKEN}"],
            capture_output=True, text=True, timeout=40,
        )
        task = json.loads(r.stdout)["data"]
        if task["status"] == "success":
            return task["output"][0]["url"]
        if task["status"] == "fail":
            raise RuntimeError(task["error"])
        time.sleep(6)
    raise RuntimeError(f"timeout: {task_id}")


def render(model, scene, ratio, bible, resolution=None):
    prompt = f"{bible} | Scene: {scene}"
    return wait(submit(model, prompt, ratio, resolution))

Nano-Banana では6秒のポーリング間隔が適切なデフォルトです——調子の良い日なら1枚あたりおよそ10〜60秒で完了します。より短い間隔でポーリングしても往復を浪費するだけです。

デモ A —— 同じキャラクターの4ショット絵コンテ

絵コンテの本質はこれです:物語こそがコマ間で変化するものであり、主人公は定数です。私はキャラクター設定シートと2枚のシーンショットを、まったく同じ Mira のバイブルを使って生成します。

ステップ 1 —— バイブルを可視化する

バイブルをリポジトリにコミットする前に、まずそれを使ってキャラクター設定シートを1枚レンダリングします。これがバイブルが十分にアンカーできているかを確かめる最も安い方法です。

sheet = render(
    "nano-banana", aspect_ratio="3:2", bible=MIRA, scene=(
        "a character model sheet on a clean white studio background, "
        "three views of Mira side by side — three-quarter view facing "
        "left, full profile facing right, three-quarter back view — "
        "same outfit, same hairstyle, same toolbelt, even neutral "
        "studio lighting, no shadows, no text labels."
    ),
)

ここで注目すべきことが起きました:バイブルには明確に「Cinematic photography, 35mm lens look」と書かれているのに、モデルは3D カートゥーンの設定シートを出力しました。これは「model sheet」や「character sheet」を要求したときの最もよくある失敗パターンです——これらのトークンは美学を訓練データ内のアニメ業界の参考資料へと引きずります。対処法は2つあります:

  • 受け入れる。設定シートはバイブルの参考ドキュメントであり、公開納品物の一部ではありません。衣装、アクセサリー、おおよそのプロポーションが見えていれば、実際に必要なものは揃っています。
  • シーン断片に "shot on Kodak Portra 400, full-frame DSLR, no illustration, no toon, no 3D render" を加えて押し戻す——通常はフォトリアルに引き戻すのに十分です。

ここでは次の2枚のシーンショットこそが本番フレームなので、私は案1を選びました。

ステップ 2 —— 同じ Mira をまったく異なる2つの環境に置く

workshop = render("nano-banana", "3:2", MIRA, scene=(
    "Mira in a cluttered repair workshop, leaning over a wooden "
    "workbench under a single warm hanging bulb, reading a circuit "
    "schematic on tablet, soldering iron beside her, walls lined "
    "with scavenged parts, late evening, focused expression."
))

rooftop = render("nano-banana", "3:2", MIRA, scene=(
    "Mira on a city rooftop in cold overcast morning light, kneeling "
    "to bolt a small antenna mast to a ledge, wind moving her hair, "
    "distant grey buildings, breath barely visible, concentrated "
    "working expression."
))

2つのシーンは環境面で何の共通点もありません——狭い室内空間の暖かいタングステン光と、開けた屋上の冷たい日光。しかしアンテナパッチ付きの錆色のニット帽は同じ、デニムジャケットも同じ、ツールベルトも同じ、そして顔はどちらの画像でも同じ若い女性として読めます。これがバイブルが効いている証拠です。

シーン間で変わったもの(そして変わらなかったもの)

属性 ワークショップ 屋上
光の色温度 暖かいタングステン 冷たい曇天
姿勢 座って前かがみ 膝をついて
背景 散らかった室内 開けた都市の屋上
時間帯 深夜 早朝
ニット帽 ✅ 同じ錆びたオレンジ + パッチ ✅ 同じ
デニムジャケット ✅ 同じウォッシュ ✅ 同じ
ツールベルト ✅ 同じ黄色いレザー ✅ 同じ
顔の幾何学 ✅ 同じ ✅ 同じ
ほくろ 右頬にある 存在する(やや薄い)

最後の行が最も重要です。まったく異なる2つの照明条件下で、あの小さなほくろが右頬に残っています。これこそ望ましいシグナルです。

デモ B —— 同じモデルの3ショットECシーケンス

ECは本記事の2つのデモの中で難しいほうです。モデルは複数の角度と着替えの間で文字通り完全に同一に見えなければなりません。なぜならブランドの顧客は商品詳細ページでこれらの写真を頭の中でA/B比較するからです。ごく小さなドリフトでも錯覚が壊れます。

こちらが Aria のバイブルです:

ARIA = (
    "Aria, a 26-year-old fashion catalogue model of Korean descent, "
    "soft warm undertone skin, oval face with slightly defined "
    "cheekbones, thin straight black eyebrows, dark brown almond "
    "eyes, small natural lips with a faint warm pink, a single "
    "beauty mark just below the left eye, centre-parted glossy "
    "black hair falling straight to mid-back, ears pierced with a "
    "single small gold stud each side, no other jewellery, calm "
    "neutral expression, even soft studio lighting from front-left, "
    "clean light grey seamless paper backdrop, full-body framing, "
    "50mm portrait lens look, neutral colour balance, slight matte "
    "film finish."
)

このバイブルは Mira のバイブルがしなかった3つのことをしています:

  • 光と背景を固定します。カタログモデルは清潔なグレー背景とフラットな左前スタジオ光の中に住まなければなりません。両方をバイブルに書き込むことで、毎回のレンダリングがここから始まります。
  • 構図を指定します。「Full-body framing, 50mm portrait lens look」は3枚の画像すべてで一貫して再現できます。
  • ネガティブスペースを確実に固定します。「No other jewellery」は、Nano-Banana がレンダリングの半分でチェーンや時計を勝手に追加するのを防ぐ小さなフレーズです。

ステップ 1 —— 正面のメイン画像

frontal = render("nano-banana", "3:4", ARIA, scene=(
    "full-body straight-on frontal e-commerce shot, Aria standing "
    "relaxed with arms at sides, wearing a structured rust-olive "
    "wool blazer (single-breasted, two buttons, notch lapel, no "
    "pattern) over a plain ivory crew-neck t-shirt and straight-leg "
    "dark indigo denim jeans, simple white leather sneakers, clean "
    "look-book composition."
))

ジャケットのレンダリングについて正直に一言:プロンプトでは錆オリーブを要求しましたが、Nano-Banana はそれを暖かいタバコブラウンとして解釈しました。Pantone スタイルの特定色名(「rust-olive」「burnt sienna」「ultramarine」)は生成で確実には再現できません。ブランドに正確な色が必要なら、まずベース画像をレンダリングし、その後で色特化モデルに image-to-image を1回かけるか、あるいはメイン画像の場面だけ nano-banana-pro で色が正確なサンプル画像を1枚購入し、価格を受け入れてください。

ステップ 2 —— 同じ衣装で斜め45度の角度

side = render("nano-banana", "3:4", ARIA, scene=(
    "full-body three-quarter angle from her right, Aria standing "
    "relaxed, wearing the same structured rust-olive wool blazer "
    "(single-breasted, two buttons, notch lapel, no pattern) over "
    "a plain ivory crew-neck t-shirt and straight-leg dark indigo "
    "denim jeans, simple white leather sneakers, hands by her "
    "sides, look-book lighting."
))

ここがキャラクター一貫性のデモでいつも失敗する部分です:同じ人物を回転させる。顔は一貫していなければならず、髪型も一貫していなければならず、衣装が彼女の上で着られる様子も一貫していなければなりません。並べて見ると、2枚の写真は同じ撮影のように読めます——同じモデル、同じコールシート、同じメイク椅子。これが得たい結果です。

ステップ 3 —— 同じモデル、まったく異なる衣装

swap = render("nano-banana", "3:4", ARIA, scene=(
    "full-body straight-on frontal e-commerce shot, Aria standing "
    "relaxed with arms at sides, now wearing an oversized "
    "camel-coloured double-breasted wool overcoat (mid-thigh length, "
    "wide lapels, large mother-of-pearl buttons) over a black "
    "turtleneck and straight-leg charcoal trousers, black ankle "
    "boots, look-book lighting."
))

これこそ Nano-Banana にキャラクター一貫性タグをもたらしたデモです。同じ顔、左目のすぐ下の同じほくろ、同じ髪の長さと分け目、同じ金のスタッドピアス、同じ姿勢の語彙——変わるのは衣装とシルエットだけです。バーチャル試着パイプライン、自動ルックブック生成、大量生産のPDP撮影を構築しているなら、これはまさに何千回も実行する変換です。

Nano-Banana-Pro をいつ使うべきか

コストと品質のトレードオフを固定するために、nano-banana-pro の 1K ティアで Mira を1枚追加レンダリングしました。現在の見積もりは $0.057 です:

同じ Mira のバイブル。同じ " | Scene: " 区切り。変えたのはモデル名だけです。1枚あたり $0.007 多く払う(Pro の $0.057 対 固定 Nano-Banana の $0.05)ことで実際に得られるもの:

  • よりシャープな微細ディテール——1本1本の髪、デニムの織り目、ニット帽の刺繍パッチ。
  • 目立ちにくいアイデンティティマーカーの保持がより良い——目の形や眉の傾斜が Mira シリーズの残りとより一致して読める。
  • 小さい文字のレンダリングがより良い。シーンに看板、ラベル、ロゴがサムネイルサイズで読める必要があるなら、Pro が欲しいモデルです。

高頻度の用途(たとえば毎日数百フレームの絵コンテやプログラム的なカタログ生成)では、nano-banana-2 の 1K ティア $0.036 が適切なデフォルトです。Pro は 1K と 2K で $0.057 と、nano-banana-2 の 2K と同じなので、2K やメイン画像フレームが必要な場面——カバー画像、ルックブックのメイン画像、マーケティングの一枚もの——で使ってください。

本記事の現在の概算予算

レンダリング モデル ティア 現在の見積もり
カバー(Mira 太陽光発電所) Nano-Banana 16:9 固定 $0.05
キャラクター設定シート Nano-Banana 3:2 固定 $0.05
絵コンテ 1 —— ワークショップ Nano-Banana 3:2 固定 $0.05
絵コンテ 2 —— 屋上 Nano-Banana 3:2 固定 $0.05
EC —— 正面 Nano-Banana 3:4 固定 $0.05
EC —— 側面 Nano-Banana 3:4 固定 $0.05
EC —— 着替え Nano-Banana 3:4 固定 $0.05
Pro 比較画像 Nano-Banana-Pro 3:2、1K $0.057
合計 $0.41

8枚の画像、1つの Bearer token、1つの HTTP エンドポイント。SDK を組み立てる必要も、上流アカウントを管理する必要もありません——それが hiapi の用途です。

私が繰り返し立ち返る実用ルール

  1. バイブルは一度だけ書き、ソース管理の定数モジュールに置く。他の設定文字列と同じように扱います。バージョン管理しましょう。
  2. バイブルごとに1つの名前。「Mira」「Aria」。モデルが名前を表示しなくても、プロンプトにそれがあることは安定したハンドルです。
  3. アイデンティティマーカーを3つ選び、それらに強く依存する。Mira ならアンテナパッチ付きニット帽、黄色いツールベルト、あのほくろ。Aria ならほくろ、センター分けの髪、金のスタッドピアス。この3つが1回のレンダリングで生き残れば、キャラクターも生き残ります。
  4. Pantone スタイルの色名を信用しない。「Rust-olive」はタバコブラウンにドリフトしました。色が重要なら、まずレンダリングして下流で補正するか、Pro を使って意図的にブランドサンプル画像を撮ってください。
  5. 写真スタイルの刻印はバイブルの末尾に置く。「Cinematic 35mm」や「50mm portrait lens, slight matte film finish」——最後に置くことで長いプロンプトの切り詰めを生き残れます。
  6. まずキャラクター設定シートをレンダリングし、カートゥーンにドリフトすることを予期する。これは正常です。設定シートは自分のためのもので、公開用ではありません。本番ショットは同じバイブルとシーン内プロンプト断片を使ってフォトリアルを保ちます。
  7. ドラフトと量産には nano-banana-2 の 1K($0.036)、メイン画像ショットと 2K が必要なものには nano-banana-pro(1K も 2K も $0.057)。クライアント側に小さなスケジューラを構築し、quality パラメータからモデルを選んで正しい解像度を転送します。
  8. 固定価格の nano-banana は resolution を拒否する。クライアント側でモデル名によってそのフィールドをゲートしてください。これは痛い目を見て学んだ 400 です。

これがワークフローです。バイブルを1つ取り、アイデンティティマーカーを3つ選び、シーン断片を組み立て、POST /v1/tasks でトリガーすれば、同じ人物が毎回のレンダリングの向こう側から現れます。

テキストバイブルより参照画像ルートが好みですか?Ideogram 3.0 Character はアップロードした参照画像からキャラクターを固定する方式で、そのプロンプトガイドではマスコット、絵本のページ、マスク編集における同じテクニックが紹介されています。

永続的なAIアーティファクトで開発を始める

APIキーを取得して、タスクベースの1つのAPIで画像・動画・音声モデルを呼び出せます。

APIドキュメントを読む