PDFを翻訳して英語版と日本語版を並べて表示したいときの最適解

PDFを翻訳して並べてほしい

最近PDFのテキストで学習しているのですが、全部で何百ページもあり、英語であることもあり目が滑ってしまいます。
せめて日本語翻訳したものが横にあるだけでも違うのではないかと思い調べてみたところ、処理時間自体は多少(1ページ10秒かからないくらい)かかるもののpythonで非常に簡単にツールを導入できました。

wsl2環境、GPU使用しています。

端的に導入まで紹介

多分、コマンド4行のこれだけで行けます。

curl -fsSL https://ollama.com/install.sh | sh # Ollamaインストール
ollama run gemma3 # 単なるダウンロード+動作確認
pip install pdf2zh # 今回使うツール
pdf2zh -li en -lo ja -t 1 -s ollama:gemma3 -p 1-10 book1.pdf # 翻訳実行

説明

今回使用するのはpdf2zhというものです。正式名称は「PDFMathTranslate」なのかな?
要求pythonバージョンは3.10~3.12とのこと。
いろいろインストール方法を用意してくれていますが、まあpipでやってしまうのが一番楽でしょう。
このpdf2zh自体は「PDF scientific paper translation and bilingual comparison」という説明がされており、これ自体が翻訳機の役割をもっているわけではありません。

なので、外部のDeepLだとかの翻訳ツールとかを利用する必要があります。(https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/ADVANCED.md#services)
いろいろ選択肢はあるのですが、まあオンラインにわざわざ繋げる必要も感じないので、今回はローカルLLMを翻訳ツールとして使用することにしています。Ollamaを使えばらくちんです。

Ollamaでgemma3みたいな新しめのモデルを使用する場合、ollamaのバージョンが古いとエラーが表示されます。その場合はおとなしくollamaのバージョンアップをしましょう。一行目のinstall.shの部分をもう一度実行すれば、勝手に最新版を取ってきてアップデートしてくれます。

pdf2zhの引数

引数はあまり特筆するところもなさそうです。

-pページ範囲 例: 1-3,5 とかで結構フレキシブル
-li翻訳元言語
-lo翻訳先言語
-sモデル名、ollamaのもの指定
-tGPUが1つなら基本1しかなさそう

結果一例

170ページくらいのPDFを翻訳してみました。だいたい1ページ10秒かからないくらいですね。

xxx$ pdf2zh -li en -lo ja -t 1 -s ollama:gemma3 book1.pdf
not in git repo
Namespace(files=['book1.pdf'], debug=False, pages=None, vfont='', vchar='', lang_in='en', lang_out='ja', service='ollama:gemma3', output='', thread=1, interactive=False, share=False, flask=False, celery=False, authorized=None, prompt=None, compatible=False, onnx=None, serverport=None, dir=False, config=None, babeldoc=False, skip_subset_fonts=False, ignore_cache=False, mcp=False, sse=False)
[05/13/25 03:22:41] INFO     INFO:pdf2zh.high_level:use font:                                          high_level.py:423
                             /home/wsl2/.cache/babeldoc/fonts/SourceHanSerifJP-Regular.ttf
100%|█████████████████████████████████████████████████████████████████████████████████| 173/173 [23:09<00:00,  8.03s/it]

出力を見てみたところ、思ったよりもいい感じです。ただ、文章の中に現れる数式とかには結構弱そうな印象で、一部崩れているところも見受けられました。許容範囲内ではありますが。

補足

とても長いエラーログの末に、

KeyError: 'cmap'

みたいなエラーが出ることがありました。そのときは、--skip-subset-fontsというオプションを試しに使用してみると解消するかもしれません。どういうオプションかよくわかっていませんが、フォント関係のエラーのように見受けられたのでフォント関係のオプションっぽいのを弄ってみたところ、動作するようになりました。
キャッシュが保存されているおかげで二回目の実行は高速なのが救いですね。

まとめ

コマンドを走らせると、翻訳前と翻訳語のPDFが一ページずつ交互に出力されたPDFを自動的に作成してくれます。これがなかなか需要をよくわかっているな、と感じるところですね。Chromeで二ページ表示するよう設定してPDFを閲覧するとかなり理想に近いことが実現できました。

コメント

タイトルとURLをコピーしました