2025年5月14日 星期三

manga-image-translator安裝與設定教學

之前有人提到SakuraLLM這個AI翻譯模型時
就有在SakuraLLM的Github頁面上看到這個專案
一直想玩玩,但前面遇上gemma3、whisper與framepack等其它好玩的東西
就一直放著沒試
最近上面的東西告一段落後突然想到,終於輪到它啦
這是官方頁面
https://github.com/zyddnys/manga-image-translator
下面是簡體中文說明
https://github.com/zyddnys/manga-image-translator/blob/main/README_CN.md
實際使用後,覺得這東西真棒啊!
不過還是有些設定上的小問題要克服,這邊做一下記錄
(文章超長,沒有圖)

開始就前先碎碎唸一下這個說明頁面
安裝流程上是沒問題啦
不過使用說明上,或許是用docker的服務跑網頁介面已經很方便
對於大量使用簡體中文的使用者來說,也沒掛其它語系的必要
所以對於上級者向的本地運轉的設定與微調說明就沒有更詳細的範例
以至於我要快速上手時,看得一頭霧水
在我在搞定設定之前一直想,到底是我閱讀能力退化?
還是我對於這種文件的閱讀欠缺了什麼專業知識?
整個搞定後,我承認我文件有些東西看得不夠詳細
不過關鍵的卡點還是在被某個範例誤導了
至於我是怎麼卡關的,後面談到時再來說明吧
抱怨到此結束,進入正題

如說明文件上所列,使用manga-image-translator有兩個辦法
一個是直接安裝所需的python套件的虛擬環境,然後直接執行
另一個就是下載已經完成的映像檔,掛在docker服務器上
後者其實最簡單,畢竟所有東西都包好了,環境也單純
不過我比較喜歡直接來
就選了難度比較高的前者
然後如碎碎唸所說就撞上了真的最困難的部分

碎碎唸的地方有說了,安裝上基本沒問題
就是電腦裡要有python與git,然後用git抓取最新的程式碼
並使用python建立獨立的虛擬環境執行後
使用pip install -r requirements.txt安裝所有需要的套件
只是有兩個地方我覺得必須要補充說明一下
一個就是說明文件有說它有個套件需要c++編譯,要先安裝Microsoft C++ Build Tools
這個沒錯,我有偷雞了一下,先不裝真的就會發生錯誤停止安裝
但說明文件上的連結,怎麼看都是安裝整套Visual Studio
https://visualstudio.microsoft.com/zh-hant/vs/
我的認知下面這個只有編譯工具的應該才會是比較省空間的選項
https://visualstudio.microsoft.com/zh-hant/visual-cpp-build-tools/
所以我是裝這個,我也建議裝這個就好
第二個就是「強烈建議」有要用GPU加速的pytorch的cuda版本請選用cu118版
因為manga-image-translator裡面用的ocr是用paddleocr,我最近有用
結果在另一個環境安裝時,明明兩者的cuda的版本都是cu126了
還是發生pytorch上cuda驅動相衝的問題
照著這專案requirements.txt裡裝的是paddleocr的gpu版是用cu118
而我裝pytorch就裝118後真的也沒什麼問題,所以強烈建議pytorch請裝cu118版本

安裝OK,接著就是重點了,怎麼使用?
這套有兩種用法,(伺服器)網頁操作與最麻煩的本地(批量)模式
我這邊的教學就專攻本地(批量)模式,說明如下
照著範例直接下 python -m manga_translator local -v -i <path>
紅字local代表本地模式,就可以將整個目錄(path)裡的檔案一一翻譯並修改內容
第一次執行時會下載各種處理要用的模型,會比較久
實際的執行速度不慢,看內容翻譯後的內容也都照對話框放,可是翻出來都英文
進階使用,想要修改指定的翻譯器跟目標語言,必須照著這篇
一键无人值守漫画汉化(翻译/嵌字)系统本地化部署避坑实践指南」所說的
更改一些預設的設定
首先請複製並修改example資料夾裡的config_example.json
我就把這檔案改名為config.json放在專案的根目錄下
並把translator的內容換成m2m100_big,target_lang的內容也是換成CHT後存檔就行了
  "translator": {
    "translator": "m2m100_big",
    "target_lang": "CHT",
    "no_text_lang_skip": false,
    "skip_lang": null,
    "gpt_config": null,
    "translator_chain": null,
    "selective_translation": null
  },
並在命令列中加入--config-file config.json引入使用
python -m manga_translator local --config-file config.json -v -i <path>
這樣就會下載m2m100的模型,並把輸出文字改成是繁體中文輸出了
另外如果要加速產出,前面有安裝gpu支援的pytorch的話
可以加入--use-gpu
python -m manga_translator local --use-gpu  --config-file config.json -v -i <path>
這樣就會更快了

接下來講SakuraLLM的使用
這服務的安裝與使用雖然沒有到很麻煩,甚至可以說簡單,不過我不想混在這邊講
請自行參照Sakura_Launcher_GUI的github網頁吧
https://github.com/PiDanShouRouZhouXD/Sakura_Launcher_GUI
在假設已經有照預設值將服務正確啟動後
那其實改config.json就可以使用了
但最新的v1.0有個術語表功能可以強制翻譯出自己習慣的名稱,實在非常推薦使用
所以還是完整地介紹一下相關設定,反正也不多
而且只要是會用到這種線上AI服務翻譯(openai,deepseek,qwen2與custom_openai等等)
就需要在.env文件進行設定,還是一併說了
這文件的範例與config_exmaple.json一樣放在examples資料夾中的example.env
一樣把它複製到專案根目錄下,然後這次一定要改名了,檔名去掉改成.env
這樣執行時,程式就會自動讀入
接著進入文件中修改,將SAKURA_VERSION從"0.9"改為"0.10"
# sakura
SAKURA_API_BASE = 'http://127.0.0.1:8080/v1' #SAKURA API地址
SAKURA_VERSION = '0.10' #SAKURA API版本,可选值:0.9、0.10,选择0.10则会加载术语表。
SAKURA_DICT_PATH = './sakura_dict.txt' #SAKURA 术语表路径

這樣就可以使用同樣根目錄下的sakura_dict.txt指定一些專有名詞
接下來當然是改config.json裡的內容
一樣換掉translator與target_lang,translator放sakura,當然如果target_lang還是CHS的話就不用改
  "translator": {
    "translator": "
sakura",
    "target_lang": "
CHS",
    "no_text_lang_skip": false,
    "skip_lang": null,
    "gpt_config": null,
    "translator_chain": null,
    "selective_translation": null
  },

這樣再執行這行命令
python -m manga_translator local --user-gpu --config-file config.json -v -i <path>
翻譯品質更好的圖片就出來了

不過SakuraLLM只支援簡中與日文互轉
目前要有品質更好的繁中,又不想花錢的話,就是靠離線式的模型了
我之前剛好有使用ollama,這真的很萬用,剛好可以配合
所以翻譯器的最後部分就來講ollama的使用
只是這部分就更麻煩了
首先在examples裡的example.env資料有缺漏
ollama是算在custom_openai翻譯器下,文件中註解是有說要補上OLLAMA_HOST的設定
然而實際上根本不是欠缺這個設定
我弄了一陣子,都連不上模型
上網一查,才找到這個說明,並補上缺漏的部分
[Bug]: 404 when using ollama · Issue #820 · zyddnys/manga-image-translator
需要在.env裡補上的是,OLLAMA_API_BASE = 'http://localhost:11434/v1'
假定這次使用的目標模型是gemma3:4b,所以.env相關的整個設定就會是
CUSTOM_OPENAI_API_KEY = 'ollama' 
CUSTOM_OPENAI_API_BASE = 'http://localhost:11434/v1'
CUSTOM_OPENAI_MODEL = 'gemma3:4b'
CUSTOM_OPENAI_MODEL_CONF = ''
OLLAMA_API_BASE = 'http://localhost:11434/v1'

當然除了這個,還要設定一下另一個檔案,躺在exmaples裡的gpt_config-example.yaml
一樣複製出來,改名為gpt_config.yaml,放在專案根目錄下
這檔案要修改的項目,主要有兩處
第一個是仿ollama下deepseek-r1的設定,做出gemma3的設定
ollama:
  gemma3:  #可以不用加4b,這樣設定就可以讓4b,12b與27b都適用
    rgx_capture: '<think>.*</think>\s*(.*)|(.*)' 
    chat_system_template: *CoT-template

gemma3底下兩個設定,rgx_capture是設定翻譯出來要濾掉的文字
像deepseek-r1會產出<think></think>的內容,這是不要的內容,這裡設定後,程式會剔除
gemma3不會有這部分,理論上可以不用加,但還是加入順便說明一下
另一個chat_system_template就是與模型溝通範例,這部分就一定要加,不然不會照格式來運作
當然也可以另外設定,這就屬更加進階的部分,我也還沒玩到那邊
第二個是要在chat_sample裡加入繁體中文的範例
chat_sample:
  Chinese (Traditional): # Tokens used in this example: 88 + 84
    - <|1|>恥ずかしい… 目立ちたくない… 私が消えたい…
      <|2|>きみ… 大丈夫⁉
      <|3|>なんだこいつ 空気読めて ないのか…?
    - <|1|>好尷尬…我不想引人注目…我想消失…
      <|2|>你…沒事吧⁉
      <|3|>這傢伙怎麼看不懂氣氛的…?

這樣翻譯出來的文字才會帶「<|編號|>」這個前置詞,程式才有辦法接手處理

接著一樣要改config.json的內容,翻譯器用custom_openai,語言用CHT
然後gpt_config用我們剛剛設定好的gpt_config.yaml
  "translator": {
    "translator": "custom_openai",
    "target_lang": "CHT",
    "no_text_lang_skip": false,
    "skip_lang": null,
    "gpt_config": "gpt_config.yaml",
    "translator_chain": null,
    "selective_translation": null
  },
設定完成後,再執行
python -m manga_translator local --user-gpu --config-file config.json -v -i <path>
這樣就可以靠ollama跑翻譯了

不過使用gemma3:4b的模型翻譯時可能會出現一個狀況
它翻出來的東西,帶編號的前置詞常常會不見了
導致後續程式要靠這編號做串列(List)處理時,就產出了空的串列[]
然後就跳IndexError: list index out of range異常中止了
我後來是把chat_sample的範例擴充到5組之多,加強提醒,才比較少發生
但還是偶爾會發生
之後改用gemma3:12b等更高參數量的模型時,才沒有遇到這情況
所以選參數量太小的模型會有這種不太聽話的問題
不過選參數量太大的模型也有另外的問題
為了更好的翻譯品質,我曾開了gemma3:27b下去跑
可是這翻譯時間會拉得很長,然後會因為翻譯太久,跳出這樣的訊息
WARNING: [CustomOpenAiTranslator] Restarting request due to timeout. Attempt:1
這訊息預設出現3次後,程式判斷可能伺服端有問題就中止了
其實gemma3:12b也偶爾會跳這訊息,只是次數不到3次就不會停掉程式
所以要嘛,在單機上跑ollama服務的電腦要夠強
要嘛單機暫時還是靠sakurallm比較兼具速度與效益

該講的設定基礎都講完了,接下來在進入進階的項目之前
再讓我說明一下,被哪個地方誤導,導致被卡關了一陣子
簡單地就是配置文件那邊的說明了
前面先說使用下面這個命令,可以查看JSON架構文檔
python -m manga_translator config-help >> config-info.json
後者說在exmaples/config_example.json是配置文件範例
所以當我知道--config-file參數可以導入配置文件時,我是用產出的config-info.json去匯入使用
嗯,都是json檔嘛,也跟設定有關,應該就是這個了
然後就出錯了,雖然執行結果不會出錯,但怎麼改內容執行結果都一樣,我就當機了…
後來回神上網路找答案,直到找到知乎那一篇再回頭看才理解我會錯意了
本來已經接近答案了,多浪費了一個多小時啊

來到進階的部分
這專案功能實在非常豐富,先從本地模式參數來看
它可以使用--save-text單輸出翻譯的文字到result資料夾中
或用--save-text-file指定輸出的文字檔,然後再自行修正內容
修正完之後,也可以使用--load-text把翻譯好的文字載入
(注意,載入的檔案要放在result中,檔名是「 圖檔名_translation.txt」
甚至覺得程式自動生成的文字狀況不好
還可以用--prep-manual產出無台詞版本的圖片,再自己嵌字
這專案同時也是個優良的漫畫翻譯前置器啊

然後搭配這功能的部分還可以調整翻譯器(translator)做自己想要的效果
例如,要另外翻譯文字的話,可以將翻譯器設為'original'
搭配--save-text就可以不翻譯,直接出OCR的文字檔
但是原程式碼沒有做編碼處理,所以日文輸出時我撞上了UnicodeEncodeError
至於怎麼修改,最後一段再來跟另外自己修改的部分進行說明
或是在輸出無台詞版圖片時,使用'none',這會連翻譯器都不開,省略掉文字處理的時間
離線翻譯器還有一個'offline'這參數,是在translator_chain上使用的
在掛上'offline'之後,翻譯器變成會聽translator_chain做指定來處理
翻譯參數上的說明,簡單地說就是兩段式翻譯
從後面範例文字的google:JPN;sugoi:ENG,就是先翻日文,然後再從日文翻英文
而在exmaples/translator_chain_example.json裡的範例則是'sugoi:ENG;papago:CHS'
先翻譯成英文再轉簡體中文
這可以有效避開一些直接翻譯效果不佳,或是離線模型不支援想翻譯語言的狀況
不過現在離線與線上的翻譯都愈來愈厲害,這功能就顯得很可有可無了

最後的部分,來講自己動手修改
之所以會選擇不用docker服務,而是本地安裝,為的其實也就是這個
有時候有些小地方,作者沒空處理,自己小懂就動手一下讓程式更符合自己想要的功能
是個更加有彈性的選擇
首先就是前面提到的save_text在輸出日文時無法存檔的編碥問題
這邊會連load_text一起處理
打開manga_translator目錄下的manga_translator.py
修改第625行與645行,將open函數加入encoding='utf-8'參數

with open(self._result_path(f"{input_filename}_translations.txt"), "r", encoding='utf-8') as f: 
with open(self._result_path(f"{input_filename}_translations.txt"), "w", encoding='utf-8') as f:

這樣就搞定了
接下來就是稍稍複雜的,讓SakuraLLM輸出繁體中文
說稍稍複雜,其實也沒改超過十行
步驟就只是修改Sakura適用的語言範圍,加入CHT選項
讓載入翻譯器時的適用語言檢查可以通過,然後進行實際翻譯
同時靠opencc的套件將翻譯出來的文字進行簡轉繁就完成了
需要修改的檔案是\manga_translator\translators\sakura.py這個檔案
實作的程式碼如下

#在最前面的引入(import區)加入opencc
#當然要記得先pip install opencc
from opencc import OpenCC
#在218行的語言碼配置中加入CHT的選項
    _LANGUAGE_CODE_MAP = {
        'CHS': 'Simplified Chinese',
        'CHT': 'Tranditional Chinese',
        'JPN': 'Japanese'
    }
    
#在async def _translate的函式中加入簡繁轉換
#在原本的468行的檢查翻譯結果的程式後加入
cc = opencc.OpenCC('s2twp') #載入opencc簡轉台灣中文慣用詞功能
if to_lang == "Traditional Chinese":      #確認目標是繁體中文
    for i in range(len(translations)):    #就對每一個翻譯出來的句子
        translations[i] = cc.convert(translations[i])  #進行轉換
        

嘿嘿,這樣就完成了
原本只有簡中的輸出,現在也有繁中的支援了
而且SakuraLLM的品質與速度都非常的好
只要OCR的部分不出錯,得到的就是會通順的成品了

沒有留言: