manga-ocr: 手持ちの漫画をZipのまま爆速でテキスト化するCLIツールを作った
3行でまとめ
- Zipで圧縮された漫画の画像を一括OCRし、セリフをテキストとして抽出するCLIツールを作りました
- Apple Silicon(MPS)に最適化しており、ローカル環境で高速にOCR処理が走ります
- 漫画特有の「読み順」をDBSCANクラスタリングで推定するアルゴリズムにも挑戦しています
はじめに:このツールで何ができるのか
「あの名言、何巻のどのへんだっけ?」
「好きなシーンのセリフを全部テキストで保存しておきたい!」
漫画をたくさん持っている人なら、一度はこう思ったことがあるのではないでしょうか。しかし、大量の画像ファイルから手作業で文字起こしをするのは、考えただけで気が遠くなります。
そんな悩みを解決するために、 Zipで圧縮された漫画の画像を一括でOCR処理し、セリフをテキストデータとして抽出するCLIツール「manga-ocr」 をPythonで開発しました!
このツールを使えば、漫画のZipファイルを指定するだけで、ターミナル上で処理が走り、以下のようなテキストファイルが自動で生成されます。
[page1.png]
こんにちは
これは
Manga OCRの
デモです。
[page2.png]
これは
2ページ目です、
読み順は
どうなるかな?
...
本記事では、この「manga-ocr」の機能やこだわった点、そして開発の裏側(特に苦労した読み順の再現)についてご紹介します。
主な機能とこだわりポイント
こだわったのは、 「手軽さ」 と 「ローカルでの高速性」 、そして 「漫画ならではの読み順」 です。
✅ Zip解凍から出力までワンストップ!
Zipファイルを展開する必要はありません。ツールにファイルパスを渡すだけで、画像ファイルの抽出、OCR、テキスト出力までを全自動で行います。
✅ Apple Silicon(MPS)に最適化!ローカル環境で高速OCR
OCR処理にはPyTorchベースのモデルを使用しており、特にApple Silicon(M1/M2/M3/M4)に搭載されているMPS (Metal Performance Shaders) を活用することで、GPUアクセラレーションによる高速な推論をローカル環境で実現しています。
もちろん、NVIDIA GPU(CUDA)やCPUのみの環境でも動作します。
✅ 漫画の読み順への挑戦!
これがこのツールの最大のチャレンジでした。漫画のコマ割りや吹き出しの配置は、作品や作者によって様々で、決まったフォーマットがありません。

▲ このような縦長のコマが絡むと、読み順の判定は一気に複雑になります
この課題に取り組むため、以下のようなアルゴリズムを段階的に導入しました。
-
テキスト領域の検出 : まず、
comic-text-detectorを使って、画像内からテキスト領域(吹き出し)を検出します。 - パネル(コマ)の推定 : 次に、テキスト領域の密度に基づいたクラスタリングアルゴリズム DBSCAN を用いて、複数のテキスト領域を「パネル(コマ)」としてグループ化します。
- パネルのソート : 推定したパネルを、Y軸の重なり具合を考慮したカスタム比較関数でソートし、ページ全体の大きな流れ(段→コマ)を決定します。
- パネル内テキストのソート : 最後に、各パネル内でテキスト領域を右上から左下の順でソートします。
このアプローチにより、多くの基本的なレイアウトで自然な読み順を再現できるようになりました。しかし、完璧ではなく、レイアウトによっては意図しない順番になることもあり、この問題の奥深さを改めて痛感しています。(この挑戦の過程は、それ自体が非常に面白い技術的課題でした!)
インストールと使い方
インストール
setup.sh スクリプトを用意したので、MacやLinux環境では簡単にセットアップが完了します。
# リポジトリのクローン(submoduleも含む)
git clone --recursive https://github.com/kazuki-ookura/manga-ocr.git
cd manga-ocr
# セットアップスクリプトを実行
./setup.sh
Windowsの方や手動でセットアップしたい場合は、README.md に詳細な手順を記載しています。
使い方
インストール後、以下のコマンドで実行できます。
# 基本的な使い方
manga-ocr "path/to/your/comic.zip"
# 詳細なログを見ながら実行
manga-ocr "path/to/your/comic.zip" --verbose
処理が完了すると、{zipファイル名}_output.txt と {zipファイル名}_output.json の2つのファイルが生成されます。
今後の展望
読み順の精度は、まだ改善の余地が大きいと感じています。今後は、単純な座標ベースの判断だけでなく、画像自体からコマの境界線を検出するような、より高度なレイアウト解析の導入も検討していきたいと考えています。
おわりに
「manga-ocr」は、漫画のテキストをデータとして活用するための第一歩となるツールです。完璧ではありませんが、ページごとのセリフを高い精度で抜き出す、という基本的な機能は十分に実用的かと思います。
ぜひ一度、お手元の漫画で試してみてください!
プロジェクトはGitHubで公開していますので、IssueやPull Request、機能の提案など、どんなフィードバックでも大歓迎です。
最後までお読みいただき、ありがとうございました。
Discussion