はじめに
2026-07-27、画像生成モデルの Qwen-Image-2512 に、店先の看板を描かせた。看板の文字は「営業中」。
出てきた看板は、字画も整っていて崩れていない。拡大して見るまでは合格に見えていた。
上の部分が違った。日本の「営」は上がツ(⺍)の形をしている。看板の字は、上に「火」が2つ並んでいた。**繁体字の「營」**だった。
プロンプトで「日本の新字体で、中国の漢字ではなく」と明示しても、日本の店先という文脈を足しても、「營」のまま変わらなかった。
そこで、文字だけは日本語フォントで画像に描いておき、それを画像編集モデル(Qwen-Image-Edit)で看板に馴染ませる方法に切り替えた。モデルに字を考えさせない。
この方法で、別の落とし穴に当たった。
「營」は別の文字だった
最初に切り分けておくと、看板の「營」はフォントの問題ではない。
| 字 | コードポイント | |
|---|---|---|
| 営 | U+55B6 | 日本の新字体 |
| 營 | U+71DF | 繁体字・旧字体 |
| 营 | U+8425 | 簡体字 |
3つは別々の文字として符号化されている。U+55B6 はどのフォントで描いても「営」になる。モデルが描いたのは、文字そのものを取り違えた結果だった。
フォント画像を渡す方法なら、この取り違えは起きない。問題はもうひとつのほうにあった。
同じコードポイントでも形が変わる
Unicode は文字を符号化していて、字形は符号化していない。日本・中国・台湾などで少しずつ形が違う漢字を、同じ文字として1つのコードポイントにまとめている。これを Han Unification(漢字統合)と呼ぶ。
どの地域の形で描くかは、フォントが決める。Unicode のFAQも、地域ごとの正しい字形で描き分けるのはフォントの役目で、日本語のテキストには日本語向けのフォントを使う、としている。
macOS で、同じコードポイントをフォントだけ変えて描いた。
同じコードポイントを、フォントだけ変えて描いたもの。上が日本語版、下が中国語版
| 字 | ヒラギノ角ゴシック(日本語) | Hiragino Sans GB(中国語) |
|---|---|---|
| 海 U+6D77 | 右下が点2つの「母」 | 点ではなく横棒が1本通る |
| 骨 U+9AA8 | 上の箱の中が左に折れる | 右に折れる。向きが逆 |
| 直 U+76F4 | 左下が「L」字に繋がる | 下は横棒で閉じ、左の縦棒は短い |
| 今 U+4ECA | 下の部分の1画目が横棒 | 斜めの点になる |
文字コードは完全に同じ。違うのはフォントファイルだけだ。
「ヒラギノ」を名前で選ぶと中国語版を掴む
macOS には Hiragino Sans GB.ttc というフォントが入っている。名前に「ヒラギノ」が付いているが、GB は簡体字中国語の規格を指す。中国語向けの版だ。
日本語のつもりでこれを選ぶと、上の表の右側の字形で描かれる。しかも「文字はちゃんと出ている」ので、見た目では気づきにくい。
同じことは、フォントを指定しない場合にも起きうる。Pillow の既定フォントに任せたり、日本語フォントが入っていないサーバや Docker の中で描いたりすると、フォールバック先の中国語フォントで描かれることがある。
フォント画像を画像編集モデルに渡す方法では、これが致命的になる。
画像編集モデルは、元の字形を忠実に守った
「骨直海」の3文字を、日本語フォントと中国語フォントでそれぞれ描き、両方を Qwen-Image-Edit に通した。
| 元画像のフォント | 出力の字形 |
|---|---|
| ヒラギノ角ゴシック | 日本の字形のまま |
| Hiragino Sans GB | 中国の字形のまま |
編集モデルは、渡された字形をそのまま保った。 正しい字形も、誤った字形も同じように保つ。中国語フォントで元画像を描けば、モデルに考えさせない代わりに、中国の字形を自分の手で注入することになる。
検証に使う字を、一度間違えた
この実験には、うまくいかなかった1回目がある。
最初は「営業中」を日本語フォントと中国語フォントで描き分けて、差を測ろうとした。差分は 3.37%。地域差の無い字どうしを比べた対照群の平均 8.32% より小さく、何も示せなかった。
原因は字の選び方にあった。「営」は U+55B6 という日本の字のコードポイントで、中国語フォントで描いても形は変わらない。「業」「中」は日中で同じ形をしている。Han Unification の差が出ない字だけで、Han Unification を検証していた。
字を「骨直海」に替えて、上の結果が出た。
差分の数値では判定できなかった
もうひとつ、測り方も合っていなかった。
1024×1024 の画像に3文字を置くと、画面の大半は背景になる。元画像どうしでも、画素の差分は 4.15% にしかならない。
さらに、ヒラギノ角ゴシックと Hiragino Sans GB は、地域差とは別に書体そのもののデザインも違う。地域差の無い字の組(8.32%)と、ある字の組(13.21%)で、差分のレンジが重なった。画素の差分では、字形の違いと書体の違いを分けられない。
判定は、拡大して参照の字形と見比べる目視に切り替えた。
フォントはパスで指定する
日本語を画像に描くときは、フォントファイルを明示する。
from PIL import Image, ImageDraw, ImageFont
JP = "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc" # 日本語版
# CN = "/System/Library/Fonts/Hiragino Sans GB.ttc" # 中国語版(名前に注意)
img = Image.new("RGB", (900, 260), "white")
d = ImageDraw.Draw(img)
d.text((20, 20), "骨直海今", font=ImageFont.truetype(JP, 200), fill="black")
img.save("glyph_jp.png")
JP を CN に差し替えて同じ字を描けば、上の表の違いが手元で出る。
できた画像を検品するときは、日中で形が同じ字では合格に見えてしまう。確かめる字は、日本・簡体字・繁体字の3系統で形が分かれる字を入れた。
広 駅 図 気 円 売 楽 経
「業」「中」「会」のような字だけで確認して、合格にはしない。
画像生成モデルに日本語を書かせると、プロンプトで指定しても8字すべてが日本の字形にならなかった。フォントで描いた文字を画像として持ち込み、編集モデルに絵に仕立ててもらうと、試した4通りすべてで字形が保たれた。この方法では元画像を描いたフォントの字形がそのまま出るので、ここで書いたフォントの選び方がそのまま効く。手順は本の7章に書いた。
👉 M2 Mac で画像生成AIをローカルで動かす(Zenn の有料本・1,000円・1章まで無料)
「文字は出ている」と確認して、形までは見ていなかった。
同じ文字コードの字を2つ並べて、違う形が出てくるとは思っていなかった。
