【新工具】动画字幕字体实现全自动加载!
本帖最后由 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:14 编辑
只支持外挂吗…
页:
[1]