網站可能被牆,請記住以下域名:subhd.me subhd.one
【工具分享】基于浏览器的ASS字幕字体子集化工具
蒙太奇字幕组

大家好,我是蒙太奇字幕组的小p。去年八月从事字幕制作后不久,在咱们的这个 SubHD 论坛 ( https://subhd.tv/forum/f/84307 ) 看到有人提到字体子集化,那是我第一次接触到这个概念。

如今我专门开发了一个网页工具,实现基于浏览器的 ASS字幕字体子集化,帮助大家无需安装软件就能实现字体子集化功能。

这个帖子重点分为两部分:解释什么是字体子集化,以及我的发现思路。如果你只是想要使用工具,请直接看最下方的链接。



【什么是字体子集化?】

ASS 特效字幕里自定义字体很常见,但自定义后观众需要在设备上安装相应字体。桌面可以随意安装,手机和电视等封闭系统就麻烦了。

为了避免让观众安装字体,常见的解决办法有三种:

1. 把字体嵌入 ASS 字幕。问题是中文字体字量庞大,会把原本几百 KB 的字幕膨胀到 15MB 到 50MB;
2. 转为 .sup/.sub 的图形字幕。会失去可编辑性,改错字只能重做生成,并且播放时快进快退还可能出现卡顿;
3. 把字体和字幕封装进 MKV。既增大体积又不可编辑,融合了上面两种方法的缺点。

以上方法还有一个共同痛点:需要使用专用工具,很多甚至只有命令行界面,门槛高。

字体子集化的原理很简单:把字体中没有在字幕里使用的字符删除,只保留字幕实际用到的字符。典型中文字体有一万到七万字,但一个字幕常用字大概只有两千左右。把不用的字去掉后,嵌入字体的体积会大幅缩小。以前嵌入一个中文字体可能需要 25MB,现在处理后可以降到 1MB 甚至更小。



【为什么这项技术没被广泛使用?】

早期只能用命令行,近年有人做了带界面的桌面软件,这对推广这项技术很有帮助,很感谢那些投入时间的开发者们。

我想分享一下自己的体验。我了解这个功能已有半年,但一直没有采用,主要是因为需要安装软件。安装说起来简单,但意味着还要学习软件的使用方法。更重要的是,每次修改字幕后都需要重新子集化,这无形中增加了制作流程的成本。对于像我这样倾向于简化工作的人来说,这些因素足以让我暂时搁置这个想法。

我觉得这可能也是许多人还没有用字体子集化的原因,这正是我后来决定探索浏览器实现方案的初衷。



【为什么做成浏览器工具?】

做《至尊马蒂》字幕时 ( https://subhd.tv/a/s6wlH8 ),我第一次深入研究子集化。为了实现极致特效,我们用了大量绘图指令和动态追踪,结果 ASS 文件膨胀到 20MB(真的是 .ass)。为了解决体积问题,我写了一个 Python 脚本,把近 600 个重复的图形指令替换为 12 个字体字符,字幕从 20MB 降到 1MB。脚本虽然可用,但命令行门槛较高,实际使用者很少,基本只有我在用。于是我着手将其移植到浏览器,起初目的是缩小图形指令体积,随后把重心扩展到字体子集化,最终在浏览器端实现了两者的子集化,可能是首次有人这样做。



【网页工具能做什么?】

- 上传要子集化的 ASS 字幕;
- 自动分析字幕中是否包含图形指令和非系统字体,并提示是否进行子集化;
- 把图形指令子集化为字体并嵌入字幕以复用减少体积;对第三方字体会提示上传字体文件,浏览器端剥离实际使用的字符并嵌入字幕。

为了体验更好,我采用了一些现代 web 标准,页面可添加到任务栏或主屏幕,启动速度接近本地应用。桌面浏览器下支持离线使用(没错,加载完网页后可以拔掉网线继续用)。工具完全在浏览器本地运行,字幕和字体不会上传到服务器。已开源并部署在 GitHub Pages。



【在哪里使用?】

https://montagesubs.github.io/ass-subset/



欢迎反馈与帮助。我们希望通过这个工具降低字幕制作门槛,完善基础设施,推动字幕生态更繁荣。

如果你觉得有用,欢迎分享给更多人,也欢迎一起做字幕。



蒙太奇字幕组 (MontageSubs)
“用爱发电 ❤ Powered by Love”
發表留言 共 11 条

蒙太奇字幕组
【2.8 版本发布】

本版本引入分组模式,并增强了字体版权提示,并为 MKV 打包工作流带来显著优化。


【新增功能】

• 分组模式:支持多字幕打包时的字体复用,避免冗余嵌入(鸣谢 粑粑超人)
• 字体限制警告:新增 fsType 限制提示,帮助识别字体授权问题(鸣谢 NickCollect)


【什么是分组模式?】

分组模式解决的核心问题是:当同一 MKV 中包含多个 ASS 字幕且使用相同字体时,传统方式会导致每个字幕独立嵌入相同字体,造成大量冗余字符。分组模式将多个字幕视作一个整体进行字体子集化、嵌入处理,实现字体复用。

核心优势:
• 减少文件冗余 - 避免相同字符在多个字幕中重复嵌入
• 优化文件体积 - 通过字体复用显著降低 MKV 体积
• 提升兼容性 - 避免多字幕播放时的缓存冲突导致缺字

【使用场景一:字体嵌入到单 MKV 的多字幕中】

如果需要将字体直接嵌入到字幕文件中,按以下步骤操作:

启用分组
上传该 MKV 所有需要的多个字幕
选择嵌入目标字幕(建议选择播放器首先加载的字幕,自动为第一个)
进行嵌入

这种方式下,字体会被嵌入到选定的字幕文件中。

【使用场景二:字幕与字体分离(单 MKV 的多字幕场景)】

如果希望在打包 MKV 时保持字幕和字体分离,按以下步骤操作:

启用分组
上传该 MKV 所有需要的字幕
选择"字幕与字体分离"选项
下载包含 fonts 文件夹的字幕包

下载的文件中会包含"fonts"文件夹,其中是这一组字幕所需的所有字体。在打包 MKV 时,可将多个字幕、fonts 文件夹内的字体和视频统一打包到同一个 MKV 中。

【可选设置:随机化字体名称】

如担心多字幕播放器因缓存导致跨字幕读取时丢失字符,可启用此选项。随机化字体名称能增强播放器的兼容性,避免字体名称冲突问题。

蒙太奇字幕组
我们的子集化工具目前主要为字幕制作完成后的嵌入字体环节设计,整个流程是围绕字幕制作工作而构建的。之前群内提到的,如果工作流涉及 MKV 打包,这个工具就很难直接适用,主要原因有两点:

1. 无法处理多字幕合并:当一个 MKV 包含多集动漫(比如 10 集动漫在一个文件中有 10 个字幕)时,工具无法把这些字幕的字符集合并,生成一个统一的子集化字体。

2. 缺少独立字体输出:虽然 UI 里有字体下载功能,但那本质上是用于调试字体问题的。工具目前不支持直接输出子集化后的字体文件供 MKV 打包流程使用(字体是嵌入在字幕内,而非独立提供)。

所以我想了解一下大家的实际使用场景:你们对这类"多字幕合并成一个字体"的需求是否比较常见?这会帮我们评估是否值得扩展工具功能。

RobCop
赞,开源吗?
蒙太奇字幕组
是的,完全开源,右下角有通往Github的链接

Orenji
感谢,感觉是目前字幕子集化工具里最好用的
蒙太奇字幕组
你好,我是小p,感谢你的支持。这一个月来我几乎每天都在根据大家的反馈改进,代码更新得很频繁,哈哈。现在功能应该比较稳定了,如果后续遇到任何问题或bug也欢迎继续反馈。

蒙太奇字幕组
2.6 版本正式发布了

这次我们实现了论坛字幕作者们期待的功能——字幕字体随机化支持。为了防止映射表丢失,我在字体表 ID 10 字段加入了 YAML 格式的映射数据:

FontSubsetMap: {original: 思源黑体, subset: QTSGQJIO, ass-subset: 2.6}

分别记录原始字体名、随机后的名字,以及生成工具版本。这样既能兼容其他开发者的字幕子集化软件,又能确保字体映射不会丢失。

第二个功能是按字重生成独立字体。现在支持为不同字重各自生成独立字体文件,播放器就能使用真实字重而不是合成字重,显示效果更好。这是可选功能,因为会增加嵌入字体数量,但能让 libass 更好地选择对应字体。

另外还有一些代码优化和 bug 修复。

欢迎使用!

蒙太奇字幕组
ASS 字幕子集化工具 v2.3 正式发布

基于大家的建议,v2.3 新增了 5 大功能:

新功能一览:
1. 批量去除子集化 - 快速清除已子集化的字体;
2. 字体下载服务 - 预览后即可下载子集化字体;
3. 文件夹上传 - 支持拖拽上传整个文件夹,批量处理效率翻倍;
4. 现代字体格式 - 新增 WOFF/WOFF2 格式支持;
5. 灵活命名方案 - 下载时可自由选择添加后缀或保持原名。

蒙太奇字幕组
2.0 版本重磅更新

感谢大家的支持和建议,新版本实现了以下核心功能:

批量字幕子集化处理 — 一次操作完成多个文件 (感谢 @sillonae 提议)
智能字体加载 — Chrome 和 Edge 浏览器自动识别系统字体,无需上传 (感谢 @zxj999 提议)
多线程加速引擎 — 处理速度显著提升,批量文件处理效率翻倍
实时字体预览 — 直接查看最终效果,免除加载步骤
系统字体嵌入支持 — 灵活选择是否嵌入系统安装的字体

此外还有众多细节优化和性能改进,欢迎体验。

额外惊喜:我们正式推出【基于浏览器的 SVG 转 ASS 绘图指令工具】,点击( https://subhd.tv/forum/f/84793 )查看详情。

特别感谢 @op200 在字体元数据提取上的代码思路,以及 @MoYuanCN 提供的大规模测试数据(40万行字幕文件),帮助发现并修复了工具在极端场景下的缺陷。

Kicom
试了,挺好用的,多一个选择,感谢

蒙太奇字幕组
我们还有另外一个工具【SVG转ASS绘图指令】这也是我们制作字幕期间解决痛点开发的,稍后过几天我们会再写一篇帖子解释那个。

不过,你现在就可以先使用了:https://montagesubs.github.io/svg-to-ass/

最新評論
【2.8 版本发布】 本版本引入分组模式,并增强了字体版权提示,并为 MKV 打包工作流带来显著优化。 【新增功能】 • 分组模式:支持多字幕打包时的字体复用,避免冗余嵌入(鸣谢 粑粑超人) • 字体限制警告:新增 fsType 限制提示,帮助识别字体授权问题(鸣谢 NickCollect) 【什么是分组模式?】 分组模式解决的核心问题是:当同一 MKV 中包含多个 ASS 字幕且使用相同字体时,传统方式会导致每个字幕独立嵌入相同字体,造成大量冗余字符。分组模式将多个字幕视作一个整体进行字体子集化、嵌入处理,实现字体复用。 核心优势: • 减少文件冗余 - 避免相同字符在多个字幕中重复嵌入 • 优化文件体积 - 通过字体复用显著降低 MKV 体积 • 提升兼容性 - 避免多字幕播放时的缓存冲突导致缺字 【使用场景一:字体嵌入到单 MKV 的多字幕中】 如果需要将字体直接嵌入到字幕文件中,按以下步骤操作: 启用分组 上传该 MKV 所有需要的多个字幕 选择嵌入目标字幕(建议选择播放器首先加载的字幕,自动为第一个) 进行嵌入 这种方式下,字体会被嵌入到选定的字幕文件中。 【使用场景二:字幕与字体分离(单 MKV 的多字幕场景)】 如果希望在打包 MKV 时保持字幕和字体分离,按以下步骤操作: 启用分组 上传该 MKV 所有需要的字幕 选择"字幕与字体分离"选项 下载包含 fonts 文件夹的字幕包 下载的文件中会包含"fonts"文件夹,其中是这一组字幕所需的所有字体。在打包 MKV 时,可将多个字幕、fonts 文件夹内的字体和视频统一打包到同一个 MKV 中。 【可选设置:随机化字体名称】 如担心多字幕播放器因缓存导致跨字幕读取时丢失字符,可启用此选项。随机化字体名称能增强播放器的兼容性,避免字体名称冲突问题。 - 蒙太奇字幕组