我给漫画阅读器加了 OCR 和翻译
![]()
我一开始真没想做 OCR。
wnacg 阅读器里一直有个「日語」分类,封面能看,页面能翻,点进去以后台词却全成了背景纹理。一个入口明明摆在那里,却每次都要绕开,比压根没有还让人惦记。
我当时只想补一个“翻译字幕”开关。按我的错误估计:OCR 认字,DeepSeek 翻译,再盖一层中文,半天差不多了。
最后发现,翻译反而是最省事的部分。
竖排日文把捷径堵死了
最开始我直接用了 macOS 的 Vision OCR。横排中文又快又准,红框一画出来,我还觉得事情已经解决了一半。
然后打开日文原版,几乎全是竖排。
旋转、放大、改语言优先级,我挨个试了一遍。结果可以概括成一句:中文表现很好,但我这里是日语。苹果自己的 Live Text 明明会读竖排,公开的 Vision 接口却不是同一条路。
最后还是换成了漫画专用的两段处理:comic-text-detector 先在整页里找出文字区域,manga-ocr-2025 再读每个区域里的日文。两者不是二选一,一个找字,一个认字,必须前后接起来。
识别出来的日文再交给 DeepSeek 翻译,最后由 Canvas 遮住原文,把中文重新排回气泡。两套本地模型加词表大约 230MB,第一次启用要下载;之后找字和认字都留在本机,送出去的只是日文文本。
第一次在真实页面上跑通时,竖排台词和语气词都读了出来。那一下确实挺爽。不过能认字,只能证明链路通了,离“能看”还差得远。
翻出来了,还是有点便宜
流水线通了以后,第一版嵌字依然让我不想看。省略号在竖排里散成一串点,字体像系统报错,文字整体偏左,白色遮盖块边缘又直又硬。
看起来就俩字:便宜。
模型报错至少会给日志;“便宜”没有堆栈,只能盯着图一点点改。标点换成适合竖排的全角形式,长气泡从右往左排,文字按实际尺寸居中;遮原文时不再盖一块死白,而是从气泡边缘取背景色,再把边缘放软一点。
没有什么惊人的算法,大部分时间都在试“再往右一像素会不会好一点”。
下面是同一页的实际前后对比:
原版:文字框找到了,里面还是竖排日文。

翻译后:同一个框里盖掉原文,再按竖排重新嵌入中文。

译文并不完美,我也不打算把它包装成“AI 一键汉化”。鼠标移到中文上会显示原文,就是因为有些句子看着太顺,反而值得怀疑一下。
还有一个 bug 更直接:关掉翻译,再打开,页面没有任何变化。
后台其实已经有译文,开关状态也对。漏掉的是最后一步——把缓存里的译文重新画到页面上。程序觉得自己早就做完了,屏幕却还停在原文。这种 bug 不高级,但特别像真实软件:每一层单独看都没错,合起来就是没用。
后来我把重绘补上,也给慢和失败留了看得见的状态。附近几页会提前处理,失败只重试当前页;正常阅读不显示调试用的红框,鼠标放到译文上还能看原文。
我最早只想读一页生肉。终端里出现“模型加载成功”时还没什么感觉,翻到下一页发现中文已经在那里,才觉得它总算能用了。
它现在还是会认错,也还需要网络和 DeepSeek 密钥。第一次用还得下载约 230MB 模型。但那个原本只能绕开的「日語」分类,终于变成了一个我真的会点进去的入口。