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安装cargo install flash-font-ass --locked

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

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

目前只支持Windows。

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

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

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

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

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

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

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

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

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

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

local msg = require 'mp.msg'

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

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

    -- 2. Skip if this subtitle has already been processed
    if processed_subs then
      return
    end

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

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

    -- 4. Handle result
    if result.status == 0 then
      msg.info("flash-font-ass executed successfully for: " .. sub_path)
      processed_subs = true          -- Mark as processed
    else
      msg.error("flash-font-ass failed with exit code: " .. tostring(result.status))
      if result.stderr and result.stderr ~= "" then
            msg.error("Error output: " .. result.stderr)
      end
    end
end

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

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

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

-- Optional: Clear processed list when a new file is loaded (prevents memory growth over long sessions)
mp.register_event("file-loaded", function()
    processed_subs = {}
end)

shadows 发表于 2026-3-25 13:11:26

本帖最后由 shadows 于 2026-3-25 13:14 编辑

只支持外挂吗…
页: [1]
查看完整版本: 【新工具】动画字幕字体实现全自动加载!