OCR-A のフリーな実装と MetaFont の可能性

OCR-A のフリーな実装を発見!
市販の OCR-A フォントの高額さを見兼ねたエンジニアが、OCR-A を自前生成して無償配布しているのを知った。配布しているのは John Sauter 氏で、2022 年 2 月まで物流会社 UPS で働いていた Computer Programmer。彼が 2004 年に制作した OCR-A は Source Forge で配布されてる。

OCR-A は OCR のための書体で、1968 年に ANSI によって定義され、1976 年には国際規格 ISO 1073-1 として標準化された。規格品だから誰が実装しても同じ品質になる。例えば ID Automation.com が $ 99 (Single User 限定、OCR-B 同梱) でライセンス販売する OCR-A と、氏が Public Domain として無償で配布する OCR-A の品質は全く同じ。実に純粋で天晴な Free Software の実践だなあ!👏
機械で読み取れるために設計されているから、OCR-A の字形はとても独特。現代の進化した AI なら、必ずしも OCR-A のような規格化された書体でなくても読み取ってくれるけど、それでも OCR-A の字形は依然として魅力的だよね。下に載せたのは、OCR-A の字形の例。

略語 | 名称 (EN) | 名称 (JP) |
---|---|---|
OCR | Optical Character Recognition | 光学文字認識 |
ANSI | American National Standards Institute | 米国国家規格協会 |
ISO | International Organization for Standardization | 国際標準化機構 |
実装に使われた MetaFont の技術
氏が配布する OCR-A の ReadMe.txt に “MetaFont” なるものが登場する。これが、僕にとって初耳だったので調べてみた。
A site license for the OCR-A font is very expensive, so I undertook to create a free font. I started with the MetaFont definitions, used FontForge and potrace to construct a TrueType font, then assigned each glyph a Unicode code point.
(抄訳) あるサイトの OCR-A ライセンスがとても高額なので、フリーのフォント制作を引き受けることにした。MetaFont コードを使って FontForge と potrace で TrueType を構築し、そして各グリフを Unicode 符号位置に割り当てた。
OCR-A font – Browse /OCR-A/1.0 at SourceForge.net
MetaFont はフォント作成用のプログラミング言語で、組版ソフト TeX と同じく Donald Knuth の発明品。CTAN (Comprehensive TeX Archive Network) の MetaFont ページでは「MetaFont は、字形の手続き的仕様を受け取り、ビットマップフォントを生成し出力します」と説明されてる。ブログ記事 Lessons from METAFONT も情報満載でとても参考になった (主眼は「なぜ MetaFont は失敗したか」だけどね…笑)。
MetaFont は、経路に沿ってペンを動かした軌跡として字形を記述する。上記の「字形の手続き的仕様」とはこのことで、MetaFont コードではペンの形や経路を定義する。下の図は、点 1 → 点 2 → 点 3 とペンを動かしてひらがなの「て」を構成してる例。日本語版 Wkipedia の記事からお借りしました。

上記「て」の MetaFont コードはこれ (Wikipedia から引用)。
beginchar(65,10pt#,10pt#,0pt#);
pickup pencircle xscaled 1.2pt yscaled 0.5pt rotated 120;
z1=(0.1w,0.75h);
z2-z1=whatever*(8,1);
x2=0.9w;
z3=(0.8w,0.1h);
draw z1--z2{z1-z2}..{z2-z1}z3;
labels(1,2,3);
endchar;
end.
MetaFont で OCR フォントを生成する
John Sauter 氏による OCR-A フォントは、OCR-A の MetaFont 実装をビットマップで出力し、それを Potrace でベクター化したもの。OCR-A の仕様は文字の幅を始め、筆画の幅や筆画の経路の座標で字形を定義している (下図参照) から、MetaFont での実装と相性がいい。実際、OCR-A の仕様は Tor Lillqvist 氏と Richard B. Wales 氏によって MetaFont で実装されていて (CTAN にソースがある)、John Sauter 氏はこれを利用してフォントを生成した。

一方で、既存の MetaFont コードから MetaPost を使って直に生成されたアウトラインフォントも配布されてる (by Mathew Scala 氏)。MetaPost とは、MetaFont コードからベクター画像を出力する関連ソフト。ビットマップを経由した John Sauter 氏の OCR-A と、MetaPost で直に生成した OCR-A の品質の差が気になるところ。
OCR-K の MetaFont 実装…?
日本語 OCR フォント「OCR-K」も似た方法で字形を定義してるから、MetaFont + MetaPost で生成できそう。OCR-K について、以前ブログに詳しく書いたね。

もしかすると、CC0 ライセンスで OCR-K を配布してる Force4u も、MetaFont を駆使してフォントを生成してるのかな?もしそうなら是非そのソースコードも見てみたいなあ。 あるいは、自分で OCR-K を MetaFont で実装してみるのも楽しいかも…!