# 日本語ポスターの誤字を数える実験（2026-10-07）

記事: 日本語の文字をちゃんと書ける画像生成AIはどれ？ ポスターを作らせて誤字を数えた

3つの指示（`prompts.json`）を5つのモデルに5回ずつ作らせ、75枚のポスターの文字を数えた。

## ファイル

| ファイル | 中身 |
|---|---|
| `prompts.json` | 3段階の指示（シーンと、入れる文字の正解行） |
| `make_prompt.py` | `prompts.json` から全モデル共通のプロンプトを組み立てる |
| `run_codex.sh` | Codexの組み込み画像生成（image_gen）で1枚作る。プロンプトは原文のまま渡す |
| `gen_local.sh` | mflux（MLX）でオープンウェイトのモデルを5枚（seed 1〜5）作る |
| `gen_meta.jsonl` | mfluxが画像に埋め込んだ生成条件（steps・seed・秒数・精度）を取り出したもの |
| `ocr.swift` | macOS VisionでOCR。言語補正はオフ |
| `score.py` | OCR結果を正解行と突き合わせる一次採点（正規化後の編集距離） |
| `ocr_raw.jsonl` / `ocr_score_auto.json` | OCRの生の出力と一次採点の結果 |
| `aggregate.py` | 一次採点に、目視で確認した上書きと指定外テキストの記録を足して `results.json` と集計表を出す |
| `results.json` | 75枚それぞれの判定（行ごとの○×、指定外テキスト、完全合格か） |
| `make_figures.py` / `make_images.py` | 記事の図とcover・拡大図を作る |
| `../posters/` | 75枚のポスター（webp）。ファイル名は `<モデル>_<L1〜L3>_<回>.webp` |

## 再現するとき

```sh
# Codex（ChatGPTにログイン済みであること）
./run_codex.sh L1 1            # → /tmp/jt/codex/gpt_L1_1.png
# オープンウェイト（Apple Silicon、メモリ64GB推奨。初回は数十GBのダウンロード）
uv pip install mflux==0.21.0
./gen_local.sh z-image-turbo L1   # qwen-image-2.1 / ernie-image-turbo / z-image-turbo / flux2-klein-4b
# OCR
swiftc -O ocr.swift -o ocr && ./ocr 画像.png > ocr.jsonl && python3 score.py ocr.jsonl
```

`run_codex.sh` と `gen_local.sh` の出力先は `/tmp/jt/` 固定。環境に合わせて直す。

## 判定の決まり

- 行が○: 正解の行と一字一句同じ（空白・「」・全角半角の違いは無視）。OCRの編集距離が0なら○。筆文字などでOCRが読めなかった行と、OCRの読み違いだった行だけ、目視で○に上書き（`aggregate.py` の `OVERRIDE_OK`）。
- 指定外のテキスト: 指定していない行が増えた、同じ行が2か所に出た、指定した「」まで描かれた（行の○×を見るときは「」を無視）。背景の看板や落款の疑似文字は数えない（`EXTRA`）。
- 完全合格: 全行が○で、指定外のテキストもない。
- OCR（Vision）の読み違いで×が○に見える・○が×に見えることがある。×のうち点の違いなどは目視で確認したが、全行を目で読み直したわけではない。

## 注意

- 各セルは5回。小さな実験で、モデルの順位をつけるものではない。
- Qwen-Image-2.1のライセンスは非商用（Qwen Research License）。ほかの3つのオープンモデルはApache 2.0。
