naeyn's picture
Publish DE·HTR browser release
2a7ba35 verified
|
Raw
History Blame Contribute Delete
6.52 kB
> **Published copy.** This file is the release copy of `data/FONTS.md` from
> [https://github.com/naeyn/de-htr-web](https://github.com/naeyn/de-htr-web). Paths to files that ship in this release have been rewritten to
> their locations here (`training-data/…`). Any other repository-relative path —
> `src/…`, `scripts/…`, `DECISIONS.md`, the raw corpora, the font `.ttf` files, and
> `data/german_wikipedia_lines.txt` — refers to the source repository, which is the
> only place those files exist.
# Handwriting fonts for synthetic training data
These fonts are used to render German text for **synthetic training data** (Tier 3). Every font listed below was **individually verified** for:
1. **License** — SIL Open Font License 1.1 only (sourced from the Google Fonts `ofl/` tree). Personal-use-only fonts are categorically rejected.
2. **German charset** — cmap coverage of Ä Ö Ü ä ö ü ß (`U+00C4 U+00D6 U+00DC U+00E4 U+00F6 U+00FC U+00DF`) via `fontTools.ttLib.TTFont.getBestCmap()`.
TTF files live in `data/fonts/`. Matching license texts live in `training-data/font-licenses/`.
| Font | File | Source URL | License | License file | German glyphs verified (method: fontTools cmap check) | Access date |
|------|------|------------|---------|--------------|------------------------------------------------------|-------------|
| Caveat | `Caveat[wght].ttf` | https://github.com/google/fonts/raw/main/ofl/caveat/Caveat%5Bwght%5D.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Caveat_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Kalam | `Kalam-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/kalam/Kalam-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Kalam_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Patrick Hand | `PatrickHand-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/patrickhand/PatrickHand-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Patrick_Hand_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Shadows Into Light | `ShadowsIntoLight.ttf` | https://github.com/google/fonts/raw/main/ofl/shadowsintolight/ShadowsIntoLight.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Shadows_Into_Light_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Shadows Into Light Two | `ShadowsIntoLightTwo-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/shadowsintolighttwo/ShadowsIntoLightTwo-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Shadows_Into_Light_Two_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Indie Flower | `IndieFlower-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/indieflower/IndieFlower-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Indie_Flower_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Architects Daughter | `ArchitectsDaughter-Regular.ttf` | https://github.com/google/fonts/raw/main/ofl/architectsdaughter/ArchitectsDaughter-Regular.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Architects_Daughter_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Reenie Beanie | `ReenieBeanie.ttf` | https://github.com/google/fonts/raw/main/ofl/reeniebeanie/ReenieBeanie.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Reenie_Beanie_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Gloria Hallelujah | `GloriaHallelujah.ttf` | https://github.com/google/fonts/raw/main/ofl/gloriahallelujah/GloriaHallelujah.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Gloria_Hallelujah_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| La Belle Aurore | `LaBelleAurore.ttf` | https://github.com/google/fonts/raw/main/ofl/labelleaurore/LaBelleAurore.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/La_Belle_Aurore_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Waiting for the Sunrise | `WaitingfortheSunrise.ttf` | https://github.com/google/fonts/raw/main/ofl/waitingforthesunrise/WaitingfortheSunrise.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Waiting_for_the_Sunrise_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
| Covered By Your Grace | `CoveredByYourGrace.ttf` | https://github.com/google/fonts/raw/main/ofl/coveredbyyourgrace/CoveredByYourGrace.ttf | SIL Open Font License 1.1 | `training-data/font-licenses/Covered_By_Your_Grace_OFL.txt` | PASS (Ä Ö Ü ä ö ü ß) | 2026-07-28 |
## Verification
Command (run from repo root on 2026-07-28):
```bash
uv run --with fonttools python -c '
from fontTools.ttLib import TTFont
from pathlib import Path
REQUIRED = {
0x00C4: "Ä",
0x00D6: "Ö",
0x00DC: "Ü",
0x00E4: "ä",
0x00F6: "ö",
0x00FC: "ü",
0x00DF: "ß",
}
order = [
"Caveat[wght].ttf",
"Kalam-Regular.ttf",
"PatrickHand-Regular.ttf",
"ShadowsIntoLight.ttf",
"ShadowsIntoLightTwo-Regular.ttf",
"IndieFlower-Regular.ttf",
"ArchitectsDaughter-Regular.ttf",
"ReenieBeanie.ttf",
"GloriaHallelujah.ttf",
"LaBelleAurore.ttf",
"WaitingfortheSunrise.ttf",
"CoveredByYourGrace.ttf",
]
for name in order:
path = Path("data/fonts") / name
font = TTFont(path)
cmap = font.getBestCmap() or {}
cps = set(cmap.keys())
missing = [f"U+{cp:04X} ({ch})" for cp, ch in REQUIRED.items() if cp not in cps]
status = "PASS" if not missing else "FAIL"
miss = ", ".join(missing) if missing else "(none)"
print(f"{status}\t{path.name}\tmissing={miss}")
'
```
Output:
```
PASS Caveat[wght].ttf missing=(none)
PASS Kalam-Regular.ttf missing=(none)
PASS PatrickHand-Regular.ttf missing=(none)
PASS ShadowsIntoLight.ttf missing=(none)
PASS ShadowsIntoLightTwo-Regular.ttf missing=(none)
PASS IndieFlower-Regular.ttf missing=(none)
PASS ArchitectsDaughter-Regular.ttf missing=(none)
PASS ReenieBeanie.ttf missing=(none)
PASS GloriaHallelujah.ttf missing=(none)
PASS LaBelleAurore.ttf missing=(none)
PASS WaitingfortheSunrise.ttf missing=(none)
PASS CoveredByYourGrace.ttf missing=(none)
```
## Rejected candidates
| Candidate | Reason |
|-----------|--------|
| Homemade Apple | Not SIL OFL 1.1 — lives under `apache/homemadeapple` in google/fonts (Apache 2.0) |
| Rock Salt | Not SIL OFL 1.1 — lives under `apache/rocksalt` in google/fonts (Apache 2.0) |
Additional OFL handwriting candidates that also PASSed the German cmap check but were not needed after the first 12 accepted fonts: Neucha, Bad Script, Marck Script, Sue Ellen Francisco.