日漫机翻经验谈(7)之manga-translator-ui
如果说 Saber-Translator, BallonsTranslator 翻译效果不够好,manga-image-translator 安装不易,ImageTrans 付费,那么最近新开发的 manga-translator-ui 则基本弥补了前面四款翻译器所有的不足之处,又集三家之长,在翻译效果上再创新高。
归档目录
项目地址
横向对比
安装
manga-translator-ui 提供打包版本(不支持更新),以及一键安装脚本(支持更新),如果网络环境适宜,那么几乎不会卡在安装这一步。即使模型下载较慢,也可以使用上面发的网盘链接获取。
manga-image-translator 和 BallonsTranslator 安装比较复杂,为此我还专门写了“安装建议”,见日漫机翻经验谈 (4) 之 manga-image-translator。
检测
集成了目前检测效果最好的 manga-image-translator 的默认检测模型 detector(请参考日漫机翻经验谈 (4) 之 manga-image-translator 的“翻译质量”部分),并结合我的建议,使用混合检测与 mangaocr 进行二次 OCR,避免语气词等单个字符或少数字符的语句遗漏。
具体来说
之manga-translator-ui-1766365968817.webp)
之manga-translator-ui-1766368630864.png)
manga-translator-ui 那张其实是把“... ツ”翻译成了“...”。
OCR
OCR 模型的细致区别请参考日漫机翻经验谈 (3) 之 BallonsTranslator之“使用建议”之“OCR”。
manga-translator-ui 集成了目前日漫 OCR 效果最好的 mit 48 px 模型,同时也支持 AI 视觉 OCR.
翻译
首先是支持高质量翻译,相当于让 AI 看着图片进行翻译,能分辨角色与情景,比传统的纯文本翻译效果更好,这也曾经是 Saber-Translator 的特色功能,见日漫机翻经验谈 (2) 之 Saber-Translator。
其次是支持设置携带的上下文页数,这样可以结合上下文进行翻译,统一术语,延续上文的语境。
最后是支持大批量地原文导出与译文导入,具体作用请参考日漫机翻经验谈 (6) 之综合这篇我之前写的文章。
manga-image-translator 的 BUG
在翻译以下图片时,manga-image-translator 会报错。
之manga-translator-ui-1766331083407.jpg)
ERROR: [local] Error during rendering:
Traceback (most recent call last):
File "D:\Tools\manga-image-translator\manga_translator\manga_translator.py", line 612, in _translate
ctx.img_rendered = await self._run_text_rendering(config, ctx)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Tools\manga-image-translator\manga_translator\manga_translator.py", line 1376, in _run_text_rendering
output = await dispatch_rendering(ctx.img_inpainted, ctx.text_regions, self.font_path, config.render.font_size,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Tools\manga-image-translator\manga_translator\rendering\__init__.py", line 261, in dispatch
img = render(img, region, dst_points, hyphenate, line_spacing, disable_font_border)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Tools\manga-image-translator\manga_translator\rendering\__init__.py", line 312, in render
temp_box = text_render.put_text_vertical(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\Tools\manga-image-translator\manga_translator\rendering\text_render.py", line 550, in put_text_vertical
num_char_x = len(text) // num_char_y + 1
~~~~~~~~~~^^~~~~~~~~~~~
ZeroDivisionError: integer division or modulo by zero
ERROR: [local] ZeroDivisionError: integer division or modulo by zeromanga-translator-ui 虽然集成了 manga-image-translator 修复过程的算法,但并没有集成这个 BUG.
BallonsTranslator 的 BUG
在 Bug 反馈:ctd+mit48px 气泡框边缘文字未 OCR 这条 issue 中,描述了 BallonsTranslator 的一处 BUG,但是这在 manga-translator-ui 中并没有发生。
批量导出原文与导入译文
见日漫机翻经验谈 (4) 之 manga-image-translator 之“注意事项”,manga-image-translator 这个功能已经不可用。
BallonsTranslator 虽然支持这个功能,但是不支持输出为 json 文件等格式比较强的文件,容易在翻译过程中造成混乱,并且不兼容 LinguaGacha 和 KeywordGacha 这两个翻译器。
manga-translator-ui 支持这个功能,并且跳过文件的速度得到了大幅提升。
集成与特色
漫画超分
简单来说,漫画超分是提高漫画的清晰度。
manga-translator-ui 集成了五种超分模型
- Waifu 2 x
- ESRGAN
- 4 x UltraSharp
- Real-CUGAN
- MangaJaNai
并不推荐 Real-CUGAN, 因为这个模型对文字处理不佳,而且会擅自去除阴影。更推荐使用 MangaJaNai, 倍率调成 2 就可以了。
之manga-translator-ui-1766368824552.png)
之manga-translator-ui-1766368859775.png)
之manga-translator-ui-1766368941024.jpeg)
漫画上色
集成的上色模型是漫画阅读与管理经验谈提到的qweasdd/manga-colorization-v2模型,效果很差,并不推荐。
并发线程
翻译的时候会进行 OCR 与修复,不会干等着 api 返回。
自动提取术语表
待测试。其实也推荐我写的下一篇文章中使用 KeywordGacha 进行术语表提取。
AI 断句
没用过。
使用建议
混合 OCR
混合 OCR 能减少漏检率,详见前文。日漫推荐 mit 48 px+mangaocr,英文漫画推荐 mit 48 px+paddleocr,mit 48 px 作为首选,mangaocr 作为辅助 OCR 主要是为了 OCR 语气词等单个字符或少数字符的语句,而这是 mit 48 px 所容易遗漏的。
yolo 辅助检测
这是解决语气词等单个字符或少数字符的语句遗漏问题的另一块拼图,推荐将 yolo置信度阈值 设置为 0.3。
图片可编辑
建议开启,不然会出现没有覆盖文件,新的翻译结果不生效的情况。
使用技巧
翻译分离
建议参考我写的下一篇文章。
导出原文
使用 config_save_text.json 配置文件。
{
"app": {
"last_open_dir": "",
"last_output_path": "",
"favorite_folders": [
"J:/漫画/mangas",
"J:/漫画/RAW"
],
"theme": "dark",
"ui_language": "auto",
"current_preset": "默认"
},
"filter_text": null,
"kernel_size": 3,
"mask_dilation_offset": 70,
"translator": {
"translator": "openai",
"target_lang": "CHS",
"no_text_lang_skip": false,
"gpt_config": "examples/my_gpt_config.yaml",
"high_quality_prompt_path": "dict/prompt_example.json",
"max_requests_per_minute": 0,
"attempts": -1
},
"ocr": {
"use_mocr_merge": false,
"ocr": "48px",
"use_hybrid_ocr": true,
"secondary_ocr": "mocr",
"min_text_length": 0,
"ignore_bubble": 0,
"prob": 0.1,
"merge_gamma": 0.8,
"merge_sigma": 2.5,
"merge_edge_ratio_threshold": 0.0
},
"detector": {
"detector": "default",
"detection_size": 2048,
"text_threshold": 0.5,
"det_rotate": false,
"det_auto_rotate": false,
"det_invert": false,
"det_gamma_correct": false,
"box_threshold": 0.5,
"unclip_ratio": 2.5,
"use_yolo_obb": true,
"yolo_obb_conf": 0.3,
"yolo_obb_iou": 0.6,
"yolo_obb_overlap_threshold": 0.1,
"min_box_area_ratio": 0
},
"inpainter": {
"inpainter": "lama_large",
"inpainting_size": 2048.0,
"inpainting_precision": "fp32",
"inpainting_split_ratio": 3.0
},
"render": {
"renderer": "default",
"alignment": "auto",
"disable_font_border": false,
"disable_auto_wrap": false,
"font_size_offset": 0,
"font_size_minimum": 0,
"direction": "auto",
"uppercase": false,
"lowercase": false,
"font_path": "fonts/Arial-Unicode-Regular.ttf",
"no_hyphenation": false,
"font_color": null,
"line_spacing": null,
"font_size": null,
"auto_rotate_symbols": false,
"rtl": true,
"layout_mode": "smart_scaling",
"max_font_size": 0,
"font_scale_ratio": 1.0,
"center_text_in_bubble": false,
"optimize_line_breaks": false,
"check_br_and_retry": false,
"strict_smart_scaling": false,
"stroke_width": 0.07
},
"upscale": {
"upscaler": "realcugan",
"upscale_ratio": null,
"realcugan_model": null,
"tile_size": 600,
"revert_upscaling": false
},
"colorizer": {
"colorization_size": 2048,
"denoise_sigma": 30,
"colorizer": "none"
},
"cli": {
"verbose": false,
"attempts": -1,
"ignore_errors": false,
"use_gpu": true,
"use_gpu_limited": false,
"context_size": 60,
"format": "png",
"overwrite": false,
"skip_no_text": false,
"save_text": true,
"load_text": false,
"template": true,
"save_quality": 100,
"batch_size": 1,
"batch_concurrent": false,
"generate_and_export": false,
"colorize_only": false,
"upscale_only": false,
"inpaint_only": false,
"save_to_source_dir": false
}
}对于英文漫画,只需把 "secondary_ocr": "mocr" 改为 "secondary_ocr": "paddleocr"。
导入翻译
使用 config_load_text.json 配置文件。
{
"app": {
"last_open_dir": "",
"last_output_path": "",
"favorite_folders": [
"J:/漫画/mangas",
"J:/漫画/RAW"
],
"theme": "dark",
"ui_language": "auto",
"current_preset": "默认"
},
"filter_text": null,
"kernel_size": 3,
"mask_dilation_offset": 70,
"translator": {
"translator": "openai",
"target_lang": "CHS",
"no_text_lang_skip": false,
"gpt_config": "examples/my_gpt_config.yaml",
"high_quality_prompt_path": "dict/prompt_example.json",
"max_requests_per_minute": 0,
"attempts": -1
},
"ocr": {
"use_mocr_merge": false,
"ocr": "48px",
"use_hybrid_ocr": true,
"secondary_ocr": "mocr",
"min_text_length": 0,
"ignore_bubble": 0,
"prob": 0.1,
"merge_gamma": 0.8,
"merge_sigma": 2.5,
"merge_edge_ratio_threshold": 0.0
},
"detector": {
"detector": "default",
"detection_size": 2048,
"text_threshold": 0.5,
"det_rotate": false,
"det_auto_rotate": false,
"det_invert": false,
"det_gamma_correct": false,
"box_threshold": 0.5,
"unclip_ratio": 2.5,
"use_yolo_obb": true,
"yolo_obb_conf": 0.3,
"yolo_obb_iou": 0.6,
"yolo_obb_overlap_threshold": 0.1,
"min_box_area_ratio": 0
},
"inpainter": {
"inpainter": "lama_large",
"inpainting_size": 1024,
"inpainting_precision": "fp32",
"inpainting_split_ratio": 3.0
},
"render": {
"renderer": "default",
"alignment": "auto",
"disable_font_border": false,
"disable_auto_wrap": false,
"font_size_offset": 0,
"font_size_minimum": 0,
"direction": "auto",
"uppercase": false,
"lowercase": false,
"font_path": "fonts/Arial-Unicode-Regular.ttf",
"no_hyphenation": false,
"font_color": null,
"line_spacing": null,
"font_size": null,
"auto_rotate_symbols": false,
"rtl": true,
"layout_mode": "smart_scaling",
"max_font_size": 0,
"font_scale_ratio": 1.0,
"center_text_in_bubble": false,
"optimize_line_breaks": false,
"check_br_and_retry": false,
"strict_smart_scaling": false,
"stroke_width": 0.07
},
"upscale": {
"upscaler": "realcugan",
"upscale_ratio": null,
"realcugan_model": null,
"tile_size": 600,
"revert_upscaling": false
},
"colorizer": {
"colorization_size": 2048,
"denoise_sigma": 30,
"colorizer": "none"
},
"cli": {
"verbose": false,
"attempts": -1,
"ignore_errors": false,
"use_gpu": true,
"use_gpu_limited": false,
"context_size": 60,
"format": "png",
"overwrite": false,
"skip_no_text": false,
"save_text": false,
"load_text": true,
"template": true,
"save_quality": 100,
"batch_size": 1,
"batch_concurrent": false,
"generate_and_export": false,
"colorize_only": false,
"upscale_only": false,
"inpaint_only": false,
"save_to_source_dir": false
}
}使用感受
这个项目在今年八月份开始开发,到十一月基本基本可用,不过现在仍有一些小 BUG,不过不必担心,及时反馈给开发者即可,一般近一两天内就能解决。
对于翻译日漫,效果比 manga-image-translator 稍好,但是没有上面提到的 manga-image-translator 特有 BUG,因此不会时不时中断。而且也提供了命令行模式与批量导出原文、导入译文功能,而后者是 manga-image-translator 所不支持的。
但是,manga-translator-ui 内存占用偏高(我的电脑是 16 G 内存),虽然能通过 --memory-percent 参数限制内存占用,但仍然会出现卡死的情况,比如 chrome 页面卡死、程序崩溃,又比如 vscode 卡退,最严重的一次甚至直接电脑蓝屏。这与日漫机翻经验谈 (5) 之 ImageTrans 中“使用感受”所描述的问题相类似。
而我现在也是从 manga-image-translator 转到 manga-translator-ui, 在翻译一万多张图片后能确认这确实是一个不错的翻译器。
常见问题
gemini 模型要用 Google gemini 类型的翻译器吗
取决于 api 的接口类型。官方渠道 gemini 则选 Google gemini 型翻译器,其他的中转渠道 api,一般来说选 openai 型翻译器。
翻译后的图片怎么编辑不了
点击编辑原图。
之manga-translator-ui-1766371658153.png)
安装用的脚本运行失败
选择国外网络环境,开启全局代理。
翻译失败
先点击“测试”按钮,以确保 api 没有问题。
之manga-translator-ui-1766371786600.png)
宣传尾页
之manga-translator-ui-1766373827980.png)
