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

画像生成AIの漢字崩れ、実装で打てる対策はどれが効くか — 6案を実験で比較した

date: 2026-06-14 生成AI 対策 実験
「なぜ崩れるか」の仕組みが分かると、API利用者が実装レベルで打てる対策も具体的に出てくる。読みヒント・品質up・モデル切替・edit修正・フォント合成の6案を、わざと崩れる難字で実験して成功率で比べた。結論を先に言うと、効くものと「効きそうで効かないもの」がはっきり分かれた。
3部作の3本目
症状と対処法(実験データ) / ② なぜ崩れるのか(論文ベース) / ③ この記事(実装で打てる対策を実験で比較)/ ④ 崩れやすい漢字リスト

先に結論


1. 試した6案(仕組みのどこを突くか)

対策は「なぜ崩れるか」の3つの仕組み——①文字ブラインドなトークナイザ ②長尾データ ③高周波の喪失——のどこを外すか、で整理できる。モデルを再学習せずに、API利用者が実装でやれることだけを並べた。

やること狙う仕組み
M0 ベースラインgpt-image-1.5 / 透過 / low(=崩れる経路)
M1 読みヒントプロンプトに「読み(かな)」と「一字ずつ正確に」を付与①(字の同定を助けたい)
M2 / M3 品質upquality を medium / high に上げる③(トークン予算=レートを増やす)
M4 / M5 モデル切替gpt-image-2・不透明(+high)に変える①②③(多言語に強いLLM・大語彙)
M6 edit修正崩れた画像を edit API で「文字だけ正しく直す」パイプライン(事後リカバリ)
M7 フォント合成文字なし背景を生成→コードでNotoSansJPを重畳回避(モデルに描かせない)

2. 実験結果(難字2語 × 各案の成功率)

わざと崩れる難字タイトル2つ——「籠細工の特別展」(籠=22画)と「鷹狩り体験フェア」(鷹=24画)——で各案を生成し、文字単位で判定した(“perfect”=全字正しい)。

籠細工の特別展鷹狩り体験フェア評価
M0 ベースライン(1.5/透過/low)0/30/3❌ 崩れる
M1 読みヒント2/30/3⚠️ 不安定(効かない)
M2 medium3/3✅(コスト増)
M3 high2/2✅(コスト大)
M4 gpt-image-2/不透明/low3/33/3✅✅ lowのまま
M5 gpt-image-2/不透明/high2/2✅(過剰)
M6 edit修正3/3✅ 崩れを救える
M7 フォント合成1/11/1✅✅ 決定論100%

ベースラインは同じ low 品質でも崩れるのに、モデルを gpt-image-2・不透明にするだけで(品質も解像度も上げずに)直る。

ベースライン(gpt-image-1.5/透過/low)で『籠細工の特別展』が崩れている
M0 ベースライン(1.5/透過/low)。籠・特・展が崩れる。
gpt-image-2/不透明/low で『籠細工の特別展』が正確に出る
M4 gpt-image-2/不透明/low。同じ低品質で籠まで正確。

3. 効かなかった対策:読み(かな)ヒント

これは試す前は効きそうに思えた。「正しい表記は『鷹狩り体験フェア』(読み:たかがりたいけんフェア)。一字ずつ正確に」とプロンプトに足す案だ。籠細工では改善したように見えた(2/3)が、鷹狩りでは0/3で全滅語によって当たり外れがあり、信頼できる対策ではない

なぜ効かないか(前々回の仕組みどおり)
モデルは文字ブラインドなトークナイザを通すので、入力の「読み」や「正しく描いて」という指示から字の形(ストローク)は得られない。だから読みを足しても、難字を正確に描く能力そのものは増えない。籠細工で効いたのは、たまたま当たった側だと考えるのが妥当。
読みヒントを付けても『鷹狩り体験フェア』が崩れている
M1 読みヒント付き(1.5/透過/low)でも、鷹・狩・験は崩れたまま。プロンプトのお願いでは直らない。

4. 効いた対策

本命A:gpt-image-2・不透明に寄せる(lowのまま)

いちばん割が良い。品質も解像度も上げず、モデルと背景を変えるだけで難字2語が6/6。前回の実測では gpt-image-2 の low は出力トークンが旧経路より少ないくらいなので、品質改善とコスト削減を同時に達成できる。透過が必要なら「不透明で生成→後段で背景除去」に回す。

本命B:文字はフォントで合成する(決定論100%)

確定しているテキスト(タイトル・サービス名)なら、これが最強。文字なしの背景だけをlowで生成し、コードでNotoSansJP等を重畳する。glyphは常に正しい。崩れる余地が原理的に無い。狙ったフォントを選ぶ方法・決定論(毎回バイト一致)・グリフ被覆の落とし穴は 実践編「狙ったフォントを画像に入れる」 で詳しく検証している。

文字なし背景にフォントで『籠細工の特別展』を合成、100%正確
M7 フォント合成。背景はlow生成、文字はNotoSansJP合成 → 100%正確。

補助:崩れた生成を edit API で事後修正する

すでに崩れた画像があるとき、edit(画像編集)API で「絵柄はそのまま、文字だけ正しい『…』に直す」と頼むと、3/3で正常化できた(編集は gpt-image-2 系を使う経路)。生成と検証を回すパイプラインに組み込みやすい。

崩れた画像をedit APIで修正し『籠細工の特別展』が正確になった
M6 崩れた生成(M0)を edit API で文字修正 → 正常化。

確実だがコスト増:品質を上げる

旧モデル(1.5)のままでも quality を medium/high にすれば難字が直る(medium 3/3, high 2/2)。ただし出力トークンが数倍〜十数倍になるので、難字を含む画像だけ局所的に上げるのが現実的。


5. 実装の指針(フロー)

生成→検証ループ(OCR/Vision)
自動化するなら、lowで生成 → OCR や Vision で描かれた文字を読み取り、期待テキストと照合 → 不一致なら edit修正 or フォント合成にフォールバック、という形にすると、低コストを保ちつつ崩れを実質ゼロにできる。今回の成功率(baseline 0/6, gpt-image-2 6/6)を踏まえると、検証なしで難字を一発で当てるのは賭けになる。

注意(実験の規模)

各案2〜3回×難字2語の小規模な実験です。傾向ははっきり出ていますが(特に「読みヒントは効かない」「gpt-image-2/不透明は強い」)、成功率の正確な数値は目安として読んでください。確定テキストはフォント合成が原理的に最強、という結論は規模に依りません。

まとめ

「なぜ崩れるか」が分かると、効く対策と効かない対策がきれいに分かれました。プロンプトでお願いする系(読みヒント)は効かない。効くのは仕組みを外す手——モデルを gpt-image-2/不透明に変える、品質を上げる、そしてそもそも文字をモデルに描かせずフォントで合成する。崩れたら edit で救う。実装するなら、確定テキストは合成、可変テキストは gpt-image-2+検証ループ、が落とし所です。

シリーズ
症状と対処法 / ② なぜ崩れるのか / ③ この記事 / ④ 崩れやすい漢字リスト
sue@blog ~ $ _