请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
查看: 14837|回复: 100

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

  • TA的每日心情
    开心
    2022-11-25 20:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    44

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    62178
    wyzdwdz 发表于 2022-11-25 22:43:15 | 显示全部楼层 |阅读模式
    本帖最后由 wyzdwdz 于 2023-4-26 01:15 编辑

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


    v0.3.0 新版整合 asshdr 程序,提供两个预设选项: HDR High 对应的输出亮度为
    203nit,HDR Low 对应的输出亮度为 100nit 。这个功能主要用来解决观看 HDR
    视频时字幕亮度过高的问题。

    注意如果只想用HDR的功能,可以把 Subset only 和 Embed only 同时勾选上。


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



    GUI的使用方法在最后

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

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

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

    简单介绍一下程序的使用方法,首先在你的终端或者命令提示符中进入程序所在的
    目录(或者直接把这个目录添加进环境变量中)。输入
    1. .\assfonts.exe -h    或者省略前面的 .\ 如果已经加入到环境变量中的话
    复制代码

    出现类似这些内容就说明运行成功了


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

    下面假设我有一个字幕文件路径是 D:\test dir\test.ass,最简单的就是直接输入
    1. .\assfonts.exe "D:\test dir\test.ass"    或者    .\assfonts.exe -i "D:\test dir\test.ass"
    复制代码
    这样就可以自动生成一个已经嵌入字体信息的字幕 test.assfonts.ass 和一个文件夹 test_subsetted,
    文件夹里面有子集化后字体文件,输出目录默认与输入的字体同目录,你也可以通过 -o
    选项指定其它输出目录。这样一个最简单的使用流程就结束了。另外,有时候你下载的
    字幕包会附带一个字体文件夹,你也可以使用 -f 命令指定这个文件夹,这样程序就会
    优先从这个文件夹中检索字体。
    1. .\assfonts.exe -f "D:\test dir\test-fonts-dir" "D:\test dir\test.ass"
    复制代码

    注意!根据 ASS Specs 标准文件所述,ASS 字幕只能够嵌入 Truetype 字体,即 ttf
    文件,但是本程序忽略了这个规定,允许任意类型的字体嵌入。这些非 ttf 字体可能不
    会被某些播放器识别,造成字幕显示异常。

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

    这样就解决了。实在不能转换的话,也可以直接用 mkvtoolnix 等工具把字体嵌入视频
    文件中。

    GUI 程序使用说明

    与命令行程序一样,首次运行最好先建立字体库,在 Font directory 中选择你的字体目
    录,然后点击 Build database,字体库默认保存在该程序所在的目录下面,这样以后就
    不用再指定字体文件夹了。

    上面的四个目录除了点击 “...”选择以外,也可以直接把文件或者文件夹拖进去。

    Subset only 选项,表示只做子集化,不嵌入到字幕中
    Embed only 选项,表示不做子集化,直接把字体嵌入字幕中
    两个选项都选上,一般用于清理输入字幕中的字体,如果字幕里没找到字体,就什么也
    不做。


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

    目前软件只提供了 X64 的 Windows 版本,理论上可以跨平台,不过还没有测试,如
    果有需求欢迎提出。

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

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

    更新日志:

    v0.3.8
    - 修复 Windows 系统下的内存泄漏 bug

    v0.3.6 - v0.3.7
    - 支持对字体库的增量更新,软件会自动忽略没有改动的字体,提高更新字体库的速度
    - 修复字体解析bug
    - 修复字幕解析bug
    注意,更新到这个版本后必须重新建字体库,否则字体无法选取

    v0.3.5
    - 减小子集化后的字体大小

    v0.3.4
    - 将 "Style not found" 的告警等级由 "Error" 降为 "Warning",不再阻止程序运行
    - 修复字幕解析闪退 bug
    -  解决 xy-subfilter 在渲染全角数字和省略号时丢失字符的 bug

    v0.3.3
    - 修复闪退 Bug
    - GUI 添加帮助弹窗文本

    v0.3.2
    - 修复 GUI 中 subset only 与 embed only 选项的 bug
    - 允许命令行程序同时输入多个字幕
    - 提高程序安全性

    v0.3.1
    - 修复多个字幕输入后程序中断的 Bug
    - 重写 GUI 布局

    v0.3.0
    - 修改对 \r 样式覆写代码的解析方式
    - 添加彩色 GUI 日志窗口
    - 整合 asshdr 功能
    - 把二进制字体库改为 JSON 文本文件,方便直接查看与修改,注意升级到这个版本需要
      重新建立字体库

    v0.2.7
    - 优化 GUI 界面布局
    - 优化依赖结构,大幅缩小程序体积

    v0.2.6
    - 添加对老SSA字幕标准(V4 Style)的支持
    - 优化多任务处理性能

    v0.2.5
    - GUI 现在允许同时添加多个字幕进行处理了
    - 允许添加非UTF-8文件,当检测到输入文件的编码后会尝试自动将其转码为UTF-8后再
      进行处理

    v0.2.4
    - 修复无法完全清理 ASS 中原有字体的 bug
    - 修复检索字体文件时闪退的 bug

    v0.2.3
    - 添加对命令行程序的多语言支持

    v0.2.2 - v0.2.1
    - Windows 下添加对多语言文件名的支持,确保 GUI 程序在采用不同编码的操作系统下
      都可以正常使用。对于某些非中文或英文名称的字体现在也能够正常解析了(经过超级
      字体整合包 XZ 完整包测试,其中所有字体都可以正常解析)。
    - 发布 x64 Linux 版本 (仅支持UTF-8文件系统)

    v0.2.0
    - 更新 GUI 版本,程序独立于命令行版本,可以单独使用,不需要任何依赖
    - 重写了错误处理机制
    - 修复了一处 ass 解析错误的 bug

    v0.1.4
    - 添加解析字体文件时的多线程支持
      显著提高建立字体库的速度

    v0.1.3
    - 添加对 ASS 样式覆写代码 (\r) 的支持
    - 添加对默认样式的支持
    - 优化错误处理机制

    v0.1.2
    - 添加"粗体"与"斜体"的支持,除了记录字体库中每一个字体的家族名与全名外,还记
      录了它的字重与倾斜度。(由于增加了字体信息,注意更新到这个版本后必须重新建
      立字体库,否则字体无法选取)因此,在选取字体时不只比较字体的名称,还会计算
      各字体与目标字体的"距离",选取最近的那一个。该方法参考 libass 与 fontconfig
      的开源实现,Windows系统也应该采取的是类似的实现方式,因此基本能够确保字体
      选取的结果与ass渲染器一致
    - 若选取的字体中有需要的码位缺失,程序会发出告警并打印出缺失的码位
    - 修复了一些 ass 解析错误的 bug

    v0.1.1
    - 修改原选项"-n,--no-subset"为"-e,--embed-only",只修改名称,功能不变
    - 修改输出文件的后缀格式,由"xxx_assfonts.ass"更改为"xxx.assfonts.ass"
    - 添加”清除字体“功能,若检测到输入字幕已含有字体文件,程序首先创建一个不含
      字体的版本"xxx.cleaned.ass",并在这个文件基础上嵌入新的字体
    - 允许"-s,--subset-only" "-e,--embed-only"两个选项共同使用,一般用于只清除字体
      的情况
    - 更新“使用说明”


        Windows 7 及以上

        Ubuntu 22.04 及以上

        Debian 11 及以上
















































    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 7活跃度 +60100 收起 理由
    江兰才尽 + 800 赞一个!
    铁皮厚厚 + 25600 赞一个!
    木易 + 800 很给力!
    snoopyzx963 + 6400 很给力!
    qq403306803 + 800
    Sir + 100 赞一个!
    tonyhsie + 25600 赞一个!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-12-4 12:48
  • 签到天数: 42 天

    [LV.5]常住居民I

    45

    主题

    2465

    回帖

    2020

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    376472

    崭露头角活跃达人CD!BD!

    孤雨独火 发表于 2022-11-26 00:55:14 | 显示全部楼层
    在论坛里看过几个人给出的子集化工具了,要打差异化的话上GUI吧(
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-25 20:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    44

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    62178
    wyzdwdz  楼主| 发表于 2022-11-26 01:17:17 | 显示全部楼层
    嗯,在写了。。。


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

    看大家的需求吧,哪个方便用哪个,更多的人来分享才好嘛
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    19

    主题

    204

    回帖

    816

    VC币

    星辰大海

    Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

    积分
    341632
    Lambholl 发表于 2022-11-26 01:23:18 | 显示全部楼层
    本帖最后由 Lambholl 于 2022-11-26 01:32 编辑
    孤雨独火 发表于 2022-11-26 00:55
    在论坛里看过几个人给出的子集化工具了,要打差异化的话上GUI吧(

    确实是这样 可能大家看了这个帖子 还是会选择继续用 AssFontSubSet
    AssFontSubSet 更新了这么久,也针对子集化过程中各种各样的问题进行了修复(比如有一个居中思源省略号的选项),这时候推出了一个新的工具,也没有 gui,也没法保证不会出现那些别的工具出现过、后来被修复的问题,这可能就会是很难吸引人去用的原因

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


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

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-25 20:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    44

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    62178
    wyzdwdz  楼主| 发表于 2022-11-26 01:47:41 | 显示全部楼层
    github链接我放了不过好像只能文本显示,萌新等级太低,没办法发超链接
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-2-8 12:19
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    0

    主题

    15

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3212
    pikaqiu2020 发表于 2022-11-26 10:18:46 | 显示全部楼层
    厉害的 测试了 转出来的外挂ass可以在infuse appletv版emby fileball 正常显示 应该是基于MPV的都OK
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-2-8 12:19
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    0

    主题

    15

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3212
    pikaqiu2020 发表于 2022-11-26 16:31:50 | 显示全部楼层
    问2个问题 能否直接替换掉原本的ass字幕 而不是加_XXXX 或者加成.XXX.ass也成
    字体集成进去后 有办法清除掉吗
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-25 20:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    44

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    62178
    wyzdwdz  楼主| 发表于 2022-11-26 18:34:06 来自手机 | 显示全部楼层
    pikaqiu2020 发表于 2022-11-26 16:31
    问2个问题 能否直接替换掉原本的ass字幕 而不是加_XXXX 或者加成.XXX.ass也成
    字体集成进去后 有办法清除掉 ...

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

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-25 20:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    44

    回帖

    0

    VC币

    白金会员

    Rank: 12Rank: 12Rank: 12

    积分
    62178
    wyzdwdz  楼主| 发表于 2022-11-26 18:44:00 来自手机 | 显示全部楼层
    还有就是目前这个程序还没有实现粗体、斜体的功能,只是简单的根据字体名去找字体。这个后面也会优化,但问题是各家渲染器在如何处理粗体、斜体并不统一。有没有懂的大佬能简单介绍一下,要不我还得去啃libass的源码,以它的实现为标准吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-2-8 12:19
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    0

    主题

    15

    回帖

    0

    VC币

    中级会员

    Rank: 3Rank: 3

    积分
    3212
    pikaqiu2020 发表于 2022-11-27 11:24:01 | 显示全部楼层
    能否子集化嵌入ASS 但不生成字体文件 目前似乎没这功能 只能不子集化不生成字体文件夹嵌入ass

    不子集化字体嵌入ASS之后 无法清除字体达到还原字幕的目的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表