当サイトにはアフィリエイト広告が含まれます。なおレビューは私の感想を書いており、内容を指示するご依頼はお断りしています

無料で画像文字起こし:TesseractとYomiTokuを活用したChatGPT連携のための試行錯誤

本記事では、筆者が最近取り組んだ、ゲームのスクリーンショットからテキストを抽出し、それをAI(具体的にはChatGPTのAPI)と連携させる試みについてご紹介いたします。

ChatGPTのAPIは非常に強力ですが、画像を直接送信すると費用がかさむという課題がありました。そこで、無料で画像から文字を抽出し、そのテキストデータのみをAPIに送信するという方法を検討いたしました。本稿では、無料の画像文字起こし(OCR)ツールの検証過程と、最終的に導き出された結論を詳細に解説いたします。

挑戦1:定番の「Tesseract OCR」とPythonでの取り組み

最初に試みたのは、OCR分野で広く利用されているオープンソースの「Tesseract OCR」です。PythonからTesseractを利用するためには、「pytesseract」というライブラリを使用します。

導入における初期の課題

このページを見ながら導入をしてみました。

導入フェーズでは、Tesseract本体のインストールにおいていくつかの課題に直面いたしました。特にWindows環境では、tesseract.exeという実行ファイルのパスをPythonに正しく認識させる必要があり、PATH環境変数の設定、あるいはPythonコード内での直接指定が求められます。

# Tesseract.exeのパスを指定
# 環境に応じてパスを適切に設定してください。
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

この設定が正常に機能した際には、その簡便さに感銘を受けました。

日本語認識精度の向上策

Tesseractは多言語に対応していますが、初期状態における日本語の認識精度には改善の余地がありました。そこで、より高性能な日本語学習済みデータ「tessdata_best/jpn.traineddata」を導入し、精度の向上を図りました。

さらに、画像をOCR処理にかける前段階として、「前処理」を適用しました。具体的には、グレースケール化(画像を白黒に変換)および二値化(文字を黒、背景を白の2色に明確に分離)を実施いたしました。

# 画像を読み込む (RGB形式に変換)
img = Image.open(image_path).convert("RGB")

# グレースケール化
img = img.convert('L')

# 二値化 (thresholdの値がOCR精度に大きく影響します)
threshold = 190 # ← この値は画像の特性に応じて調整が必要です
img = img.point(lambda x: 0 if x < threshold else 255)

# オプションとしてコントラストやシャープネスの調整も試みました
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(2.0)

このthreshold値の調整は、非常に繊細な作業であり、画像の特性に合わせて最適な値を見つけ出す試行錯誤が必要でした。値を誤ると、文字が消失したり、背景のノイズが文字として認識されたりする問題が発生しました。

また、画像内の特定の色(例:ゲーム画面のUI要素やキャラクター名)を白に変換する処理も試みました。これにより、文字認識の妨げとなる要素を排除する効果を狙いました。

# 白に変換したい特定の色 (RGB) と許容範囲を設定
target_rgb_to_convert = (250, 203, 5) # キャラクター名の色に近いRGB値
color_tolerance = 30 # 色の許容範囲。これも調整が重要です。

# ピクセルを走査し、各RGB成分が許容範囲内であれば白に変換
if (abs(cr - tr) <= color_tolerance and
    abs(cg - tg) <= color_tolerance and
    abs(cb - tb) <= color_tolerance):
    pixels[x, y] = (255, 255, 255)

Tesseract利用の所感

TesseractによるOCRは、確かに一定の精度向上を達成しましたが、ゲームのスクリーンショットのような特殊なフォントや複雑な背景を持つ画像においては、依然として完璧な認識には至らないケースが見られました。

ディ オナ

どう し た の ? ぼーっと し て 、 ド リン ク を 飲み た に 容 た ん で し ょ

日本語の認識においては、誤認識が頻繁に発生することが課題でした。文字抽出のためだけに、毎回手動でthreshold値を調整したり、最適な色範囲を探したりする作業は、非常に手間がかかるものでした。より簡易に、かつ高い精度でテキストを抽出できる方法を模索するに至りました。

挑戦2:日本語特化型OCR「YomiToku」への期待

Tesseractとの試行錯誤を経て、筆者は日本語に特化したAI OCRライブラリである「YomiToku」の存在を知りました。その高い日本語処理能力に大きな期待を寄せました。

Python APIでの試練

早速pip install yomitokuコマンドでyomitokuライブラリを導入し、Pythonスクリプトからの連携を試みました。しかし、ここでも予期せぬ課題に直面いたしました。

IndexError: too many indices for array: array is 2-dimensional, but 3 were indexed

このようなエラーが複数回発生し、YomiTokuが期待する画像データ形式(カラーのNumPy配列)と、筆者が提供する画像形式との間に不整合があることが示唆されました。Pillowライブラリを用いた形式変換や、強制的な3次元配列化など、様々な対策を講じましたが、根本的な解決には至りませんでした。

最終的な突破口:コマンドラインツールの活用

PythonスクリプトでのAPI連携が困難であったため、YomiTokuが提供する「コマンドラインツール」の利用に方針を転換いたしました。

この選択が、最終的な解決策となりました。

直近のゲームスクリーンショットからセリフを抽出し、その精度を検証いたしました。

実行コマンド:

yomitoku ./screenshot.png -f md -o ./output --ignore_line_break

出力結果:

なんて、冗談だよ。私が知らないだけで、魚になっても悩みはあるよね。だから今に満足してるの。

この出力結果をご覧ください。驚くべき精度でテキストが抽出されていることが確認できます。 Tesseractでの苦労が嘘のように、非常に正確な文字起こしが実現されました。余分な記号も含まれておらず、--ignore_line_breakオプションにより改行も適切に処理されています。

YomiTokuの性能の高さに、改めて感銘を受けました。

YomiToku利用の所感

  • 日本語認識精度が格段に向上: 「日本語特化」という謳い文句の通り、ゲームのセリフに用いられる特殊なフォントであっても、高い認識精度を発揮します。
  • コマンドラインツールの利便性: Python APIでの連携には課題があったものの、コマンドラインから直接操作することで、画像の前処理などの複雑な考慮なしに高精度な文字起こしを容易に実行できました。
  • Markdown出力の有用性: 抽出されたテキストがMarkdown形式で出力されるため、その後のデータ加工やChatGPT APIへの連携が非常にスムーズに行えます。

唯一の留意点としては、手書き文字や屋外の看板などの情景OCRには最適化されていない点、および個人利用以外での商用利用にはライセンスの確認が必要である点が挙げられます。しかし、筆者の目的(ゲームのセリフ抽出)には最適なソリューションであると判断いたしました。

まとめ:無料OCRソリューションにおけるYomiTokuの優位性

多岐にわたるOCRツールの検証の結果、筆者の目的である「ゲームのスクリーンショットからの高精度な日本語文字起こし」には、YomiTokuのコマンドラインツールが現状における最適な選択肢であるという結論に至りました。Tesseractも利用可能ではありますが、手軽さおよび認識精度の観点から、YomiTokuが優れたパフォーマンスを示しました。

これにより、ゲームのセリフを自動的にテキスト化し、ChatGPTのAPIと連携させるための基盤が確立されました。この成果が、今後のAI活用における新たな可能性を拓くことを期待しております。

本記事が、画像からの文字起こし、特に日本語OCRの精度向上にお悩みの方々にとって、有用な情報となることを願っております。