简介
这两天我看见一个galgame机翻工具 MisakaTranslator,它类似VNR,使用C#编写并且支持Hook和OCR(图像识别)两种方法提取文本。
我在MisakaTranslator的基础上进行了一些改动,去除了所有的机翻的功能,转而支持了加载本地汉化补丁的功能,并把它重命名为MisakaPatcher。通过这个工具,即使我们在解包封包上遇到困难,理论上我们还是可以用外挂的方法(手工)汉化任意一款文字游戏。
本项目Github主页
主要功能
- Hook + OCR提取文本
- 智能模糊匹配。匹配最有可能的原句,并显示对应翻译。
- 这个算法在提取到的文本与补丁里的原文相差很大的情况下依然可以正确匹配。
- 全透明的窗口,美观的字体,更好的游戏体验
效果展示
(注:图里的翻译是我手工翻译的)
制作补丁
我们把游戏原文本提取出来(或者用手打出来)后,改成如下格式(通常需要自己写一个脚本),放到一个文本文档里面,编码按UTF-8保存,就是我们的汉化补丁了:
<j>
原句1
<c>
翻译1
<j>
原句2
<c>
翻译2
...
这其实就是一个键值对的词库,注意两种标签数量必须一致。建议使用EmEditor,写脚本的时候注意encoding。补丁目前只支持单个文本文件,如果有多个文件,请先合并。之后我可能会加一些简单的加密功能来保护补丁里的文本不被随意提取改动(但是毕竟是开源的,实际意义不大)。
加载补丁
打开MisakaPatcher,右下角设置 -> 翻译相关设置 -> 通用设置 -> 选择本地汉化补丁为翻译源 然后再 翻译相关设置 ->本地汉化补丁 -> 选择汉化补丁的路径 然后就可以开始游戏了
使用
如果使用Hook,就根据向导设置就好了,挺简单的我不讲了。
如果使用OCR,首先需要在OCR设置里选择OCR方法,可以用百度OCR API,但是比较麻烦,这里建议直接用离线的Tesseract。程序自带了Tesseract3的dll和dataset,但是如果觉得效果不够理想,可以安装Tesseract5(见Github README)。
使用OCR时的注意点:
- 窗口截取目前在屏幕显示放大率不为100%的时候有bug,建议使用全屏截取
- 对话框不透明度建议调到最高
- 使用Tesseract必须使用预处理,建议使用提取纯白色文本处理,并且选择正确的参数,把截图转换为白纸黑字的样子,最有利于OCR识别。
- 文字速度尽量调到最高,不然可能会截不全
- 翻译的文本框不要和截屏区域放在一起,不然会把中文翻译一起截进去,导致无法正确识别原文本
智能模糊匹配原理
- 根据编辑距离,算出两句句子粗略的相似度
- 用一个sigmoid函数把粗略相似度转换为两句句子匹配的概率(0-1之间)
- 建立HMM模型,提取到的文本就是我们每一个时间点的观察(样本)
- 使用Viterbi算法,根据前一句所处位置的概率分布,从前一句转到当前句的概率,以及当前句的匹配程度,综合判断当前句匹配的概率
- 保存当前最有可能匹配的8个结果,并且返回其中最有可能匹配的那句话的翻译
- 因为我们知道大多数的句子都是不匹配的(整个模型是稀疏的),整个计算过程可以被简化,时间效率可以提升到每一步O(N)(N是整个补丁的句子总数)
- 详见代码里的注释