画像生成AIに「日本語のタイトル入りのバナーを作って」と頼むと、漢字がぐにゃっと崩れて、なんなら中国語っぽい別の字になることがある。看板やサムネに使おうとして、画数の多い漢字が辞書に無い別の崩れた字に化けていたりする。あれ、地味に困る。
なんで起きるのか、どうすれば防げるのか。気になったので、条件を変えながら200枚以上生成して、原因を要因ごとに切り分けてみた。結論だけ先に言うと、犯人は思っていたのと違った。
同じプロンプト(「籠細工の特別展」というタイトルのバナー)で、設定だけ変えて生成してみる。片方は透過背景を指定するとフォールバックする旧世代モデル(gpt-image-1.5)+ quality: low。もう片方は最新モデル(gpt-image-2)+不透明背景+ quality: low。qualityは両方とも同じlow。
同じlow品質で、違いはモデルと背景だけ。ここで「あ、quality lowが悪いんじゃなくて、経路の問題か?」と思った。が、ここからが本番。
「lowが悪いのか、モデルが悪いのか、それとも別の何かか」を切り分けるには、quality を low に固定したまま、要因を1つずつ変えて比べるしかない。というわけで、quality=low固定で46枚生成して、1枚ずつ「期待した文字どおりに描けているか」を文字単位で判定した。
完璧に描けた割合(全部 quality=low):
| 変えた要因 | 条件 | 完璧率 |
|---|---|---|
| モデル/背景 | gpt-image-2 / 不透明 | 6/6 |
| モデル/背景 | gpt-image-1.5 / 不透明 | 2/6 |
| モデル/背景 | gpt-image-1.5 / 透過 | 0/6 |
| 漢字の難しさ | 1.5/透過・常用(市民文化会館) | 3/3 |
| 漢字の難しさ | 1.5/透過・難字(鷹狩り体験フェア) | 0/3 |
| 構図 | 1.5/透過・文字が主役 | 3/3 |
| 構図 | 1.5/透過・シーンに埋め込み | 0/2 |
| プロンプト言語 | 1.5/透過・日本語 | 1/3 |
| プロンプト言語 | 1.5/透過・英語 | 0/3 |
崩れるのは毎回ほぼ同じ字。「籠・細・鷹・狩・験・醸」みたいな画数が多い/使用頻度が低い字に集中する。逆に「市民・文化・会館・金物・店」みたいな常用・低画数の字はlowでもほぼ崩れない。そしてカタカナ・ひらがなはほぼ常に正常。つまりランダムに壊れてるんじゃなくて、「難しい漢字」が狙い撃ちで壊れている。
これは意外だった。まったく同じ「中央公民館」という5文字でも、バナーの主役として大きく置くと3/3で完璧、写真の中の建物の入口の看板として埋め込むと0/2で崩壊する。装飾的なシーンの中に紛れた文字ほど壊れやすい。
最新のgpt-image-2はlowでも頑健(6/6)。旧世代の1.5は同じ条件で弱い。さらに同じ1.5でも、透過よりも不透明のほうが結果がいい(2/6 vs 0/6)。透過PNGを頼むと弱いモデルに落ちる上に、透過自体も不利という二重苦になる。
日本語で指示したほうが、英語で指示するより崩れにくい。英語プロンプトのときがいちばん別字が多く、唯一「中国語の簡体字っぽい字形」が出たのもこのときだけだった。
集計してみると、崩れの中身はほとんどが2種類だった。
そして、よく言われる「中国語っぽくなる」は、実はほぼ起きていない。簡体字/繁体字への置換は英語プロンプトのとき1回出ただけ。日本人の目には「かな抜きで漢字が崩れた塊」が“外国語っぽく”見えるだけで、実態は中国語化じゃなくて単なる文字化けだった、というのが正直なところ。
ここはハマりどころなので共有しておく。プロンプトに「正しい標準的な日本語の漢字で描いて。架空の文字や中国語の字形を使わないで」と厳格に書いてみた。結果は0/3でまったく効果なし。
quality lowはレスポンスが速くて安いから維持したい。その制約で効いた打ち手を、効果が高い順に。
いちばん確実なのはこれ。文字なしの背景だけをlowで生成して、タイトルはコード側でフォント(NotoSansJPなど)を使って後から重ねる。glyphは常に100%正確になる。確定しているテキスト(タイトル・サービス名など)にはこれ一択。
どうしてもAIに描かせたいなら、有利な条件を重ねる。
難字をどうしてもAIに描かせる必要があるなら、その1枚だけqualityをmedium/highにする。実際、旧モデルでも quality を medium にすると、lowで崩れていた難字も崩れずに描けた。ただしコストは上がる(後述)ので、全体ではなく難字のときだけ局所的に。
「対策するとトークン(=コスト)増えるの?」が気になったので、出力画像トークンを実測した(1024×1024)。
| モデル / 背景 | quality | 出力画像トークン |
|---|---|---|
| gpt-image-1.5 / 透過 | low | 496 |
| gpt-image-1.5 / 透過 | medium | 1,323 |
| gpt-image-2 / 不透明 | low | 196 |
| gpt-image-2 / 不透明 | medium | 1,756 |
| gpt-image-2 / 不透明 | high | 7,024 |
おもしろいのは、gpt-image-2のlow(196)は、旧経路の1.5・透過のlow(496)より少ないこと。つまり最新モデルの不透明・lowに寄せると、品質が上がるのにトークンはむしろ減る。フォント合成も、画像生成は1回のまま文字合成はローカル処理なので追加トークンはゼロ。
増えるのはqualityを上げたときだけ(gpt-image-2なら low→high で約36倍)。崩れて何度も作り直すほうがよっぽど無駄なので、根本を直したほうがトータルでは安く済む。
日本語テキスト入りの画像でハマっている人の参考になれば。実験は条件を固定して数を出すと、思い込みがけっこう覆って楽しい。