
LunaTranslator 在 HOOK 模式下临时使用 OCR「进行一次 OCR」与「再次进行 OCR」完整实战指南【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator本文基于 LunaTranslator 仓库 docs/cht/gooduse/useocrinhook.md 展开结合 translatorUI.py、rangeselect.py、hotkey.py 与 config.json 等源码讲透如何在 HOOK 文本模式下临时补一次 OCR以及它背后的工作流程、按钮/快捷键配置与常见误区。HOOK 模式能自动、低延迟地从游戏进程内提取文本但并非万无一失——游戏菜单、选项选择肢、对话框 UI 等文本经常不走文本钩子而无法被捕获。LunaTranslator 为此内置了「进行一次 OCR」与「再次进行 OCR」两个动作让你不用切换文本源模式即可在 HOOK 模式下对屏幕局部临时识别一次文字识别结果照常进入翻译与词典流程。读完本文你将掌握这两个按钮的使用时机、选区操作、快捷键绑定方式以及它们与 OCR 模式选取识别范围按钮的关键区别从而彻底解决 HOOK 模式缺漏菜单/选项的痛点。一、为什么要在 HOOK 模式下临时 OCR视觉小说Visual Novel的文本来源主要分为两类HOOK文本钩子模式通过注入游戏进程、挂钩文本输出函数来直接截取内存中的文本速度快、无 OCR 误差是默认推荐的主模式OCR屏幕识别模式对屏幕指定区域截图并识别适合无法被钩子捕获、或以图形方式渲染的文字。问题在于HOOK 模式并不会捕获游戏中的全部文字。典型的漏网之鱼包括游戏主菜单、系统菜单、设置界面对话中的选项分支选择肢列表以位图/贴图形式渲染的按钮文字、徽标、标题某些引擎中不走文本输出 API 的 UI 文案。按常规思路遇到这类文本时你要先切换到 OCR 模式 → 选取识别范围 → 等待持续识别 → 再切回 HOOK 模式来回折腾非常麻烦。LunaTranslator 的解决方案是在 HOOK 模式下直接使用「进行一次 OCR」按钮或对应快捷键临时借一次 OCR 能力用完自动回到 HOOK 的自动提取流程实现无缝衔接。二、「进行一次 OCR」HOOK 模式下的内置补漏方案2.1 功能定位「进行一次 OCR」按钮默认图标为fa-crop即裁剪/框选图标是一个不依赖当前文本源模式的全局动作点击后弹出范围选取窗口与 OCR 模式下的框选交互相同用户框选屏幕上的一个矩形区域软件对框选区域仅执行一次OCR 识别将识别到的文本送入正常的取词/翻译管线立即退出 OCR 流程无缝继续使用 HOOK 模式自动提取文本。从源码看主界面 translatorUI.py 中的ocr_once_function是核心入口def ocr_once_function(self): def ocroncefunction(rect, imgNone): self.ocr_once_follow_rect rect self.ocr_do_function(rect, img) rangeselct_function(ocroncefunction, hideshowTrue)而实际执行 OCR 与后续翻译的是 ocr_do_functionthreader def ocr_do_function(self, rect, imgNone): if not img: img imageCut(0, rect) result ocr_run(img) result result.maybeerror() if result: gobject.base.textgetmethod(result, is_auto_runFalse)这段代码清晰揭示了完整的调用链rangeselct_function定义于 rangeselect.py弹出选区窗口选区结束后回调携带rect屏幕坐标矩形与pix截取到的图像ocr_run(img)调用当前配置的 OCR 引擎进行识别gobject.base.textgetmethod(result, is_auto_runFalse)将识别文本交给文本处理与翻译管线——注意is_auto_runFalse表示这是一次显式触发的处理而不是 OCR 模式的自动轮询。也就是说进行一次 OCR在机制上等价于手工触发一次 OCR 识别并把结果当作新文本处理一次与是否处于 HOOK 模式无关因此天然适用于HOOK 模式缺漏菜单/选择肢的场景。2.2 与 OCR 模式「选取识别范围」按钮的区别重要误区这是最容易踩坑的一点文档特别以加粗强调由于这个按钮的图标很多原本就想要使用 OCR 的人误以为这就是 OCR 的按钮结果仍在 HOOK 模式下就使用这个按钮选取完范围后却不会进行自动翻译。实际上当切换到 OCR 模式后OCR 模式的按钮才会显示出来。对照 config.json 中的按钮定义可以看清两者的本质差异按钮配置键默认图标默认显示归属模式行为选取 OCR 范围selectocrrangefa.cropuse: truebelong: [ocr]仅在 OCR 文本源启用时显示框选后持续对范围截图识别自动翻译进行一次 OCRocr_oncefa.cropuse: true无 belong全局可用任意模式下可用框选后仅识别一次然后退出再次进行 OCRocr_once_followfa.spinneruse: false无 belong全局可用沿用上一次选区再次执行一次 OCR关键差异点图标相同selectocrrange与ocr_once默认都用fa.crop仅靠图标难以区分归属模式不同selectocrrange声明了belong: [ocr]。从 buttondisplaychecker 的逻辑看按钮会检查belong列表中是否有当前已启用的文本源只有当 OCR 源启用时OCR 模式的按钮才会显示出来而「进行一次 OCR」没有 belong 限制任何模式下都常驻可用行为不同OCR 模式的框选进入持续识别循环自动翻译、自动更新结果而「进行一次 OCR」只处理一帧截图。因此文档中的警告非常实际如果你本意是想进入 OCR 模式做持续识别却只在 HOOK 模式下点了fa.crop图标会发现框选完没有自动翻译误以为软件故障——其实你触发的是临时 OCR 一次文本已经送入处理流程只是不会持续刷新。正确的做法是需要持续 OCR 时先切换文本源到 OCR 模式此时才会出现「选取 OCR 范围」按钮。2.3 使用流程实战步骤在 HOOK 模式下补识别菜单/选择肢的完整操作保持文本源为HOOK 模式无需切换点击工具栏上的「进行一次 OCR」按钮fa.crop图标或按下绑定的快捷键屏幕弹出选区遮罩用鼠标框选目标文字区域如选项列表、菜单项松开鼠标后软件对该区域执行一次识别结果进入翻译并显示选区窗口自动关闭HOOK 模式继续正常工作。提示rangeselct_function在hideshowTrue时会把翻译窗口与已有 OCR 范围框临时移出屏幕rangeselect.py框选完成后自动恢复保证选区过程中不被翻译界面遮挡、也不干扰已有范围。三、「再次进行 OCR」固定位置选区的重复利用对于位置固定不变的菜单项或选择肢每次都要重新框选显然低效。LunaTranslator 提供了「再次进行 OCR」按钮配置键ocr_once_follow默认图标fa.spinner或对应快捷键直接沿用上一次「进行一次 OCR」框选的区域再执行一次识别。源码层面的实现非常直观每次「进行一次 OCR」时选区矩形被记录在self.ocr_once_follow_rect见 translatorUI.py「再次进行 OCR」则直接以该矩形为参数调用ocr_do_functiontranslatorUI.py(ocr_once, self.ocr_once_signal.emit), ( ocr_once_follow, lambda: self.ocr_do_function(self.ocr_once_follow_rect), ),即ocr_once_follow不需要再次框选直接把最近一次记录的范围丢给 OCR 引擎执行一次识别。这非常适合游戏中固定坐标的选项分支——第一次框选后之后每次出现选择肢只需点一下「再次进行 OCR」或快捷键即可在 HOOK 模式下快速识别当前选项内容。使用建议第一次出现菜单/选择肢时用「进行一次 OCR」框选并建立ocr_once_follow_rect后续同样位置的内容一律用「再次进行 OCR」完成快速识别若游戏界面布局变化如窗口缩放、UI 移动重新用「进行一次 OCR」框选一次即可更新记忆的矩形。四、按钮显示与快捷键绑定配置4.1 默认配置在 defaultconfig/config.json 中两个按钮默认处于工具栏序列中ocr_once, ocr_once_follow,其具体按钮定义config.jsonocr_once: { use: true, tip: 进行一次OCR, icon: fa.crop, align: 2 }, ocr_once_follow: { use: false, tip: 再次进行OCR, icon: fa.spinner, align: 2 }注意「进行一次 OCR」默认显示use: true即文档所说现在已默认激活显示该按钮而**「再次进行 OCR」默认不显示use: false**需要时请在设置中手动开启或直接使用快捷键。4.2 快捷键绑定快捷键系统位于 gui/setting/hotkey.py两个动作的绑定如下hotkey.py_26: gobject.base.translation_ui.ocr_once_signal.emit, _26_1: lambda: gobject.base.translation_ui.ocr_do_function( gobject.base.translation_ui.ocr_once_follow_rect ),_26→ 「进行一次 OCR」发出ocr_once_signal触发选区流程_26_1→ 「再次进行 OCR」沿用ocr_once_follow_rect直接识别。在设置 → 快捷键界面中找到对应条目按需绑定你习惯的按键组合如某个不与其他功能冲突的全局热键。绑定后即可在游戏全屏/无边框窗口下随时触发无需鼠标点击工具栏。顺带一提文本搜索窗口showword.py也有独立的ocr_once_signal支持在查词界面直接对屏幕区域做一次 OCR 取词实现屏幕取词查词典的效果与主界面的机制一致。4.3 相关可调参数rangeselct_function在弹出选区时还会读取以下全局配置rangeselect.pyocrselectalpha选区遮罩的透明度默认0.3ocrrangecolor选区边框颜色默认#000000黑色ocrrangewidth选区边框粗细默认1像素。这些参数同时影响 OCR 模式与进行一次 OCR的框选外观可在设置中按需调整让选区遮罩在深色/浅色游戏画面上都清晰可辨。五、工作流程小结与适用边界5.1 完整调用链「进行一次 OCR」/「再次进行 OCR」的完整链路可归纳为点击按钮 / 按快捷键 │ ▼ ocr_once_signalpyqtSignal │ ├─ 进行一次 OCRrangeselct_function(callback, hideshowTrue) │ └─ 弹出选区窗口 → 用户框选 → 截取图像 记录矩形到 ocr_once_follow_rect │ └─ 再次进行 OCR直接用 ocr_once_follow_rect 作为参数 │ ▼ ocr_do_function(rect, img) ├─ imageCut(0, rect) 截取屏幕图像未传图时 ├─ ocr_run(img) 调用当前 OCR 引擎识别 └─ textgetmethod(result, is_auto_runFalse) 送入翻译/词典管线关键文件速查文件作用translatorUI.py主界面按钮逻辑、OCR 执行函数rangeselect.py范围选区窗口、截图与回调hotkey.py快捷键_26/_26_1绑定config.json按钮默认配置图标、提示、是否显示showword.py查词窗口的 OCR 一次取词支持5.2 适用场景与边界推荐使用场景HOOK 模式漏捕的游戏主菜单、系统菜单、设置项对话选项选择肢分支尤其是固定位置的选项游戏中以贴图形式渲染、无法被钩子捕获的按钮/标题文字需要临时查某个屏幕文字又不愿切换模式的任何时刻。注意事项与边界「进行一次 OCR」是一次性识别不会自动跟随画面变化需要持续识别请切换到 OCR 模式使用「选取 OCR 范围」识别效果取决于你配置的 OCR 引擎能力与游戏画面质量如字体、分辨率、抗锯齿临时识别并不比 OCR 模式更强大它解决的是切换模式的麻烦而非识别精度问题「再次进行 OCR」依赖上次框选的矩形若游戏窗口大小、界面布局发生变化需重新用「进行一次 OCR」框选刷新记录由于「进行一次 OCR」与「选取 OCR 范围」默认共用fa.crop图标请牢记出现 OCR 专属按钮的前提是当前文本源为 OCR 模式在 HOOK 模式下看到同样的裁剪图标它是临时 OCR 一次而非进入持续 OCR。掌握这两个按钮后HOOK 模式下遇到菜单与选择肢再也不用反复切换模式一次框选、后续一键复用让文本提取流程保持连续、顺畅。【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考