找回密码
 立即注册
查看: 276|回复: 1

【新工具】动画字幕字体实现全自动加载!

1

主题

0

回帖

0

VC币

中级会员

Rank: 3Rank: 3

积分
8994
Ann 发表于 2026-3-25 11:16:08 | 显示全部楼层 |阅读模式
本帖最后由 Ann 于 2026-3-25 16:51 编辑

开源仓库https://github.com/naganohara-yoshino/flash-font  感谢星星(bgm24)

看下载的动画,字幕组的字幕往往需要额外字体。一般可以通过字体包和加载器共同加载字体,但是手动加载未免繁琐,而且加载器加载的比较慢。于是做了一个新的字体库字体加载的CLI工具,配合lua mpv插件,可以将上述过程全部自动化,只要有正确的字幕就能点开即看。

CLI工具特性
◾递归扫描字体库,为 60GB / 18,000+ 的字体整合包建立数据库仅需10秒左右,有数据库的情况下查询与匹配是秒级的;
◾自动检测字体库变化(新增 / 删除),不需要手动更新数据库;
◾精确匹配 ASS 字幕,提取所有实际使用字体(包括样式变体),即时字体注入。

使用方法
0. 准备字体文件夹
推荐下载字幕论坛的字体包,省去了每次看动画都要额外下载字幕字体的麻烦;若不下载字体包,也可以自己手动把字体拖进一个特定的文件夹里面,当作加载的来源。字体包种子下载链接

1. 安装CLI 工具
如果有rust工具链,推荐使用cargo安装
  1. cargo install flash-font-ass --locked
复制代码


没有rust工具链可以去GitHub下载预编译版本,地址在此。一般的用户请下载 msvc-x86_64 版本,少部分的win arm用户下载arm64的。解压后exe放置在任何文件夹都可以。

对于下载预编译版本的,如果知道什么是path环境变量,非常推荐添加,能省去很多麻烦。

目前只支持Windows。

2. 初始化CLI工具
按 Win+R 呼出运行窗口,输入
  1. powershell
复制代码
按运行,即能弹出终端。

如果用cargo安装的或者手动添加了path环境变量的,直接输入
  1. flash-font-ass init
复制代码


如果是手动下载的,到你放置exe的文件夹,选中flash-font-ass.exe, 按Ctrl+Shift+C复制路径,回到终端,输入&空格,然后点击鼠标右键即可粘贴刚才的路径,最后输入空格init,整体应该形如
  1. & 路径 init
复制代码


输完命令,回车。弹出一个问题,要你填入第0步的字体文件夹的路径。同样的,来到字体文件夹所在的文件夹,选中字体文件夹,按Ctrl+Shift+C,然后来到终端,右键点击就把路径贴在了终端里。再回车就完成了初始化。

3. 配置MPV插件
有了cli工具,就可以利用mpv的lua脚本自动的调用它,为我们自动加载字幕。

首先,到mpv.exe所在的文件夹。如果用的是mpv lazy等整合包,应该可以看到一个名为
  1. portable_config
复制代码
的文件夹,里面会有一个
  1. scripts
复制代码
文件夹,进入到这个文件夹。(如果没有,就手动创建并进入。)

如果用cargo安装的或者手动添加了path环境变量的,直接进入GitHub Gist Raw界面,按Ctrl+S下载,会得到文件
  1. load_ass_fonts.lua
复制代码
把它拖进刚才的scripts文件夹就全部完成了。

如果是手动下载的,进入GitHub Gist,然后在刚才的script文件夹,用记事本新建一个txt文件,复制全部1-78行内容,并粘贴进去。注意第网页中显示的30行,内容为
  1. args = { "flash-font-ass", "load", "--subtitle", sub_path },
复制代码
把txt文件这里的"flash-font-ass"改成你自己的路径,比如
  1. args = { "D:/文件夹/flash-font-ass.exe", "load", "--subtitle", sub_path },
复制代码
保存后重命名为
  1. load_ass_fonts.lua
复制代码
即可(注意,后缀也要改,.txt后缀变成了.lua)。

完成以上配置后,对于媒体文件有对应外挂ass字幕的(MPV能直接相应加载的),现在就不需要再手动加载字幕字体了。

如果熟悉MPV的也可以自己修改lua脚本。以下附load_ass_fonts.lua的全部内容:
  1. -- mpv Auto ASS Font Loader
  2. -- Requires: flash-font-ass (must be in PATH)
  3. -- Place this script in: mpv_folder/portable_config/scripts/ (or ~/.config/mpv/scripts/ , ..)

  4. local msg = require 'mp.msg'

  5. -- Table to track already processed subtitle files (prevents duplicate loading)
  6. local processed_subs = {}

  7. -- ===================================================================
  8. -- Core function: Load fonts for a given external ASS subtitle file
  9. -- ===================================================================
  10. local function load_fonts_for_subtitle(sub_path)
  11.     -- 1. Basic validation
  12.     if not sub_path or not sub_path:lower():match("%.ass$") then
  13.         return
  14.     end

  15.     -- 2. Skip if this subtitle has already been processed
  16.     if processed_subs[sub_path] then
  17.         return
  18.     end

  19.     msg.info("Detected external ASS subtitle, loading fonts: " .. sub_path)

  20.     -- 3. Call flash-font-ass synchronously (blocks until finished)
  21.     --    This ensures fonts are available before playback starts
  22.     local result = mp.command_native({
  23.         name = "subprocess",
  24.         args = { "flash-font-ass", "load", "--subtitle", sub_path },
  25.         playback_only = false,
  26.         capture_stdout = true,
  27.         capture_stderr = true,
  28.     })

  29.     -- 4. Handle result
  30.     if result.status == 0 then
  31.         msg.info("flash-font-ass executed successfully for: " .. sub_path)
  32.         processed_subs[sub_path] = true          -- Mark as processed
  33.     else
  34.         msg.error("flash-font-ass failed with exit code: " .. tostring(result.status))
  35.         if result.stderr and result.stderr ~= "" then
  36.             msg.error("Error output: " .. result.stderr)
  37.         end
  38.     end
  39. end

  40. -- ===================================================================
  41. -- Scenario A: Automatic font loading when a file is opened
  42. -- ===================================================================
  43. -- on_preloaded hook runs after mpv has parsed the file list but before playback starts.
  44. -- This allows us to load fonts early and avoid font missing issues at the beginning.
  45. mp.add_hook("on_preloaded", 50, function()
  46.     local tracks = mp.get_property_native("track-list")
  47.     if not tracks then return end

  48.     for _, track in ipairs(tracks) do
  49.         -- Only process external subtitle tracks (internal embedded subs don't have external-filename)
  50.         if track.type == "sub" and track["external-filename"] then
  51.             load_fonts_for_subtitle(track["external-filename"])
  52.         end
  53.     end
  54. end)

  55. -- ===================================================================
  56. -- Scenario B: Font loading when user adds/switches subtitle during playback
  57. -- ===================================================================
  58. -- Observes the external filename of the currently active subtitle track
  59. mp.observe_property("current-tracks/sub/external-filename", "string", function(name, sub_path)
  60.     if sub_path then
  61.         load_fonts_for_subtitle(sub_path)
  62.     end
  63. end)

  64. -- Optional: Clear processed list when a new file is loaded (prevents memory growth over long sessions)
  65. mp.register_event("file-loaded", function()
  66.     processed_subs = {}
  67. end)
复制代码

flash-font-ass-Windows-msvc-x86_64.zip

1.54 MB, 下载次数: 26

cli 工具

load_ass_fonts.zip

1.34 KB, 下载次数: 24

mpv 插件

回复

使用道具 举报

3

主题

406

回帖

42

VC币

至尊会员

Rank: 16Rank: 16Rank: 16Rank: 16

积分
205625

活跃达人

shadows 发表于 2026-3-25 13:11:26 | 显示全部楼层
本帖最后由 shadows 于 2026-3-25 13:14 编辑

只支持外挂吗…
回复

使用道具 举报

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

本版积分规则

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