作为一位拥有 PlexPass Lifetime 的高贵的 NAS 用户,最佳的动画观赏姿势,自然是找一把老式躺椅,倒上满满一杯滋滋冒泡的 82 年的冰镇可乐,再打开 Apple TV、启动 Infuse,找个舒服的姿势(最好是能翘着二郎腿),按下遥控器上的播放按钮,伴着风扇吹出的阵阵微风,开始品味最新一集的《GIRLS BAND CRY》。
好吧,没有 Apple TV 不要紧,是不是用的 Infuse 也无所谓,但可乐千万别喝过期的。这里想举例的是,假如你准备好了一部没有内嵌字幕的影片,并从网上找到了大佬精心制作的带有特效的字幕(ass
或 ssa
格式,这些字幕一般会使用大量的字体丰富显示效果)文件。可准备观看的时候却发现,观影设备的系统中,并没有安装字幕所需的字体,播放器因而调用默认字体渲染字幕。观影体验下降了一个档次不说,华丽的字幕特效也变成了累赘。
如果你用的是 PC 还好,把字幕所需的字体安装一下便可。可假设你想在蹲坑的时候用手机无缝观看呢?又或者是转向客厅的大屏幕电视呢?手机倒是可以想点办法把字体包都丢到播放器里,但电视呢?电视可是没办法安装字体的。(唔……可以的话就当我孤陋寡闻)
因此,为了解决这一问题,常见的做法是连同视频、音频、字幕和字体一并封装进一个 mkv 容器里,就能实现在任意设备上都能得到相同的字幕显示效果,也就是大多数内嵌字幕的新番所用的方法。可问题又来了,我们不可能大费周章把手头的 BDRip 资源加上字幕和字体重新打包,按我目前收集的 400 多部动画的量……我宁可不看特效字幕。
在最开始接触 NAS 的时候,我单纯地认为把字体塞到 Jellyfin 之类支持外部字体的程序中就完事了1,但最终事与愿违。可不内嵌字体,又如何才能以最简化工作流程,实现同等内嵌字体的播放效果呢?最近,我终于发现了另一种方法,可以轻微缓解这一痛点:字体子集化。
何谓字体子集化
什么是字体子集化?简单地说,字体子集化就是从一个字体文件中提取出特定字符集合的过程。这在网页上十分常见,例如本站首页使用的「初之音」 ,就是使用了子集化的字体文件。相比完整的 6044 KB 大小的「方正粗金陵」字体文件,这个只包含「初之音」这 3 个字符的子集化字体最终大小只有 3 KB,显著减少了字体下载时间从而提高页面加载速度。
将「子集化」运用在字幕上,则是先将字幕文本分析拆解,生成新的只包含字幕所需字形的字体文件,再将这些子集化后的字体嵌入到 ass
字幕文件中。
例如,下面这个由 Nekomoe kissaten 制作的《铃芽之旅》字幕,所需的字体约为 70MB。
字幕本体为 367 KB。
将所需字体子集化处理后嵌入字幕中,仅为 1826 KB。
前期准备工作
1. 安装 AssFonts
前往 https://github.com/wyzdwdz/assfonts/releases 下载最新版本的 GUI 程序,或者使用我的 备份 下载。
解压后包含如下文件,一般使用 assfonts-gui.exe
即可。
如果有使用命令行的需求,可以将 assfonts.exe
添加至系统环境变量。
点击右下角环境变量。
双击「系统变量」中的 Path。
点击新建,将 AssFonts 的完整路径填入其中,例如我的是 D:\AssFonts
,保存即可。
随后便可在 PowerShell 中使用 assfonts
命令。
2. 安装 otf2ttf
根据官方文档中的说明,ASS 字幕只能够嵌入 Truetype 字体,即 ttf 文件。但是 AssFonts 忽略了这个规定,允许任意类型的字体嵌入。这些非 ttf 字体可能不会被某些播放器识别,造成字幕显示异常。
因此,另行安装 otf2ttf 工具,将 otf 字体转换为可供嵌入的 ttf 字体。
使用 Python 安装(如未安装 Python,请自行搜索相关教程安装):
pip install otf2ttf
随后在 PowerShell 中,使用 otf2ttf otf字体文件路径
转换字体。
官方推荐是「先子集化生成 otf格式的子集化字体,再使用 otf2ttf 工具转换子集化字体,然后再嵌入字幕」。我觉得这个挺麻烦的,我是直接将整个 otf 字体转换为 ttf 后,另存他处,确保该经转换后的字体仅供 AssFonts 使用。官方并没有推荐直接转换整个字体,因此不建议像我这么做。
例如,我有个需要转换的字体路径为 D:\mikusa\FOT-UDKakugo_Large Pr6N DB.otf
,那么直接:
otf2ttf "D:\mikusa\FOT-UDKakugo_Large Pr6N DB.otf"
等电脑风扇响一会儿就可以在同路径下看到同名的 ttf 字体了。
3. 准备字体包
虽说大多数时候,你在 Anime字幕论坛 中找到的字幕,楼主通常都会贴心地附上字幕所需字体,但也有没有字体的时候。因此我的建议是:直接下载字体包。
你可以在 这里 下载字体包种子,打不开的话也可使用以下磁力链接下载:
magnet:?xt=urn:btih:bc72daa4f58fdda082c603ce6eee1d8199359434&dn=%E8%B6%85%E7%BA%A7%E5%AD%97%E4%BD%93%E6%95%B4%E5%90%88%E5%8C%85%20XZ&tr=udp%3A%2F%2F208.67.16.113%3A8000%2Fannonuce&tr=http%3A%2F%2F208.67.16.113%3A8000%2Fannonuce&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80%2Fannounce&tr=http%3A%2F%2Ft.acg.rip%3A6699%2Fannounce&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Ftr.bangumi.moe%3A6969%2Fannounce&tr=http%3A%2F%2Ftr.bangumi.moe%3A6969%2Fannounce&tr=https%3A%2F%2Ftr.bangumi.moe%3A9696%2Fannounce&tr=http%3A%2F%2Fopen.acgnxtracker.com%2Fannounce&tr=https%3A%2F%2Fopen.acgnxtracker.com%2Fannounce
下载的时候,只下载其中的 精简包,2G 左右。不用全部下载。等到有缺字体的时候,再下载缺少的字体。
制作子集化字幕
打开 assfonts-gui.exe
,虽然没有中文,但使用起来其实相当简单,总共就三步。
1. 创建字体数据库
将上面下载好的字体包整个拖入到程序的 Font directory 栏中,点击 Build Database 按钮,创建字体数据库。
字体数据库的默认保存位置是自动创建的。另外,程序会自动加载本地已安装的字体。
2. 导入字幕
接着,将需要子集化的字幕拖入 Input Ass Files 一栏中。直接点击 Start 开始制作子集化字幕,其他的选项都不用到。
你应该会注意到下方的日志闪过了一行蓝色,返回去查看具体原因。
如果是下面这些 Missing the font,则表示字体缺失。先去寻找这些缺失的字体,放入字体文件夹中,再执行一次创建字体数据库。
如果是下面这种 otf 不兼容的提示,就返回上面准备工作的步骤,把这个字体转换成ttf后,将原 otf 字体移动至别处或直接删除,再执行一次创建字体数据库。
然后,再创建子集化字幕。
这样,你就得到了子集化后的字幕文件,它们被重命名为 原字幕名.assfonts.ass
以区分,并生成了一堆子集化字体,存放在对应字幕名的文件夹中。
之后复制或移动这些子集化后的字幕文件即可,生成的包含子集化字体的文件夹没什么用,可以删除。
相比内嵌子集化字体前,仅仅是大了 2M 左右,完全能接受!
3. 其他功能
- Subset only 选项,表示只做子集化,不嵌入到字幕中
- Embed only 选项,表示不做子集化,直接把字体嵌入字幕中
- 上面两个选项都选上,一般用于清理输入字幕中的字体,如果字幕里没找到字体,就什么也不做。
- Subfonts rename,勾选中这个选项可以在给字体做子集化时给该字体自动更换一个随机的名字,同时修改原字幕中字体名称以匹配这个子集化后的字体。(该功能主要用于防止多个字幕同时集成进同一文件中时,相同名称字体互相冲突的问题)
- font combined ,勾选后,当输入字幕大于一个时,子集化后会合并相同名字的字体
子集化前后对比
对比子集化前后……虽然不是很明显,但可以看得出来字体上的差异了。
另外,由于不用调用字体渲染,播放也会相对于子集化前顺畅一点。
好像选了个效果不是很明显的片段……嘛,总之快来试试吧!
参考
另可参考:
本文作者:mikusa
本文链接:https://www.himiku.com/archives/my-solution-for-perfect-anime-subtitle-fonts.html
版权声明:所有文章除特别声明外均系本人自主创作,转载及引用请联系作者,并注明出处(作者、原文链接等)。
为什么子集化嵌入ass之后, infuse 上使用还是乱码呢
我在想,动漫这么多集,仅仅在第一集的时候把字幕字体和字幕一起封装到容器里,后续的字幕读取安装过的字体缓存,可行吗。话说,DBD制作组的字幕字体不少,有时间我问他们能不能按照你这个方案制作字幕,毕竟在字幕组那里操作起来方便点
子集化不是新玩意了,你能下载到的内封切换字幕还有特效的番剧,都有用到子集化
你好,我是这个软件的作者,请问我可以将你写的这个教程转载到acgrip上去吗?由于软件的GUI版本是后面才开发的,所有并没有详细的使用说明,正好这篇文章能够完美地补充。
当然可以,荣幸之至!
可以先用ListAssFonts检测缺失字体和字符,直接显示缺失字符内容和具体位置,格式报错什么的
assfonts-gui只显示Missing codepoints和Unicode编码,不好查错
您好,请问一下,otf2ttf只能一个一个转换么,有什么办法批量转换么
我是用 otf2ttf 命令,后面跟一堆字体文件的路径……
我帮你问了下GPT,你可以试试这么做已移除,未来的朋友请参考后面的脚本
我按照您的方法去试了下,PowerShell运行脚本提示以下这样,是有哪步没做对么
我是用gpt写了个python和bat,多选字体拖到bat上转换到指定位置
https://github.com/deadblue0910/personal/tree/main/otf-ttf
非常感谢,这个很好用
我用层主的文件再问了一下AI,修改了下py的代码,现在可以直接拖动文件夹自动识别文件夹及子文件夹下的otf文件,并转换到指定路径的文件夹内(如果指定路径不存在,会直接生成在原otf文件夹内),解决了一次拖如过多文件,批处理会直接闪退的问题。代码如下:
请问要怎么直接拖动文件夹呢,拖不过去
配合这个批处理程序(在之前层主的github有,所以就没发),拖到批处理里就行了,代码如下:
如果之前转换的有到其他文件夹,可以用move_matching_files.py查找匹配名字移动:
对了,我使用测试下来,对于子集化转换后的字幕,最好不要把原字幕和转换后的字幕放在同一目录下。当原字幕和assfonts同时存在,且切换到assfont字幕时,mpv播放器关闭会卡死,只能结束进程关闭(推测应该还是字体命名问题,即使使用的是rename后的字幕文件)。
如果是用mpv观看,可以在mpv.conf文件中,字幕那一栏,尝试修改两个参数,就会默认使用子集化的字幕了(原理其实就是关键词排序):
三个文件的命名:
匹配文件设置好对应路径后,运行就行
本着能偷懒就偷懒的原则,最后再补充一个,拖动文件夹后,可以把文件夹内assfonts生成的其余文件都移动到目标路径,文件夹中只保留需要的assfonts.ass文件。
与之前用相同的批处理,只需将文件内'python "%SCRIPT_DIR%convert_fonts.py" %'改成'python "%SCRIPT_DIR%move_ass_files.py" %。
'move_ass_files.py'代码,可以根据自己需求替换关键词:
参考步骤是:选字幕拖入GUI => 默认路径直接start => 有报错缺少字体就补充新的字体建立数据库接着start,覆盖 => 一部或多部动漫字幕生成完后,直接整个动漫文件夹拖入批处理,收工。
您好,您上面那个字体下载链接我无法下载,请问您可以用夸克或百度云分享下么,十分感谢您的教学
你好,请尝试使用磁力链接下载
就是用磁力链接下载不了呢 (⌐■_■)
使用qbittorrent下载试试?比如这个版本:
https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases
谢谢,用这个可以下载,感谢您 ヾ (≧∇≦*) ゝ
我按照您的方法进行了字体子集化,但是我手机自带的播放器还是无法显示出特效字体,请问一下有好用的安卓的播放器么
试试看mxplayer?
好的,非常感谢您的教学 (◍•ᴗ•◍)❤
要是能早点看到这个帖子该多好 又+1,望着库里辛辛苦苦把字体塞进mkv里结果emby播放还识别不到的视频留下了悔恨的泪水(虽然我不直接用emby看,用的yamby和vidhub
最近也在找子集化的教程,主要是因为emby在手机上播放会少字,比如欸这个字就加载不出来,而且emby没有加载字体的地方(ー_ー)!!,网上找了半天也就这么一篇教程,不过我还找到了个有意思的项目,https://bbs.acgrip.com/thread-11853-1-1.html
github地址
github.com/RiderLty/fontInAss
只可惜我不会用,看看大佬感不感兴趣,能否出个使用教程啥的,感觉有这个就不用手动整理字幕了_(:з」∠)_
缘分啊,居然看到自己发的贴了 ٩(ˊᗜˋ*)و
这个项目现在整合了nginx反代,部署极大简化了,可以看下教程 https://www.bilibili.com/video/BV1e1p2eMEVP
请问log里面出现这个Missing codepoints有影响吗
似乎是字幕里有无意义分割符的时候会出现这种报错,应该是没啥影响
好的谢谢