メインコンテンツへスキップ
見出し画像

【Nanobanana 解説】JSONプロンプトでポートレートをどこまで変えられるのか #159

    JSONで顔はいじれるのか問題

    前回の #150 / #151 では、

    • JSONで「共通フレーム」 を作ると
      電車・プロダクト・イラストまで横展開できるで〜

    • ジオラマシリーズも、ぜんぶJSONのフレームで回せるで〜

    みたいな話をした。

    ただ、読んでる人の中にはきっとこう思った人もおるはず。

    「ほんまにJSONでそんな細かくコントロールできるんか?」
    「顔とか髪型までいじれるなら見てみたいんやけど?」

    ワイ自身も、ちょっと盛って言ってないか?と内心ドキドキしてたので(笑)、
    今回はちゃんと実験で証明する回
    にしたい。

    テーマはシンプルで、

    「1枚のポートレートを、JSONだけでどこまで変えられるか?」

    を、ガチで試していく。

    結論から言うと、

    • JSONだけでゴリゴリやるのは向いてない場所もあるし、

    • JSONが刺さるとめちゃくちゃ気持ちよく効く場所もある。

    その「使いどころ」が分かると、
    前回のフレームもだいぶ扱いやすくなるはずや。


    1. 世界を変えるのはテキスト、細部を磨くのがJSON

    いきなり結論からいくと、今回の実験で分かったのはこれ👇

    ✅ 大きな変更(世界観・スタイル・髪型)はテキストの役割
    ✅ 細かい調整(色味・表情・光の向き)はJSONの役割

    つまり、

    • 「写真 → イラストにしたい」

    • 「ドキュメンタリー → ハイファッションにしたい」

    • 「ロング → ガチのショートボブにしたい」

    みたいな“世界線ごと変える”仕事 は、
    メインの英語プロンプト(テキスト)のほうが圧倒的に強い。

    一方で、

    • 髪色を黒 → 自然な白にしたい

    • 眉の色を髪に合わせたい

    • ライティングをちょっとだけ強く/弱くしたい

    みたいな“同じ世界線の中での微調整” は、
    JSONのほうが再現性高くて、めちゃ扱いやすい。

    この「二刀流」が分かると、
    JSON構造プロンプトはいきなり難しいOSじゃなくて、

    「世界を決めるテキストの隣にいる、
    パーツごとの微調整レバー」

    として使えるようになる。

    ここからはその実験ログを、ポートレート1枚をもとに追いかけていく。


    2. ベース画像とベースJSON

    まずベースになるのは、こんな感じの
    モノクロ・フード女子ポートレート。

    画像

    ベースの英語プロンプトは超シンプルで、

    A black and white high-fashion editorial portrait of [SUBJECT],
    dramatic side lighting creating strong contrast,
    deep shadows, clean background,
    minimal styling, focus on facial structure,
    high-resolution, realistic, no text, no grain.
    

    ここに今回の主役である
    「顔まわりのJSON」を足したのがこれ👇

    {
      "subject": "high-fashion black and white portrait of a young woman in a hooded jacket",
    
      "face": {
        "age": "young adult",
        "gender_presentation": "feminine",
        "face_shape": "oval, soft but defined jawline",
        "eyes": {
          "size": "slightly large",
          "shape": "almond",
          "gaze": "looking straight at the viewer, calm and steady"
        },
        "nose": {
          "type": "straight, delicate bridge"
        },
        "lips": {
          "fullness": "medium, slightly full lower lip",
          "expression": "neutral, relaxed"
        },
        "expression": "subtle, calm, slightly mysterious"
      },
    
      "hair": {
        "length": "long",
        "style": "soft waves falling over shoulders",
        "color": "deep black",
        "extra": "hair coming out from under the hood"
      },
    
      "wardrobe": {
        "top": "black hooded jacket",
        "details": "hood up, zipper in the center, minimal styling"
      },
    
      "camera": {
        "framing": "tight portrait, head and upper shoulders centered",
        "angle": "eye level",
        "focus": "sharp focus on eyes and facial features"
      },
    
      "lighting": {
        "scheme": "dramatic side lighting from the left",
        "contrast": "strong contrast with deep shadows on one side of the face",
        "background": "clean, solid black background"
      },
    
      "color_style": {
        "mode": "black and white",
        "grain": "no grain, smooth tones"
      },
    
      "style": "high-fashion editorial, realistic, clean rendering",
      "quality": "high-resolution, detailed skin texture, subtle highlights",
      "negative": "text, watermark, logo, deformed shapes, excessive blur"
    }
    

    以降はこの「ゼロ号機」を固定しておいて、
    どこを1〜数行いじるとどこが変わるのかを見ていく。


    3. 実験①:モノクロ → カラー(=テキスト側の仕事)

    最初の実験は、
    モノクロ写真をそのままカラーに戻すやつ。

    やったことは、たったこれだけ。

    1. ベースプロンプトから black and white を抜く

    2. JSONの color_style.mode を書き換える

    3-1. テキスト側の変更

    - A black and white high-fashion editorial portrait of [SUBJECT],
    + A high-fashion editorial portrait of [SUBJECT],
    

    3-2. JSON側の変更

    - "color_style": {
    -   "mode": "black and white",
    -   "grain": "no grain, smooth tones"
    - },
    + "color_style": {
    +   "mode": "natural color, soft skin tones",
    +   "grain": "no grain, smooth tones"
    + },
    

    すると、出てくるのがこの子👇

    画像

    やってみて分かるのは、

    • 世界線の大枠(モノクロかカラーか)は、テキスト側がガツンと効く

    • JSON側の color_style は「色味のキャラ付け」をサポートしてる感じ

    ということ。

    「世界を決めるスイッチはテキスト。
    JSONはその世界の中で“どんな色気か”を調整するレバー」

    ってイメージを持っておくと、この先だいぶ楽になる。


    4. 実験②:髪色を変える(JSONが気持ちよく効く場所)

    次は、さっきのカラー版をベースに、
    髪の色だけ黒 → 自然な白っぽさに変えてみる。

    もともとの hair はこう👇

    "hair": {
      "length": "long",
      "style": "soft waves falling over shoulders",
      "color": "deep black",
      "extra": "hair coming out from under the hood"
    }
    

    ここからやりたいのは、

    顔も構図もライティングもそのままにして、
    髪だけを「自然な白」に差し替える こと。

    なので、いじるのは color の一行だけ。

    - "color": "deep black",
    + "color": "soft natural white with a slightly silvery tone",
    

    フルで書くとこう👇

    "hair": {
      "length": "long",
      "style": "soft waves falling over shoulders",
      "color": "soft natural white with a slightly silvery tone",
      "extra": "hair coming out from under the hood"
    }
    

    出てくるのは、こんな感じの
    自然なシルバー寄りホワイトヘア。

    画像

    ここでのポイントは、

    • white だけだとAI的にはかなり雑でブレやすい

    • soft natural white / slightly silvery tone みたいに
      質感まで一緒に書いてあげると安定する

    ってところ。

    「真っ白ブリーチじゃなくて、
    ちょっとシルバー混じりの自然な白髪にしてくれ」

    っていう、人間のイメージをそのまま color に押し込んでるイメージやね。

    ここはもう、JSONの独壇場って感じで、
    hair.color を1行変えるだけで、ほぼ狙いどおりの変化が出る。


    5. 実験③:眉色を髪に合わせる(“関係性”を書けるのがJSON)

    髪を白寄りにしたとき、
    そのままだと 眉だけ黒いまま になりがちで、
    ちょっと「ウィッグ感」が出る。

    そこで、face の中に eyebrows を足して、
    髪色との関係まで書いてみる。

    5-1. 変更前(デフォルトの眉イメージ)

    "eyebrows": {
      "thickness": "medium",
      "shape": "slightly arched",
      "color": "natural dark"
    }
    

    5-2. 変更後(髪に寄せた眉)

    - "eyebrows": {
    -   "thickness": "medium",
    -   "shape": "slightly arched",
    -   "color": "natural dark"
    - },
    + "eyebrows": {
    +   "thickness": "medium",
    +   "shape": "slightly arched",
    +   "color": "soft ashy gray, slightly lighter than her hair"
    + },
    
    画像

    ここで効いているのは、

    • soft ashy gray

    • slightly lighter than her hair

    という、“髪との関係”まで書いている部分。

    「髪よりちょい薄めのグレー眉にしてくれ」

    というニュアンスが伝わると、

    • 「白髪だけど若い感じ」

    • 「ふんわりした柔らかい雰囲気」

    としてAIが解釈しやすくなる。

    正直、画像上の変化は劇的ではない。
    でも、それがむしろ面白くて、

    • 髪色は1行変えるとドンと変わる

    • 眉色は同じ1行でも“効きが弱い”

    みたいな、パーツごとの効き方の違いが体感で分かる。

    JSONのいいところは、
    こういう「パーツごとの微調整」を
    箱単位で管理できることやと思う。


    6. 実験④:髪型を変える → ここでJSONの限界が見える

    次は、みんな大好き(?)
    ロングヘア → ショートボブ化にチャレンジしてみた。

    さっきの hair を、こんな感じに書き換える👇

    - "hair": {
    -   "length": "long",
    -   "style": "soft waves falling over shoulders",
    -   "color": "deep black",
    -   "extra": "hair coming out from under the hood"
    - },
    + "hair": {
    +   "length": "short",
    +   "style": "soft, slightly wavy bob framing her face",
    +   "color": "deep black",
    +   "extra": "short hair visible around her face from under the hood, not reaching her shoulders"
    + },
    

    日本語にすると、

    • 「長い髪が肩にかかっている」
      → 「顔まわりをふんわり囲むショートボブ」

    • 「フードから長い髪が出ている」
      → 「フードの下から、肩までは届かない短めの髪が少しだけ見えている」

    …と書いてるわけやけど、
    実際に出てきたのがこちら👇

    画像

    うん、悪くない。
    悪くないけど…ボブか?これは?
    という結果にw

    ここで分かったのは、

    • short も bob も、AIにとっては解釈の幅が広すぎる

    • 「肩上」「顎ライン」「ゆるウェーブボブ」などバリエーションが多すぎて、
      JSONだけで形をガチ固定するのは難しい

    ということ。

    髪型は「テキスト+JSON」の二段構えが現実解

    じゃあどうするかというと、
    ここは素直にテキスト側に戻したほうが早い。

    例えば、ベースプロンプト自体を

    - A high-fashion editorial portrait of [SUBJECT],
    + A high-fashion editorial portrait of [SUBJECT] with a clean short bob haircut,
    

    みたいに、

    「このモデルはショートボブです」

    という世界観レベルの指定を
    メインプロンプトのほうでガツンと書いておく。

    そのうえで、

    • JSON側の length / style / extra を
      「顔まわりで揃える」「肩に届かない」方向にチューニングする

    という二段構えにするのが、一番安定する。


    7. 最後に:JSONの“使いどころ”はどこか?

    今回、1枚のポートレートをぐりぐりいじりながら分かったのは、

    JSONで“全部”コントロールしようとするとシンドい。
    でも、使いどころさえ分かればめちゃ心強い。

    という現実やった。

    ざっくりまとめると、こんな分担になる👇

    📝 テキスト(メインプロンプト)が得意なこと

    • モノクロ ↔ カラー

    • 写真 ↔ イラスト ↔ アメコミ

    • ハイファッション ↔ スナップ ↔ ドキュメンタリー

    • ロング ↔ ショートボブ ↔ ベリーショート
      …みたいな世界線そのものの変更

    🧩 JSONが得意なこと

    • 同じ世界線の中でのパーツ単位の微調整

      • 髪色のニュアンス

      • 眉色を髪に合わせる

      • 表情を neutral ↔ slight smile にする

      • 光の向き・強さ・コントラストをちょっといじる

    • 「この写真路線は維持したまま、
      ここだけ変えたい」という時のレバー


    前回の #150 / #151 が
    「JSONで世界を組むフレーム側の話」 やったとしたら、
    今回のポートレート回は、

    「その世界の中で、顔のパーツを箱としてどう扱うか」
    そして、どこまでをJSONに任せて、どこからをテキストに戻すか

    の実戦編、という位置づけや。


    もしこの記事読んで、

    • 「この髪色のとこ、別の色でも試した」

    • 「ボブはこう書いたら安定したで」

    みたいな実験ログあったら、
    ぜひコメントで教えてもらえるとワイがめちゃ喜びます。

    スキ・フォローももちろん大歓迎です🫶
    ワイは、スキというリアクションを普通にエネルギーに変換するタイプです。

    ではまた、次の「顔いじりJSON」シリーズで✋

    #AI画像生成 #画像生成AI #プロンプト設計 #JSONプロンプト #構造化プロンプト #ポートレート生成 #AIポートレート #ヘアカスタム #ライティング調整 #スタイル制御 #note技術ログ #クリエイター向け #制作プロセス #学習メモ #実験記録 #デジタルクリエイティブ #コンテンツ制作 #Tips #検証記事 #note活用

     
     
     
    データと生成AIで「つくって壊して、また組み直す」実験ログ。 プロンプト・AIアート・分析ツールを公開中。 ツール・記事ネタを持ち帰れる場所です。 呼び名:にーやん/きたさん|PR・ご相談歓迎|Amazonアソシエイト参加中

    あなたへのおすすめ