2051 字
10 分钟

ASS 字幕字体子集化:从原理到实践

终于收藏整理的BD破500了,本次放出一个自己用的项目

image-20260320143357921

image-20260320143131097

image-20260320143317481

什么是 ASS 字幕?#

ASS(Advanced SubStation Alpha)是一种功能强大的字幕格式。与常见的 SRT 字幕相比,ASS 字幕支持:

  • 自定义字体——可以为不同的文本指定不同字体
  • 特效与动画——淡入淡出、卡拉 OK 效果、位移动画
  • 精确定位——字幕可以放在画面的任意位置
  • 丰富样式——边框、阴影、颜色渐变等

这些能力让 ASS 字幕成为了番剧字幕组的首选格式,尤其是制作精良的内嵌特效字幕。

但 ASS 的表现力依赖一个前提:播放端必须有字幕引用的字体

字体问题的由来#

问题很简单:你的电脑上可能装了方正FW筑紫A丸ゴシック、思源宋体、华文行楷,但你的电视、手机、平板上大概率没有。

缺少字体时,播放器会使用默认字体来替代。于是原本精心排版的字幕变成了这样:

  • 标题用的艺术字体 → 变成宋体
  • 日文假名的特殊字体 → 变成方块豆腐
  • 精心调整的字距和行距 → 全部错乱
flowchart TD A["ASS 字幕引用字体\n(如:方正FW筑紫A丸ゴシック)"] --> B{"播放器检查\n本地是否有该字体"} B -->|"有"| C["✅ 正常显示\n视觉效果完美"] B -->|"没有"| D["❌ 回退到默认字体"] D --> E["样式崩坏\n排版错乱"] D --> F["缺字显示豆腐块 □"]

这就引出了两种常见情况:

情况一:字幕裸奔,完全没有字体#

很多时候,你从网上下载的字幕就是一个光秃秃的 ASS 文件,里面引用了一堆花里胡哨的字体名,但字体本身?没有。不在 MKV 里,也不在压缩包里,字幕组默认你自己去找。

于是你打开视频,字幕全是宋体,特效字变成了方块豆腐,歌词字幕挤成一坨——这就是”字幕裸奔”的下场。想看正常效果?你得自己满世界找字体,手动安装到系统里,而且换一台设备就要重来一遍。

原效果子集化嵌入字体后
原效果子集化嵌入字体后

情况二:字体全塞进去,体积爆炸#

负责任的字幕组会把字体打包进 MKV 容器。MKV 支持附件(Attachment),可以把 TTF/OTF 字体文件嵌入视频文件中。这样无论在哪台设备播放,字体都在。

但问题来了——一个 CJK(中日韩)字体动辄 20-70MB,一部番剧字幕引用 5-6 个字体是常态。于是一个 200MB 的视频,嵌入字体后轻松变成 400MB。

两难困境#

不带字体,效果崩坏;带完整字体,体积翻倍。字体子集化就是解决这个两难问题的方案。

什么是字体子集化?#

**字体子集化(Font Subsetting)**的核心思想非常简单:

字幕里只用了 200 个汉字,为什么要嵌入包含 30000+ 字形的完整字体?

子集化就是从完整字体中只提取字幕实际用到的字形,重新打包为一个精简的字体文件。

一个实际的例子:

完整字体子集化后
思源黑体16.4 MB~200 KB
方正FW筑紫A丸ゴシック8.7 MB~150 KB
总计 6 个字体70 MB~2 MB

没错,70MB 的字体可以压缩到 2MB,而视觉效果完全不变——因为字幕需要的每一个字形都完整保留了。

flowchart LR A["ASS 字幕文件"] --> B["解析用到的字符"] B --> C["从字体中\n提取对应字形"] C --> D["生成子集字体"] D --> E{"输出方式"} E --> F["嵌入 ASS\n(UUEncode 附件)"] E --> G["打包进 MKV\n(附件形式)"]

子集化的好处#

节约存储空间#

这是最直观的好处。一季 12 集番剧,每集节省 200MB 字体,整季就能节省 2.4GB 空间。

加快网络传输#

无论是 NAS 串流到电视,还是在线播放,更小的文件意味着更快的缓冲和更少的卡顿。30Mbps 带宽下,200MB 字体需要约 53 秒才能加载完,而 2MB 只需要不到 1 秒。

跨设备兼容#

子集化后的字体可以嵌入到 ASS 文件本身(通过 UUEncode 编码的 [Fonts] 段),或者嵌入 MKV 容器。无论在什么设备上播放——电视、手机、平板、电脑——都能正确显示字幕样式,无需手动安装字体。

简化分发#

一个包含嵌入字体的 ASS 文件,就是一个完全自包含的字幕文件。分享给别人时,不需要额外附带字体包。

现有工具#

字体子集化并非新概念,社区已有一些优秀的工具:

Assfonts#

Assfonts 是一个跨平台的 GUI/CLI 工具,支持 Windows、macOS 和 Linux。它可以从本地字体库中查找字幕引用的字体,进行子集化后嵌入 ASS 或打包进 MKV。

MkvAutoSubset#

MkvAutoSubset 等工具也提供了类似的功能,主要面向 MKV 封装场景。

本地工具的痛点#

这些工具都很好用,但有一个共同的限制:它们都是本地工具

  • 需要在本地维护一个庞大的字体库(通常几十 GB)
  • 换一台电脑就要重新配置
  • 服务器上没有 GUI 环境时使用不便
  • 字体库更新需要手动管理

FontInAss —— 我的在线子集化方案#

受 Assfonts 的启发,我开发了 FontInAss——一个基于 Cloudflare Workers 的全在线字幕字体子集化服务。

之前我写过一篇 使用 Docker Compose 部署 fontInAss 字幕字体处理服务,介绍了如何自托管 FontInAss 并与 Emby/Jellyfin 集成,实现播放时自动处理字幕字体。今天这篇文章则从原理层面展开,聊聊字体子集化本身,以及 FontInAss 在线版的设计。

为什么做这个?#

我的需求很简单:我不想在每台电脑上都维护一个几十 GB 的字体库,我希望有一个在线服务,上传 ASS 文件就能得到子集化后的结果。

核心特点#

  • 全在线:基于 Cloudflare Workers,无需安装任何软件
  • 海量字体库:105GB 字体库(VCB-Studio + Lam 字体集),存储在 Cloudflare R2 对象存储
  • 批量处理:一次最多上传 20 个文件
  • 多格式支持:支持 ASS / SSA / SRT 格式,SRT 自动转换为 ASS
  • 智能字体匹配:根据 weight、italic 等属性评分匹配最合适的字体
  • 缓存加速:KV 缓存(7 天 TTL),相同请求秒返回结果
  • 中英文双语:界面支持中文和英文切换
flowchart TD A["用户上传 ASS 文件"] --> B["Cloudflare Worker\n解析字幕"] B --> C["提取引用的字体名\n和使用的字符"] C --> D["D1 数据库\n查询字体元数据"] D --> E["R2 对象存储\n获取字体文件"] E --> F["opentype.js\n执行子集化"] F --> G["UUEncode 编码\n嵌入 ASS"] G --> H["返回子集化后的 ASS"] I["KV 缓存"] -.->|"命中缓存\n直接返回"| H B -.->|"检查缓存"| I

使用方式#

  1. 访问 font.anibt.net
  2. 将 ASS / SSA / SRT 文件拖拽到上传区域(或点击选择文件)
  3. 等待处理完成
  4. 下载子集化后的文件

如果遇到字体库中缺少的字体,可以通过网站上的留言功能或 Telegram 联系提交字体需求。

子集合集

46MB超大处理

结语#

字体子集化是一个看似小众但实际影响很大的优化手段。它能让你的番剧体积减半,让串流播放更流畅,让字幕在任何设备上都完美呈现。

如果你是字幕组成员、动画收藏爱好者、或者 NAS 用户,不妨试试 FontInAss。有任何问题或建议,欢迎反馈。

参考资料#

ASS 字幕字体子集化:从原理到实践
https://catcat.blog/2026/03/ass-font-subsetting-fontinass.html
作者
猫猫博客
发布于
2026-03-20
许可协议
CC BY-NC-SA 4.0