LunaTranslator 在 HOOK 模式下临时使用 OCR:一次OCR与再次OCR按钮/快捷键完全指南
【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator
LunaTranslator 是一款面向视觉小说(Visual Novel / Galgame)的实时翻译工具。在实际游玩中,HOOK(文本钩子)模式偶尔会漏掉游戏里的菜单、选择肢(选项)、系统提示等非对话类文本,而为此频繁地在 HOOK 模式与 OCR 模式之间切换十分繁琐。本文基于官方文档 在HOOK模式下临时使用OCR 展开,结合仓库源码,系统讲解「进行一次OCR」「再次进行OCR」两个内置按钮与快捷键的原理、用法与注意点,帮助你在不中断 HOOK 自动提取的前提下,随手完成一次性的屏幕 OCR 识别。
为什么要临时使用 OCR:HOOK 模式的典型缺漏
HOOK 模式通过注入游戏进程、挂钩文本输出函数来截取文字,优点是实时、稳定、不依赖截图。但并非游戏中所有文字都经过可挂钩的文本渲染路径:
- 菜单:游戏主菜单、设置菜单中的文字往往由 UI 系统直接绘制;
- 选择肢:剧情分支选项常使用独立的控件或图片文字;
- 系统提示:存档/读档确认框、教程气泡等一次性 UI 文本。
这类文字 HOOK 通常无法捕获。如果切到 OCR 模式,则会失去 HOOK 模式的持续自动翻译能力,且切换过程繁琐。LunaTranslator 为此内置了「只识别一次」的临时 OCR 方案:在 HOOK 模式下,选取一次屏幕范围,对该范围执行一次 OCR,识别结果送入既有的文本处理与翻译管线,随后无缝回到 HOOK 自动提取状态。
按钮与快捷键:两个内置动作
进行一次OCR(ocr_once)
默认在按钮栏激活(use: true),图标为fa.crop(裁剪/选区图标),快捷键默认绑定为_26(详见下文)。点击后进入选区状态,拖拽框选屏幕上的文字区域,松手即对该区域执行一次OCR,然后自动退出 OCR 选区,继续由 HOOK 模式接管文本。
官方文档特别强调了一个容易踩坑的点:
由于这个按钮的图标,很多原本就想要使用OCR的人,误以为这就是OCR的按钮,结果仍在HOOK模式下就使用这个按钮,选取完范围后却不会进行自动翻译。实际上当切换到OCR模式后,OCR模式的按钮才会显示出来。
也就是说,进行一次OCR与 OCR 模式下「选取OCR范围」按钮(selectocrrange)的图标完全相同(均为fa.crop),容易混淆。二者本质不同:
| 动作 | 所属模式 | 行为 |
|---|---|---|
选取OCR范围(selectocrrange) | 仅在 OCR 模式下显示(belong: ["ocr"]) | 框选范围后持续对该区域进行循环 OCR 识别并自动翻译 |
进行一次OCR(ocr_once) | 所有模式可用(默认激活) | 框选范围后只执行一次 OCR,然后退回原模式 |
在 defaultconfig/config.json 中可以看到两者的定义:
"selectocrrange": { "use": true, "tip": "选取OCR范围", "belong": ["ocr"], "icon": "fa.crop", "align": 2 }, "ocr_once": { "use": true, "tip": "进行一次OCR", "icon": "fa.crop", "align": 2 }, "ocr_once_follow": { "use": false, "tip": "再次进行OCR", "icon": "fa.spinner", "align": 2 }注意selectocrrange带有"belong": ["ocr"]约束,只有切换到 OCR 模式才会显示;而ocr_once没有该约束,因此在 HOOK 模式下同样可用,这正是它存在的意义。
再次进行OCR(ocr_once_follow)
若选择肢等文本出现在固定位置,不想每次都重新框选,可以使用再次进行OCR(图标fa.spinner,默认use: false,需在设置中手动开启,或通过快捷键_26_1触发)。它会沿用上一次「进行一次OCR」框选的范围直接执行一次 OCR,无需再次选区。
两个按钮的默认快捷键对应关系定义在 gui/setting/hotkey.py:
"_26": gobject.base.translation_ui.ocr_once_signal.emit, ... "_26_1": lambda: gobject.base.translation_ui.ocr_once_follow_rect 的使用在 defaultconfig/config.json 的快捷键名称表中分别登记为进行一次OCR(_26)与再次进行OCR(_26_1),你可以进入「设置 → 快捷键」为它们绑定自己习惯的按键组合。
源码视角:一次OCR的执行链路
从源码看,进行一次OCR的实现位于 gui/translatorUI.py:
def ocr_once_function(self): def ocroncefunction(rect, img=None): self.ocr_once_follow_rect = rect self.ocr_do_function(rect, img) rangeselct_function(ocroncefunction, hideshow=True) @threader def ocr_do_function(self, rect, img=None): if not img: img = imageCut(0, rect) result = ocr_run(img) result = result.maybeerror() if result: gobject.base.textgetmethod(result, is_auto_run=False)关键链路可拆解为四步:
- 选区:
rangeselct_function(ocroncefunction, hideshow=True)弹出与 OCR 模式相同的选区控件,拖拽确定rect(屏幕矩形); - 记忆范围:回调函数将本次
rect存入self.ocr_once_follow_rect——这正是再次进行OCR无需重新选区、直接沿用上次范围的原因; - 截图与识别:
ocr_do_function(带@threader装饰器,运行在独立线程避免卡 UI)调用imageCut(0, rect)截取指定区域,再交给ocr_run(img)调用当前配置的 OCR 引擎(本地 OCR 或在线 OCR API 均可); - 接入文本管线:识别结果通过
gobject.base.textgetmethod(result, is_auto_run=False)送入与 HOOK 文本相同的处理链——即会经历文本预处理、分词、查词典、翻译、显示等既有环节,且不会触发自动运行(is_auto_run=False),因此在临时 OCR 后不会改变 HOOK 模式的持续翻译状态。
按钮绑定位于 gui/translatorUI.py:
("ocr_once", self.ocr_once_signal.emit), ( "ocr_once_follow", lambda: self.ocr_do_function(self.ocr_once_follow_rect), ),ocr_once按钮发出ocr_once_signal(PyQt 信号),由ocr_once_function处理;ocr_once_follow则直接使用已记忆的self.ocr_once_follow_rect(初始为None,若此前从未进行过一次 OCR,则此功能无可用的范围)。信号的定义与连接见 gui/translatorUI.py 与 gui/translatorUI.py。
值得一提的是,同样的ocr_once_signal机制也存在于查词窗口 gui/showword.py,并在快捷键表中登记为OCR_查词(39),方便在查词窗口中对屏幕任意位置做一次性 OCR 查词,与主界面的一次性 OCR 思路一脉相承。
推荐使用流程
结合上述原理,处理「HOOK 模式漏抓选择肢/菜单」的标准操作流程如下:
- 保持 HOOK 模式运行,确认游戏文字正常自动提取;
- 点击按钮栏中的
进行一次OCR(fa.crop图标)或按下对应快捷键_26; - 在游戏画面上框选选择肢/菜单文字区域;
- 松手后自动对该区域执行一次 OCR,识别文本立即进入翻译管线显示译文;
- 游戏继续推进,HOOK 模式无缝恢复自动提取;
- 若选择肢固定在相同位置,后续可直接按
再次进行OCR(_26_1)沿用上次选区重复识别,无需再手动框选。
注意事项
- 不要混淆两个同名图标按钮:
进行一次OCR是"一次性"动作,执行完即退回原模式;若要持续识别某个区域并自动翻译,请切换到 OCR 模式使用选取OCR范围(该按钮仅在 OCR 模式下显示)。 再次进行OCR依赖上一次范围:必须先成功执行过一次进行一次OCR(源码中会保存ocr_once_follow_rect),否则无可用选区。- 临时识别的文本不会开启自动翻译循环:
textgetmethod(..., is_auto_run=False)表明该次识别是一次性投喂,不会抢占 HOOK 模式的持续提取状态,这是"无缝衔接"的底层保证。 - 快捷键可自定义:
_26/_26_1为默认登记,可在设置中按个人习惯重新绑定,相关定义见 defaultconfig/config.json。
小结
「进行一次OCR」与「再次进行OCR」是 LunaTranslator 为 HOOK 模式补齐短板的精巧设计:它把 OCR 能力以"一次性工具"的形式无缝嵌入持续翻译流程,既免去了频繁切换模式的麻烦,又通过记忆选区(ocr_once_follow_rect)让固定位置的重复文本(如选择肢)只需一次框选即可反复识别。理解其按钮图标、模式归属与源码执行链路,能让你在实战中准确使用这一功能,避免把一次性 OCR 误当作持续 OCR 的常见误区。
更多相关用法可参考官方文档目录下的 OCR参数说明、常用OCR配置 以及 OCR API 接入指南,配合本功能可以构建更完整的"HOOK + 临时OCR"混合翻译工作流。
【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考