作为一位拥有 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
版权声明:所有文章除特别声明外均系本人自主创作,转载及引用请联系作者,并注明出处(作者、原文链接等)。
最近也在找子集化的教程,主要是因为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有影响吗
似乎是字幕里有无意义分割符的时候会出现这种报错,应该是没啥影响
好的谢谢
下番剧看到有个子集化目录,来搜一下结果又到你网站来了
哈哈,玩到这个了就顺手水了一篇 ΦωΦ
使用Mkv batch直接把字体压进去就可以了。
视频要保种,不能动 (˃ ⌑ ˂ഃ )
那确实难搞
我去,我试了下你的方法确实舒服,最主要的不用安装字体。我以前会使用ListAssFonts保存所有字体,然后用Mkv muxing batch 直接压字体。安装字体非常烦人,而且Ai 和PS打开扫字体会变卡。还是这个办法舒服。
是吧,还是直接内嵌进字幕里方便吧 ∠( ᐛ 」∠)_
虽然字体还是要收集,但是不用安装了 ΦωΦ
这个用fontloadersub就能解决, 即安即卸 *windows
再提供个思路,既然emby可以使用nginx来实现网盘的直链播放,那么也可以用nginx拦截字幕的请求,实时对字幕进行子集化与嵌入,然后替换原始内容返回给emby,Jellyfin应该思路是通用的。
简单实现了下发现是可行的 https://github.com/RiderLty/embyEnhance 这样做的优点是下载后直接把字体扔到服务器上,字幕不用手动处理,简直懒人福音。
链接打不开欸(
(╯°A°)╯︵○○○ 忘记设置成公开了,已经改了
项目没有了:(
https://github.com/RiderLty/fontInAss |´・ω・) ノ 改了个名字
大佬快写一篇详细点的教程教教大伙儿怎么用
其实我也不太会用,没有看懂 (/ω\)https://www.bilibili.com/video/BV1e1p2eMEVP (◍•ᴗ•◍)❤ 简单改进了下,极大简化了部署流程,不用折腾nginx了
你这真是太能折腾了。
我现在只要能默认回落到思源黑体我就完全不管了,甚至找软件把特效字体换回纯文本的srt。
趁还能折腾,多找点新花样玩玩 (⌐■_■)
索尼电视会回落到思源黑体日文字符集,看着很别扭,大佬知道怎么解决吗
Girls Band Cry 首张专辑OP/ED分享!,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/0d46316dcd6a
提取码:hKZB
哇啊啊啊你做得好啊! (◍•ᴗ•◍)❤
不过看了下曲库发现收过了如果不做子集化直接把字体嵌入字幕,每次切字幕就会卡一会,但如果什么都不选,做完之后把subsetted那些文件夹删了却不会卡,这是什么原因
直接把字幕用到的字体不子集化嵌入,那字幕肯定大得一批,就会卡 所以得什么都不选,子集化嵌入才行。
生成的 subsetted 文件夹是子集化后的字体,是可以删除的。逻辑其实就是先字体子集化,再挨个嵌入到字幕中去。
这个是我没写清楚,有空修改下。
这确实是个好办法,但我现在发现我搜集的一堆从动漫中种子中存留下载的字体形式就是楼主所提到的子集化,也就是残缺的字体只能对那个字幕组的的那系列动漫有效,甚至已经覆盖其他同名完整的字体...玉玉了
尝试将字体子集化后,连同字幕嵌入kvm,搞了一堆软件脚本但是一直失败。完全没有想到还可以字体嵌到字幕文件里,完美解决了我的需求,给您一个大大大的赞!!!