nunif 字体资源模块实战:基于 font_resource 下载管理日文字体并生成元数据清单

发布时间:2026/10/5 13:02:46

nunif 字体资源模块实战:基于 font_resource 下载管理日文字体并生成元数据清单 人工智能深度学习计算机视觉图像处理视频处理预训练【免费下载链接】nunifMisc; latest version of waifu2x; 2D video to stereo 3D video conversion项目地址https://gitcode.com/gh_mirrors/nu/nunif点击查看免费下载本篇技术指南聚焦开源项目 nunif 中的 font_resource 模块它负责为「合成文本图像训练数据」提供日文字体资源及其元数据管理。读完本文你将掌握三件事如何一条命令批量下载 Google Fonts 日文字体并自动跳过已存在文件、如何用font_resource.list输出简单/详细/ Markdown 三种格式的字体清单、以及字体元数据版权、许可证、设计师等是如何通过 OpenTypename表被解析出来的。文中所有命令、参数与实现细节均以当前仓库源码为准。font_resource 模块在 nunif 中的定位从仓库结构看font_resource是与waifu2x、iw3、stlizer等业务模块平级的一个资源包其核心职责是管理字体文件维护一个本地字体库目录font_resource/fonts/存放从 Google Fonts 下载的日文字体TTF/OTF管理字体元数据读取字体文件内嵌的 OpenTypename表提取字体名称、版权、许可证、设计师、版本等 12 项元数据供后续模块按需查询服务合成文本图像数据正如 font_resource/README.md 开头所述这些字体资源与元数据是为了“generating synthetic text image data”生成合成文本图像数据而准备的例如给 OCR、文本检测等训练任务渲染仿真文本图像。当前该模块仅支持日文字体Currently only Japanese Font is supported因此仓库内置的默认字体清单见下文全部是 Noto Sans JP、Noto Serif JP、M PLUS、Klee One 等日文字体家族。模块内部各文件的职责划分很清晰文件职责download_google_fonts.py从 Google Fonts 下载字体 zip 包并解压到本地字体库list.py扫描字体库输出简单/详细/Markdown 格式的字体清单metadata.py字体元数据解析核心FontInfo、FONT_NAME_ID、不可渲染字符黑名单font_map.py字体名 → 文件相对路径的映射表由list命令生成utils.pyload_font/load_fonts等字体加载辅助函数docs/font_list.md已生成的详细字体清单文档Markdown 示例一键下载 Google Fonts 日文字体原文档给出的下载命令非常简单python3 -m font_resource.download_google_fonts命令做了什么进入 download_google_fonts.py 的main()可以看到它把输出目录固定为脚本所在目录下的fonts即font_resource/fonts/不存在时自动创建随后用GoogleFontDownloader依次处理内置字体清单def main(): output_dir path.join(path.dirname(__file__), fonts) os.makedirs(output_dir, exist_okTrue) downloader GoogleFontDownloader(formatzip, output_diroutput_dir) downloader.run_all()GoogleFontDownloader.run_all()download_google_fonts.py会遍历GOOGLE_FONTS列表当前包含 53 个日文字体家族如 Noto Sans JP、Noto Serif JP、Zen Old Mincho、M PLUS 系列、BIZ UDGothic、Klee One、DotGothic16、Reggae One、Train One 等对每个字体将字体名中的空格替换为下划线得到目标目录名name_to_filename如Noto Sans JP→Noto_Sans_JP检查fonts/Font_Name/目录是否已存在存在则直接跳过print(f{name}: skip)——这就是原文档所说如果字体已存在会被跳过的实现否则拼接下载 URL 并调用self.run()完成下载、解压、落盘。下载 URL 的拼接逻辑在 download_google_fonts.pyGOOGLE_FONT_DOWNLOAD_URL https://fonts.google.com/download?family%s将字体名 URL 编码后填入占位符。底层下载机制ArchiveDownloaderGoogleFontDownloader继承自 nunif/utils/downloader.py 的ArchiveDownloader。看基类Downloader.run()nunif/utils/downloader.py可以了解完整流程用urllib.request.urlopen打开下载链接读取Content-Length得到总大小写入临时文件期间用tqdm打印实时进度条默认show_progressTrue可显示下载速度和总大小因为是归档模式archiveTrue格式zip用shutil.unpack_archive解压到临时目录调用子类实现的handle_directory/handle把解压结果复制到目标位置无论成功失败最终都会清理临时文件。GoogleFontDownloader.handle()download_google_fonts.py使用shutil.copytree(src, dst, dirs_exist_okTrue)把解压出的字体目录整体复制为fonts/Font_Name/。因此下载完成后每个字体家族对应一个独立子目录内部是 Google Fonts 提供的 TTF/OTF 文件含各种字重。从 font_map.py 可以看到实际落盘的目录结构例如Noto_Sans_JP/NotoSansJP-Regular.otf、NotoSansJP-Bold.otf、NotoSansJP-Black.otf等M_PLUS_1p/MPLUS1p-Regular.ttf、MPLUS1p-Bold.ttf等BIZ_UDGothic/BIZUDGothic-Regular.ttf、BIZUDGothic-Bold.ttf等。关于许可证字体文件从 Google Fonts 下载后保留其原始许可证。从 docs/font_list.md 的元数据可以看到绝大多数字体采用SIL Open Font License 1.1如 BIZ UDGothic、Dela Gothic One、Kaisei 系列少数采用Apache License 2.0如 Kosugi、Kosugi Maru。将字体用于训练数据合成前应核实各字体文件内嵌的License Description与License URL字段确保符合其使用条款。生成字体清单list 命令的三种输出原文档规定字体清单的查看方式由 font_resource/list.py 提供它支持两个布尔选项参数作用--metadata输出每个字体的详细元数据12 项 name 表字段不加则只输出「字体名 → 文件相对路径」的简单清单--markdown以 Markdown 表格格式输出便于直接写入文档简单清单python3 -m font_resource.list对应源码逻辑list.py扫描fonts/**/*.*只保留.ttf和.otf后缀的文件按字体名排序后输出{字体名: 相对路径}字典。例如{BIZ UDGothic: BIZ_UDGothic/BIZUDGothic-Regular.ttf, Dela Gothic One Regular: Dela_Gothic_One/DelaGothicOne-Regular.ttf, ... }详细元数据清单python3 -m font_resource.list --metadata此时会对每个字体遍历FONT_NAME_IDmetadata.py中定义的 12 项元数据并额外附上字体文件名data[font.name][File]。这 12 项与 OpenTypename表 name ID 的对应关系是输出字段name ID含义Name4完整字体名称Family Name1字体家族名Version5版本号Copyright Notice0版权声明Trademark7商标信息Manufacturer Name8厂商Designer9设计师Description10描述URL Vendor11厂商网址URL Designer12设计师网址License Description13许可证描述License URL14许可证网址上述 ID 对应关系直接参考了 OpenType 规范中name表的 name ID 定义源码注释见 metadata.py。仓库中 docs/font_list.md 就是--metadata --markdown的现成产物示例例如 BIZ UDGothic 的条目包含Version 1.05、Copyright 2022 The BIZ UDGothic Project Authors、SIL Open Font License, Version 1.1等完整信息。Markdown 输出python3 -m font_resource.list --markdown python3 -m font_resource.list --metadata --markdownMarkdown 格式的逻辑在 list.py简单模式输出# Font List标题 | Font Name | File |两列表格详细模式输出# Font List标题每个字体一个小节## 字体名节内是| Name | Description |键值对表格。escape()函数list.py会对值先做html.escape再转义|、、_、*、[、]等 Markdown/表格特殊字符避免元数据中的符号破坏表格结构例如 Noto Sans JP 的 Designer 字段含中文引号、版权字段含©等字符时也能安全输出。与 font_map.py 的关系简单清单正是 font_map.py 中FONT_MAP字典的数据来源——该文件头部注释明确写着# generated by font_resource.list。FONT_MAP将「字体名」映射为「相对路径」并假设路径分隔符为 POSIX 的/在 utils.py 的native_path()中会被替换为平台分隔符以兼容 Windows。模块导入时会执行validate()font_map.py对映射中的每个文件做存在性检查缺失时输出 warning 日志便于及时发现字体库不完整。字体加载与元数据解析metadata.py 源码详解FontInfo 类metadata.py 中的FontInfo是字体加载与查询的核心类FontInfo.load(file_path, validate_cmapFalse, validate_font_size16)用fontTools.ttLib.TTFont打开字体文件从ttfont[name]的 name ID 4 取得字体名并用getBestCmap()收集全部 Unicode 码点构成cmap集合可选地执行validate_cmap渲染校验get_metadata(name_idNone, nameNone)按 name ID 或字段名走FONT_NAME_ID映射读取元数据这就是list --metadata的底层取值函数validate_cmap(font_size16)逐个码点用 PIL 的ImageFont.truetypelayout_engineImageFont.Layout.RAQM即 HarfBuzz 复杂文本整形引擎渲染成灰度位图尺寸为 0 或全黑getextrema判断即判定为不可渲染码点将其从cmap中移除——源码注释解释了这样做的原因大部分免费字体包含大量无法渲染的字符码如果不剔除会导致生成的训练数据被错误标注drawable(text)判断一段文本的所有字符是否都在可渲染码点集合内。不可见字符黑名单 INVISIBLE_CODESmetadata.py 定义了一个覆盖 ASCII 控制字符、各种空格\u2000–\u200F、\u3000全角空格、零宽字符\u200B–\u200D、双向控制符、BOM 等不可见字符的码点集合。validate_cmap()在判断无效码点时会把它们排除在外避免把「能渲染但不可见」的空格误判或误用。默认字体与粗体识别metadata.py 的DEFAULT_FONT_NAMES定义了当前推荐的 16 个默认字体Noto Sans/Serif JP 的常规/细/粗体、Shippori 系列、Kiwi Maru、Kosugi 系列、M PLUS 1p、Klee One 等注释说明该清单是临时的、后续会更新入选条件包括「支持竖排布局」和「纳入 LVF_FONT_NAMES」。is_bold_font()metadata.py则通过字体名是否包含bold/heavy/black后缀判断粗体风格用于后续渲染时区分字重。加载辅助函数 utils.pyutils.py 提供了两个入口load_font(font_name, validate_cmapFalse, validate_font_size16, font_dirFONT_DIR)按名查FONT_MAP映射到文件路径加载成FontInfo若字体名不在映射中则记 error 日志并返回Noneload_fonts(font_names, ...)批量加载自动跳过加载失败的字体返回None的不纳入结果。normalize_font_name()会把字体名中的下划线还原为空格与name_to_filename的转换互逆保证命令行/配置里传入的名字与FONT_MAP键一致。从字体库到合成文本图像渲染链一览虽然原文档只涉及下载与清单生成但了解font_resource的下游用途有助于理解这些资源为何如此组织。从源码结构看draw.py 中的CharDraw以FontInfo和字号为输入用 PILImageFont.truetypeRAQM 布局引擎逐字符渲染支持横排ltr/竖排ttb两种方向、描边stroke_width、阴影、图片字体ImageFonts缓存表混合绘制并为每个字符产出CharBox含坐标、宽高、是否含字距作为标注框metadata.py中的ImageFonts维护vertical × bold × code维度的预渲染字符图像索引可按概率随机替换为图片字体以增加数据多样性。也就是说FontInfo.cmap经validate_cmap清洗后的可渲染码点集是后续训练数据标注正确性的第一道保障list生成的FONT_MAP是各模块按名取字体的统一入口。文件索引与扩展建议原文档最后的「File Index」章节标注为 TODO尚未填写。结合上文分析可以梳理出font_resource的完整文件索引文件/目录说明download_google_fonts.pyGoogle Fonts 批量下载器list.py字体清单生成命令metadata.pyFontInfo、FONT_NAME_ID、INVISIBLE_CODES、DEFAULT_FONT_NAMES、ImageFontsfont_map.py字体名 → 路径映射由 list 生成及存在性校验utils.pyload_font/load_fonts加载入口draw.py逐字符渲染、标注框生成CharDraw/CharBoxdocs/font_list.md已生成的详细字体清单文档fonts/下载的字体文件存储目录含各字体家族子目录如果你想扩展字体库可参照现有模式将新字体放入font_resource/fonts/下的独立目录重新运行python3 -m font_resource.list刷新FONT_MAP与文档清单再通过utils.load_font(字体名)在合成流水线中使用。需要提醒的是模块目前仅支持日文字体字体来源与许可证信息请以各字体内嵌的 name 表元数据为准。小结font_resource模块以两个命令覆盖了字体资源管理的完整闭环download_google_fonts负责从 Google Fonts 批量获取日文字体跳过已存在目录、归档解压、进度显示list负责将字体库沉淀为机器可读的元数据与映射简单/详细/Markdown 三种粒度。底层由FontInfo基于 fontTools PIL 渲染校验和FONT_MAP支撑确保合成文本图像训练数据时既能按名取字又能拿到经过清洗、确实可渲染的字符集合避免不可渲染码点污染标注。如果你正在 nunif 生态中构建文本图像合成或 OCR 类训练流程这套「下载 → 盘点 → 加载 → 渲染」的链路值得直接复用。赞分享人工智能深度学习计算机视觉图像处理视频处理预训练【免费下载链接】nunifMisc; latest version of waifu2x; 2D video to stereo 3D video conversion项目地址https://gitcode.com/gh_mirrors/nu/nunif点击查看免费下载相关推荐raylib 文本示例字体资源清单与许可合规指南基于 examples/text/resources 的完整字体族谱raylib 文本示例字体资源清单与许可合规指南基于 examples/text/resources 的完整字体族谱 raylib 仓库内置了一批可直接用于游游戏开发图形学3D渲染上一篇终极指南Orleans与EF Core集成的分布式数据访问最佳实践下一篇linux-dash数据缓存策略减少系统调用的优化方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/5 12:57:45

MeyboMail Web 部署指南:JavaMail 收发信配置与二次开发避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 12:57:45

基于STM32与HX711的智能计价电子秤完整设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 12:57:45

YOLO目标检测实战:底特律街景数据集与训练避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 14:02:51

从提示符到历史管理:打造一套可复用的Shell终端增强环境

1. 从一个小需求到一套完整的终端工作区先说说我为什么开始折腾这套东西。你如果整天跟命令行打交道,大概率也会被这几个问题烦到:提示符光秃秃的,连自己现在在哪个分支、哪个目录都看不出来;敲过的历史命令翻起来全靠运气&#x…

2026/10/5 14:02:51

医院门诊挂号系统毕业设计:SSM+JSP核心实现与并发防超挂解析

毕业设计选医院门诊挂号系统的同学,我猜你多半是冲着"这个题简单、资料多、容易过"去的。说实话,这个选题确实适合作为JAVA方向毕设,但它真正考察的技术点比看上去多得多:SSM框架的整合、JSP服务端渲染、事务与并发控制…

2026/10/5 14:02:51

Vitis HLS入门指南:从RTL痛点到底层原理与实战优化

在FPGA开发这个圈子里,Vitis HLS恐怕是最容易引发争论的工具之一。我做了很多年FPGA逻辑,用Verilog写过图像处理、通信基带、接口控制,早期对HLS是完全不感冒的——总觉得用C写硬件,综合出来的电路既不可控又浪费资源。直到接手一…

2026/10/5 14:02:51

Java Calendar类实战:日期运算、格式化与时区避坑指南

做Java开发这些年,要说哪个类最让人“又爱又恨”,java.util.Calendar绝对排得上号。这节内容在课程里排到2.20,看着像是个入门章节,但真到实战里,Calendar类的用法能玩出不少花活——月份从0开始、时区偏移、夏令时、线…

2026/10/5 14:02:51

高分辨率无人机城市图像语义分割:8类标注与270张图的训练实战

简介:该数据集面向城市遥感与计算机视觉研究者,聚焦无人机视角下的高分辨率城市地物语义分割任务,提供8个类别的像素级标注,可用于训练与评估分割模型。包内共543个文件,以541张PNG格式的原始影像与对应掩膜为主&#…

2026/10/5 13:57:49

Java集合框架Set底层原理:HashSet与TreeSet深度解析

聊到 Java 集合框架,Set 永远是面试里绕不开的一类。HashMap 和 ArrayList 大家天天都在用,但 Set 常常被当成“一个能去重的 List”草草带过。我在面试候选人的时候问过一道题:“HashSet 的 add 方法底层到底做了什么?”能把这条…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑