sue@blog ~ /posts/ai-image-kanji-garble
$ cd ../
$ cat post.metadata

画像生成AIで日本語が崩れるときの症状と対処法 — gpt-imageを200枚以上試して効いた手をまとめた

date: 2026-06-14 生成AI 画像生成 OpenAI 検証
画像生成AIに「日本語タイトル入りのバナーを作って」と頼むと、漢字がぐにゃっと崩れて、なんなら中国語っぽい別の字になることがある。なぜ起きてどう防ぐのか、quality=lowに固定したまま要因を1つずつ変えて200枚以上生成し、文字単位で判定した記録。

姉妹記事
関連記事 → なぜ崩れるのか(論文ベース)対策はどれが効くか(実験比較)崩れやすい漢字リスト。こちらは症状と対処法の実践編です。
漢字以外の日本語トラブルも掘った「周辺日本語トラブル」編(全8回)→ A 和欧混植B 異体字C かなD 縦書きE 擬似日本語F OCRG LLMH TTS

画像生成AIに「日本語のタイトル入りのバナーを作って」と頼むと、漢字がぐにゃっと崩れて、なんなら中国語っぽい別の字になることがある。看板やサムネに使おうとして、画数の多い漢字が辞書に無い別の崩れた字に化けていたりする。あれ、地味に困る。

なんで起きるのか、どうすれば防げるのか。気になったので、条件を変えながら200枚以上生成して、原因を要因ごとに切り分けてみた。結論だけ先に言うと、犯人は思っていたのと違った。

先に結論(忙しい人向け)


1. まず再現してみる

同じプロンプト(「籠細工の特別展」というタイトルのバナー)で、設定だけ変えて生成してみる。片方は透過背景を指定するとフォールバックする旧世代モデル(gpt-image-1.5)+ quality: low。もう片方は最新モデル(gpt-image-2)+不透明背景+ quality: lowqualityは両方とも同じlow

gpt-image-1.5・透過・low で生成した『籠細工の特別展』バナー。漢字が崩れている
gpt-image-1.5・透過・low。画数の多い「籠細工」が「籭絤」のような実在しない字に化ける。これが“AI文字”。
gpt-image-2・不透明・low で生成した同じバナー。漢字が正確
gpt-image-2・不透明・low(同じlow品質)。タイトルがすべて正確。違いはモデルと背景だけ。

同じlow品質で、違いはモデルと背景だけ。ここで「あ、quality lowが悪いんじゃなくて、経路の問題か?」と思った。が、ここからが本番。


2. 要因をひとつずつ分解する

「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でもほぼ崩れない。そしてカタカナ・ひらがなはほぼ常に正常。つまりランダムに壊れてるんじゃなくて、「難しい漢字」が狙い撃ちで壊れている。

常用漢字『市民文化会館』は崩れずに描けている
常用漢字「市民文化会館」→ 1.5/透過/lowでも3/3で正常。
難字『鷹狩り体験フェア』は崩れている
難字「鷹狩り体験フェア」→ 同じ条件で崩壊。

構図が想像以上に効く

これは意外だった。まったく同じ「中央公民館」という5文字でも、バナーの主役として大きく置くと3/3で完璧、写真の中の建物の入口の看板として埋め込むと0/2で崩壊する。装飾的なシーンの中に紛れた文字ほど壊れやすい。

文字が主役の配置だと『中央公民館』が正確
文字が主役の配置 → 正常。
同じ文字をシーンに埋め込むと崩れる
同じ「中央公民館」をシーン(建物の入口)に埋め込み → 崩れ。

モデルと背景も効く

最新のgpt-image-2はlowでも頑健(6/6)。旧世代の1.5は同じ条件で弱い。さらに同じ1.5でも、透過よりも不透明のほうが結果がいい(2/6 vs 0/6)。透過PNGを頼むと弱いモデルに落ちる上に、透過自体も不利という二重苦になる。

gpt-image-1.5・透過・low は崩れる
gpt-image-1.5・透過・low → 崩れ。
gpt-image-2・不透明・low は正常
gpt-image-2・不透明・low → 正常。

プロンプトの言語も効く

日本語で指示したほうが、英語で指示するより崩れにくい。英語プロンプトのときがいちばん別字が多く、唯一「中国語の簡体字っぽい字形」が出たのもこのときだけだった。


3. 崩れ方の“正体”

集計してみると、崩れの中身はほとんどが2種類だった。

  1. 実在しない架空のグリフ(=いわゆるAI文字。それっぽいけど辞書に無い字)
  2. 別の実在漢字への置換(籠→籭、展→屁、鷹→麈 など)

そして、よく言われる「中国語っぽくなる」は、実はほぼ起きていない。簡体字/繁体字への置換は英語プロンプトのとき1回出ただけ。日本人の目には「かな抜きで漢字が崩れた塊」が“外国語っぽく”見えるだけで、実態は中国語化じゃなくて単なる文字化けだった、というのが正直なところ。


4. 効かなかった対策

ここはハマりどころなので共有しておく。プロンプトに「正しい標準的な日本語の漢字で描いて。架空の文字や中国語の字形を使わないで」と厳格に書いてみた。結果は0/3でまったく効果なし

プロンプトでお願いしても直らない
崩れるのはモデルが「中国語にしようとしている」からじゃなくて、「その複雑な漢字を正確に描く能力が足りない」から。意図の問題じゃないので、いくらお願いしても描けないものは描けない。

5. lowのまま崩さない対策

quality lowはレスポンスが速くて安いから維持したい。その制約で効いた打ち手を、効果が高い順に。

本命:文字はAIに描かせず、フォントで合成する

いちばん確実なのはこれ。文字なしの背景だけをlowで生成して、タイトルはコード側でフォント(NotoSansJPなど)を使って後から重ねる。glyphは常に100%正確になる。確定しているテキスト(タイトル・サービス名など)にはこれ一択。

文字なし背景をlowで生成し、NotoSansJP-Boldでタイトルを合成した結果。漢字が100%正確
文字なし背景(low生成)+ NotoSansJP-Boldで「籠細工の特別展」を合成 → 100%正確。

次善:好条件を積む

どうしてもAIに描かせたいなら、有利な条件を重ねる。

gpt-image-2・不透明・low なら高画数の『麦酒醸造フェスティバル』も正確
gpt-image-2・不透明・lowなら、画数の多い「麦酒醸造フェスティバル」も正確に出る。

最後の手段:その画像だけquality を上げる

難字をどうしてもAIに描かせる必要があるなら、その1枚だけqualityをmedium/highにする。実際、旧モデルでも quality を medium にすると、lowで崩れていた難字も崩れずに描けた。ただしコストは上がる(後述)ので、全体ではなく難字のときだけ局所的に。


6. ついでにコストの話

「対策するとトークン(=コスト)増えるの?」が気になったので、出力画像トークンを実測した(1024×1024)。

モデル / 背景quality出力画像トークン
gpt-image-1.5 / 透過low496
gpt-image-1.5 / 透過medium1,323
gpt-image-2 / 不透明low196
gpt-image-2 / 不透明medium1,756
gpt-image-2 / 不透明high7,024

おもしろいのは、gpt-image-2のlow(196)は、旧経路の1.5・透過のlow(496)より少ないこと。つまり最新モデルの不透明・lowに寄せると、品質が上がるのにトークンはむしろ減る。フォント合成も、画像生成は1回のまま文字合成はローカル処理なので追加トークンはゼロ。

増えるのはqualityを上げたときだけ(gpt-image-2なら low→high で約36倍)。崩れて何度も作り直すほうがよっぽど無駄なので、根本を直したほうがトータルでは安く済む。


まとめ

日本語テキスト入りの画像でハマっている人の参考になれば。実験は条件を固定して数を出すと、思い込みがけっこう覆って楽しい。

sue@blog ~ $ _