ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

LunaTranslator 在 HOOK 模式下临时使用 OCR:`进行一次OCR` 按钮与快捷键全解析

LunaTranslator 在 HOOK 模式下临时使用 OCR:`进行一次OCR` 按钮与快捷键全解析 LunaTranslator 在 HOOK 模式下临时使用 OCR进行一次OCR按钮与快捷键全解析【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslatorLunaTranslator 是一款面向视觉小说VN/AVG场景的翻译工具其最常用的文本提取方式是HOOK 模式通过内存注入挂钩游戏引擎自动提取对话文本。但游戏中的菜单、选择肢選択肢、标题栏等非对话文本往往不会被 HOOK 捕获。本文围绕官方文档 docs/ja/gooduse/useocrinhook.md 讲解的内置解决方案——在 HOOK 模式下临时执行一次 OCR——展开并结合仓库源码translatorUI.py、rangeselect.py、ocrutil.py深入说明其实现原理、按钮与快捷键配置帮助读者彻底告别切模式—选范围—切回来的繁琐操作。痛点HOOK 模式的固有缺漏HOOK 模式通过挂钩游戏进程内的文本输出函数来截获文本因此凡是游戏引擎没有以文本形式渲染、而是以图片或自绘控件方式显示的内容HOOK 都无法捕获。典型场景包括游戏主菜单メニュー与暂停菜单选择肢選択肢选项框系统提示、地图 UI、状态栏等非对话文本使用特殊渲染引擎的过场动画字幕。面对这些文本传统做法是切换到 OCR 模式 → 手动框选识别范围 → 识别完成后再切换回 HOOK 模式。这个过程步骤多、打断游戏节奏尤其在剧情分支处频繁出现选择肢时体验很差。内置解决方案进行一次OCR与再次进行OCR文档明确指出LunaTranslator 早已内置了针对该场景的方案无需手动切换文本源模式。核心是两个功能进行一次OCR按钮图标 对应源码配置ocr_once再次进行OCR按钮图标 对应源码配置ocr_once_follow其使用流程为在HOOK 模式下点击「进行一次OCR」按钮或按对应快捷键屏幕上弹出范围选择框拖拽框选要识别的文本区域松开鼠标后只执行一次 OCR识别结果直接进入翻译流程OCR 随即结束工具无缝回到 HOOK 模式继续自动提取游戏对话文本。也就是说这是一个临时借用 OCR 能力补齐 HOOK 缺漏的机制识别完毕后文本源自动恢复为 HOOK玩家的翻译流程不会被打断。固定位置选择肢用「再次进行OCR」复用上次选区对于位置固定不变的选择肢例如始终显示在屏幕底部、仅内容变化的选项每次框选显然重复且低效。此时应使用「再次进行OCR」按钮或快捷键它会直接沿用上一次「进行一次OCR」框选的范围再次执行一次 OCR无需重新拖拽选区。源码级原理剖析配置项定义两个功能的默认配置位于 defaultconfig/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_once的默认图标是fa.crop裁剪/框选图标默认启用use: trueocr_once_follow的默认图标是fa.spinner旋转/再次执行图标默认未启用use: false需用户在工具栏配置中手动打开两按钮默认都排在align: 2右侧工具栏区域。主界面实现translatorUI.py主界面的核心实现位于 gui/translatorUI.py定义信号ocr_once_signal第 67 行在ocr_once_function第 343-348 行中def ocr_once_function(self): def ocroncefunction(rect, imgNone): self.ocr_once_follow_rect rect # 记录本次选区供“再次进行OCR”复用 self.ocr_do_function(rect, img) rangeselct_function(ocroncefunction, hideshowTrue)ocr_do_function第 334-341 行负责真正执行截图与识别threader 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)工具栏绑定第 582-586 行(ocr_once, self.ocr_once_signal.emit), ( ocr_once_follow, lambda: self.ocr_do_function(self.ocr_once_follow_rect), ),可以看到ocr_once走框选 → 记录选区 → 执行流程而ocr_once_follow直接复用self.ocr_once_follow_rect这个上次记录的选区初始值为None见第 778 行因此在未执行过一次「进行一次OCR」前直接使用「再次进行OCR」是无效的。选区交互rangeselect.pyrangeselct_function定义在 gui/rangeselect.py其工作方式若hideshowTrue一次OCR场景即如此会先把翻译窗口与已有 OCR 范围框临时移出屏幕移动到(-9999, -9999)并调用textsource.pause_recognition()暂停当前文本源识别避免与选区操作互相干扰第 427-441 行调用NativeUtils.CreateSelectRangeWindow_CB创建原生选区窗口第 470-479 行其外观受ocrselectalpha选区遮罩透明度默认 0.3、ocrrangecolor选区框颜色默认#000000、ocrrangewidth框线宽度默认 1等全局配置控制回调__cb第 461-468 行中计算规范化后的矩形自动处理拖拽方向导致的 x1x2、y1y2截取对应图像区域调用reset()恢复窗口位置并resume_recognition()恢复文本源识别最后把rect与pix交给回调即ocr_once_function里的ocroncefunction。这解释了文档中选取完范围后无缝回到 HOOK 模式的机制选区窗口关闭的同时文本源识别即被恢复。OCR 引擎调用ocrutil.py截图与识别由 myutils/ocrutil.py 承担imageCut(hwnd, rect)第 12-19 行通过NativeUtils.GdiCropImage截取矩形区域图像ocr_run(qimage)第 62 行起调用ocr_init()按 config.json 中ocr段第一个use为 true 的引擎初始化第 41-59 行随后执行识别识别结果通过gobject.base.textgetmethod(result, is_auto_runFalse)进入文本处理与翻译管线与 HOOK 抓取到的文本走同一套后续流程。因此一次OCR并不是切换到 OCR 文本源而是直接调用 OCR 引擎执行单次识别从机制上保证了识别完成后仍停留在 HOOK 模式。一个常见误解这不是 OCR 模式的按钮文档特别强调了一个高频误用场景由于这个按钮的图标与 OCR 模式下选取识别范围按钮默认相同都是fa.crop很多原本想用 OCR 的用户误以为这就是 OCR 开关于是在 HOOK 模式下点它框选范围后发现并没有自动翻译。原因在于本按钮ocr_once只执行一次识别不会持续对选区内的画面进行循环识别因此后续画面变化不会自动翻译真正的OCR 模式切换后工具栏才会显示 OCR 模式专属的按钮如持续选区识别、隐藏/显示范围框hideocrrange等见 config.json。判断方法很简单若需要持续识别某区域并自动翻译应切换到 OCR 模式并使用其中的选取 OCR 范围按钮若只是 HOOK 模式下偶尔补充识别一次菜单/选择肢则用「进行一次OCR」。快捷键配置两个功能均支持快捷键快捷键编号与默认名称定义在 defaultconfig/config.json快捷键编号名称说明_26进行一次OCR弹出选区框执行一次识别_26_1再次进行OCR沿用上次选区执行一次识别快捷键的触发绑定位于 gui/setting/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_function→ 框选 → 记录选区 → 识别_26_1则等价于「再次进行OCR」直接用ocr_once_follow_rect执行ocr_do_function。此外在快捷键分组中两者都属于OCR 组见 hotkey.py 第 300 行[OCR, [_13, _14, _14_1, _26, _26_1, ...]]可在设置 → 快捷键界面中为它们分配任意按键组合。最佳实践小结场景匹配HOOK 捕获不到的菜单、选择肢、系统提示 → 使用「进行一次OCR」不要在 HOOK 模式下期望该按钮提供持续翻译。固定位置选择肢第一次用「进行一次OCR」框选后后续直接用「再次进行OCR」_26_1或快捷键复用选区省去重复框选。前置条件「再次进行OCR」依赖上一次「进行一次OCR」记录的选区程序启动后未框选过时直接使用会因选区为空而无效需要先框选一次。与 OCR 模式的分工需要持续、自动识别固定区域例如无 HOOK 支持的游戏全程字幕时请切换到 OCR 模式并使用其选取 OCR 范围功能HOOK 模式下的「进行一次OCR」只做单次补漏。自定义外观选区框颜色ocrrangecolor、遮罩透明度ocrselectalpha、框线宽度ocrrangewidth可在全局配置中调整让选区更清晰可见。掌握「进行一次OCR / 再次进行OCR」这两个内置工具即可在不打断 HOOK 自动翻译流的前提下快速补捉菜单与选择肢文本让 LunaTranslator 在混合 UI 的游戏场景下也能保持流畅的沉浸式翻译体验。【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表