wyzdwdz 发表于 2022-11-25 22:43:15

assfonts: 字体文件子集化工具,提供嵌入字幕功能(更新v0.7.3)

本帖最后由 wyzdwdz 于 2024-10-6 19:10 编辑

新人报道,分享一个自己写的小工具 assfonts

v0.6.0 实装新功能:Subfonts rename,勾选中这个选项可以在给字体做子集化时给该字体自动更换一个随机的名字,同时修改字幕中字体名称以匹配这个子集化后的字体。(该功能主要用于防止多个字幕同时集成进同一文件中时,相同名称字体互相冲突的问题)

v0.3.0 新版整合 asshdr 程序,提供两个预设选项: HDR High 对应的输出亮度为203nit,HDR Low 对应的输出亮度为 100nit 。这个功能主要用解决观看 HDR视频时字幕亮度过高的问题。注意如果只想用HDR的功能,可以把 Subset only 和 Embed only 同时勾选上。


写了一个简单的 GUI 界面,直接打开 assfonts-gui.exe 即可,它可以独立运行。




因为平时有把字体文件嵌入mkv的需求,但是有时字幕需要的字体太多,如果全部嵌入会导致视频文件体积暴涨。但其实一个字幕并不需要字体中的所有字形,因此只需要保留所需的字形并剔除无用的部分就可以显著地缩小文件体积,并且不会影响到字幕的渲染,这一过程又被称为字体的“子集化”。

基于这一思路,开发了这个小程序。它可以根据ASS字体文件在指定的字体库中查找所需字体并对其进行子集化。本程序还提供另外一个功能,根据ASS字幕文件的一个特性,即允许直接在字幕脚本中嵌入经过UUEncode编码后的字体文件,本程序可以将经子集化后的或任意指定的字体直接嵌入ASS字幕中。这样只需要一个字幕文件就可以包含全部信息,实现类似PGS等图形字幕的效果,而且与之相比具有更小的体积、放大不会模糊的特性。

程序确保无毒,可以放心下载,提供源代码链接 github.com/wyzdwdz/assfonts
不放心的可以自己编译。


GUI 程序使用说明

由 mikusa 提供的 GUI 使用教程

命令行程序使用说明

首先在你的终端或者命令提示符中进入程序所在的目录(或者直接把这个目录添加进环境变量中)。输入
.\assfonts.exe -h    或者省略前面的 .\ 如果已经加入到环境变量中的话
出现类似这些内容就说明运行成功了

接着如果你已经拥有一个自己的字体库(类似“超级字体整合包”)的话,建议首先初始化字体库,以我自己的目录为例
.\assfonts.exe -f "D:\超级字体整合包 XZ\完整包" -b它会自动扫描这个目录及其子目录下全部的字体文件并生成一个名叫fonts.db的数据库文件(注意!如果你没有通过 -d 选项指定数据库的路径的话,它是默认保存在你当前终端的运行目录下面的,这个可能不会是程序所在的目录),之后程序在检索字体时即使你没有通过 -f 指定 fontpath 或者 fontpath 中的字体没满足要求,它也会自动调用这个数据库中信息。当然如果你的字体库有了更新只需要重新输入这条命令就可以更新数据库了。

下面假设我有一个字幕文件路径是 D:\test dir\test.ass,最简单的就是直接输入
.\assfonts.exe "D:\test dir\test.ass"    或者    .\assfonts.exe -i "D:\test dir\test.ass"这样就可以自动生成一个已经嵌入字体信息的字幕 test.assfonts.ass 和一个文件夹 test_subsetted,文件夹里面有子集化后字体文件,输出目录默认与输入的字体同目录,你也可以通过 -o 选项指定其它输出目录。这样一个最简单的使用流程就结束了。另外,有时候你下载的字幕包会附带一个字体文件夹,你也可以使用 -f 命令指定这个文件夹,这样程序就会优先从这个文件夹中检索字体。
.\assfonts.exe -f "D:\test dir\test-fonts-dir" "D:\test dir\test.ass"
注意!根据 ASS Specs 标准文件所述,ASS 字幕只能够嵌入 Truetype 字体,即 ttf 文件,但是本程序忽略了这个规定,允许任意类型的字体嵌入。这些非 ttf 字体可能不会被某些播放器识别,造成字幕显示异常。

这里提供一种解决方法,还是以上面为例,首先键入 -s 选项,使程序只做子集化,不嵌入字幕中。
.\assfonts.exe -s "D:\test dir\test.ass"然后通过第三方工具把 test_subsetted 文件夹中的非 ttf 字体转换成 ttf(推荐使用 otf2ttf 这个 python 工具),接着使用 -e 选项,规定程序只将所需的字体嵌入字幕而不再对其做子集化(因为这些已经子集化过了)。
.\assfonts.exe -e -f "D:\test dir\test_subsetted" "D:\test dir\test.ass"    注意使用 -f 指定已经子集化后的字体目录
这样就解决了。实在不能转换的话,也可以直接用 mkvtoolnix 等工具把字体嵌入视频文件中。


关于其它选项和更多的使用方法,可以通过 --help 查看(命令行),也欢迎在评论区中咨询。

软件只经过个人有限的测试,不保证稳定,欢迎大家使用并提交 BUG,我会尽快完善。

最后求管理员给个置顶,让更多人看到,谢谢!!!


更新日志:

v0.7.3
- 修复 ass 解析 bug:当 \fn、\b、\i 覆写符出现在 \r 后失效
- 设定样式的 italic 值为 -1 时启用斜体

v0.7.2
- GUI Linux 版修复在 mesa 24.0+ 驱动下 Wayland 环境无法显示标题栏的 bug

v0.7.1
- GUI Linux 版添加对 Wayland 的原生支持

v0.7.0
- 修复无法识别部分繁体中文字体的 bug
- GUI 使用的 Qt 框架更新至 6.6,支持夜间模式
- 新增对 armv7l 架构的 Linux 支持与对 x86 架构的 Linux 和 Windows 平台支持

v0.6.3
- 修复 GUI 中显示大括号闪退的 bug

v0.6.2
- 添加实验性新功能:font combined ,勾选后,当输入字幕大于一个时,子集化后会合并相同名字的字体
- 添加 GUI 新功能:Reset all ,恢复初始设置
- 修复无法显示最后一行日志的 bug

v0.6.1
- 修复当识别到非字体文件时闪退的 bug
- asshdr 模块更新至 v0.1.2,修复由其引起的闪退 bug

v0.6.0
- 重构 Subfonts rename 功能并正式实装,解决已知 bug

v0.5.5
- 修复 ASS 字幕解析 bug
- 修复 font rename 后的部分字体名称没有更改的 bug

v0.5.4
- 修复 ASS 字幕解析 bug
- 允许在 font directory 栏输入多个文件夹路径,用 ;隔开
- 在建立字体库时自动添加系统的默认字体文件夹,如 Windows 系统中会自动扫描 C:\Windows\Fonts 中的字体并添加进字体库
- 修复字体解析 bug,防止字体名称出现 \u0000 后缀 (升级到该版本后,建议手动删除 fonts.json 文件并重新建立字体库,该文件在 Database directory 路径的文件夹里面)

v0.5.3
- 添加新功能 : mutli thread (多线程),默认关闭,GUI 程序可以在 Other 菜单中开启,命令行程序使用 -m 开启。注意:如果电脑 cpu 的线程数过多且读取的 ASS 文件过大,程序可能会占用大量内存。
- 为 Unix 程序添加 manpage 文档
- 显著改善 ASS 字幕解析性能,可以快速解析大小超过百兆的文件
- 修复 bug:对相同名字的子集化字体文件自动重命名,以避免文件被自动覆盖
- 更改字体的字重 weight 的解析方式,以获得更精确的结果(建议手动删除 fonts.json 字体库文件,并重新建立字体库)

v0.5.2
- 修复 aarch64 Linux GUI 中无法找到最新版本号的 bug
- 当 GitHub 无法正常访问时,使用 gitee 源作为 check update 的链接
- 修复 Linux 系统无法使用输入法的 bug
- 修复 Linux 系统 HiDpi 缩放比例不正常的 bug
- 当 GUI 程序关闭,自动记录当前程序的状态,下一次打开时会自动恢复(包括程序的设置和输入框内的字符)
- 修复每次只显示一个缺失码位的 bug

v0.5.1
- Windows GUI 使用原生字体渲染引擎
- 修复 Check update 导致程序假死 bug
- 修复部分安全漏洞

v0.5.0
- GUI 回归初版布局,提供新版本的命令行工具

v0.4.1
- 修复 mkvtoolnix 无法识别改名后的字幕 bug
- 添加新版本的检测功能

v0.4.0
- 添加新功能:Subfonts rename,勾选中这个选项可以在给字体做子集化时给该字体自动更换一个随机的名字,同时修改原字幕中字体名称以匹配这个子集化后的字体。(该功能主要用于防止多个字幕同时集成进同一文件中时,相同名称字体互相冲突的问题)
- 修复 xy-subfilter 无法渲染纵向省略号的问题
- 修复 ass 字幕解析 bug
- 使用 imgui 作为 GUI 框架以提高 Linux 系统下的兼容性


下载地址(GitHub)

下载地址(码云)





















Windows 版本支持 win7 及以上,如果提示缺少文件,请尝试安装 Visual C++ 可再发行程序包

Linux 版本支持 Ubuntu 18.04 及以上(或其它 Linux 发行版)

macOS 版本由于我没有 mac 机器,所以无法做测试,如果有运行问题或 Bug,欢迎回帖指出
目前由于软件没有任何签名,所以新版的 macOS 应该会提示文件损坏,需要用户手动允许软件运行



























孤雨独火 发表于 2022-11-26 00:55:14

在论坛里看过几个人给出的子集化工具了,要打差异化的话上GUI吧(

wyzdwdz 发表于 2022-11-26 01:17:17

嗯,在写了。。。{:10_1069:}


差异化的话我这个轻量一点,功能更纯粹,也不用依赖其它软件,写命令行主要方便做脚本大规模处理
还有就是可以跨平台吧,之后我争取把它移到 mac 和 linux 上面

看大家的需求吧,哪个方便用哪个,更多的人来分享才好嘛{:10_789:}

Lambholl 发表于 2022-11-26 01:23:18

本帖最后由 Lambholl 于 2022-11-26 01:32 编辑

孤雨独火 发表于 2022-11-26 00:55
在论坛里看过几个人给出的子集化工具了,要打差异化的话上GUI吧(
确实是这样 可能大家看了这个帖子 还是会选择继续用 AssFontSubSet
AssFontSubSet 更新了这么久,也针对子集化过程中各种各样的问题进行了修复(比如有一个居中思源省略号的选项),这时候推出了一个新的工具,也没有 gui,也没法保证不会出现那些别的工具出现过、后来被修复的问题,这可能就会是很难吸引人去用的原因

命令行来做兼容性和跨平台的话 我觉得确实是一个非常好的特色


(最后插一句 这玩意可能还是放github上比较方便 这论坛里面提issue事后看起来也很麻烦

wyzdwdz 发表于 2022-11-26 01:47:41

github链接我放了不过好像只能文本显示,萌新等级太低,没办法发超链接{:13_907:}

pikaqiu2020 发表于 2022-11-26 10:18:46

厉害的 测试了 转出来的外挂ass可以在infuse appletv版emby fileball 正常显示 应该是基于MPV的都OK

pikaqiu2020 发表于 2022-11-26 16:31:50

问2个问题 能否直接替换掉原本的ass字幕 而不是加_XXXX 或者加成.XXX.ass也成
字体集成进去后 有办法清除掉吗

wyzdwdz 发表于 2022-11-26 18:34:06

pikaqiu2020 发表于 2022-11-26 16:31
问2个问题 能否直接替换掉原本的ass字幕 而不是加_XXXX 或者加成.XXX.ass也成
字体集成进去后 有办法清除掉 ...

替换的话实在不建议,因为怕误操作删除掉原文件,这个风险太大了,不过下划线改成点是个不错的主意,这样播放器也应该能够自动由视频识别到字幕而不用再改名了。清除的功能我是这样想的,如果检测到输入文件已经有字体了,就自动删除它,生成一个xxx.cleaned.ass的文件,然后再在这个新文件基础上嵌入字幕。这个功能后面我会加上

wyzdwdz 发表于 2022-11-26 18:44:00

还有就是目前这个程序还没有实现粗体、斜体的功能,只是简单的根据字体名去找字体。这个后面也会优化,但问题是各家渲染器在如何处理粗体、斜体并不统一。有没有懂的大佬能简单介绍一下,要不我还得去啃libass的源码,以它的实现为标准吧

pikaqiu2020 发表于 2022-11-27 11:24:01

能否子集化嵌入ASS 但不生成字体文件 目前似乎没这功能 只能不子集化不生成字体文件夹嵌入ass

不子集化字体嵌入ASS之后 无法清除字体达到还原字幕的目的
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: assfonts: 字体文件子集化工具,提供嵌入字幕功能(更新v0.7.3)