ChatGPTを使って、日本語のスクショをテキスト形式に変換してもらうことを目標にコーディングしていきます。
尚、ChatGPTに書いてもらうため、コーディングについてはPythonの知識も、何ならコーディングの知識もあまり必要ではありません。
GoogleColabの使い方等を途中長々書いていますが、既にご存じの方は読み飛ばしてください。
もくじの「コード」に全量のせてありますので、それをコピーすればそのまま使えます。
あと、おまけはChatGPTとのやりとりです。参考として載せておきます。
目的
電子書籍を読んでいて「いいね!」と思ってスクショしたものが、ひたすら写真ライブラリにたまっています。
iPhoneの標準写真アプリには、画像からテキストを読み取る機能が実装されていますが、日本語の精度はあまり良くなく、特に縦書きについては不可能です。
他の外部サービスを活用するという方法もありますが、折角なので、自分で使いやすいようにカスタマイズしながらコーディング、実装していこうと思います。
実行環境とコード
コーディングと実行にあたっては、Googleが提供している「GoogleColab」を利用します。無料でサクッと利用できるのでオススメです。
大規模な機械学習等には有料版を契約することをオススメしますが、今のところ簡単なPythonコードを動かすだけなら、無料版でも大丈夫です。
使い方
先ずは自分のGoogledriveから以下のようにノートを作成します。
自分は以下のパスで作成して作業しています。
「マイドライブ\Colab Notebooks」
作成すると、以下のようなノートが開きます。
この「▷(さんかく)」の右の黒い枠の中に、コードを書いていきます。
コードを入力して実行すると、右側のRAM、ディスクと書かれたところで何やら動きがあります。
これが動くことで、RAMや適宜GPUやディスクが使えるようになる、つまり動かせるようになります。
接続したものは「セッション」で管理されており、使用時間(や要求する性能)に応じてコンピューティングユニットが消費されていきます。
分かりにくいですが、上記の画像で言えば、1時間当たり0.08消費されます。
高価なGPUを割り当てると、このコンピューティングユニットの消費量は増加します。
なので、使っていないのに放置していると、無駄にコンピューティングユニットが消費されますので、すぐに切ってしまうことをオススメします。
ただし、環境構築に時間がかかる場合は、あえて繋げておくのも手ですね。
セッションを切断する度に、構築したものは消えます。また最初からです。
更に注意で、有料版でも24時間、無料版だと12時間でセッションは切れます。
なので、作ったもの等がある場合は、これもこまめにGoogledriveに退避するか、zipにしてダウンロードしないと危ないです。
自分はこれで何回かいろいろ無駄にして、闇に消えました。
上記の画像のように、ChatGPTに出力してもらったコードを入力します。
以下の画像はChatGPT側の画面ですが、この赤く囲ったところをクリックするとコピーされます。
それを、GoogleColabの先ほどの「▷(さんかく)」の横に、ctrl+vで貼り付けます。
コメントはあった方が後々見やすいので、適当に#から始まる日本語を入れています。
先頭ですし、入れなくてもよいですが、途中途中は長くなると見辛くなるのであったほうが良いです。
これで、「▷(さんかく)」を押すとコードが実行されます。
緑色のチェックがつくのと、下に実行秒数が表示されます。
エラーがあると以下のようになります。
!マークが表示されるのと、理由がその下部のログに出力されます。
このエラーについても、ChatGPTに聞けば大体解決できるので大丈夫です。
聞くときは、「先ほど示されたコードを実行した際に次のようなエラーが表示されましたが、どうすればよいでしょうか。「~ここにログ~」」のように適当で大丈夫です。
コード
作ってもらったコードは以下です。2つに分割していますが、
先ずは1つめでTesseractと日本語の言語データをインストールします。
TesseractはGoogleが開発したオープンソースのOCRエンジンです。多言語対応しているという特徴があります。
2つめで処理を実行していきます。
中身としては、GoogleDriveの任意のフォルダにアクセスして、その中身を一律OCR処理していくものです。
!apt install -y libtesseract-dev libleptonica-dev liblept5
!apt install -y libtesseract-dev tesseract-ocr tesseract-ocr-jpn tesseract-ocr-jpn-vert
!pip install pytesseract
import pytesseract
from PIL import Image
import os
from google.colab import drive
drive.mount('/content/drive')
lang_mode = 'horizontal'
tesseract_lang = 'jpn' if lang_mode == 'horizontal' else 'jpn_vert'
folder_path = '/content/drive/MyDrive/your_folder'
for filename in os.listdir(folder_path):
if filename.endswith('.png') or filename.endswith('.jpg'):
img_path = os.path.join(folder_path, filename)
img = Image.open(img_path)
text = pytesseract.image_to_string(img, lang=tesseract_lang)
text_without_spaces = text.replace(' ', '')
print(f"OCR result for {filename}:\n{text_without_spaces}\n")
# Google Driveをマウントします
では、以下のようなダイアログが初回出ます。接続を押して自分のアカウントで入ると、処理が続行されます。1度許可すると、このセッション中は二度と要求されません。
#言語モードを設定します ('horizontal' or 'vertical')
で、縦書きか横書きかを選択します。
#Google Drive内のフォルダにあるすべての画像ファイルに対してOCR処理を行います
のファイルパスですが、自分で好きなフォルダに変えるとよいです。
MyDriveまでは固定なので、その次の名前から変更します。
今回は「OCR」というフォルダを作ってその中に入れています。
その下には、「スペースを除去します」と書いてありますが、縦書きの場合変なスペースが単語の合間合間に入ってしまう問題があったため、簡易的にそういう書き方を追加しています。
この辺については、ステップバイステップで指示を言葉で伝えながらコーディングできるので、大変便利で素晴らしいです。
実装されるものは、必ずしも適切なものでは無いですが、そうであれば都度都度また指示を与えればいくらでも書き換えてくれるのでめちゃくちゃ良いです。
実際の人間にやらせると、レビュー→修正→レビュー2……と無駄に時間がかかると思います。そういうのがなくなるので時短になりますね。
(そうなってくると、要件定義や基本設計の精度の向上が求められますね)
実行結果
話を戻しまして、実行結果が以下になります。
完璧ではないですが、なかなか良い結果だと思います。
これが格納された画像枚数分だけ出力してくれます。
読み込ませた画像が以下です。
青空文庫から取得して、Kindleで開いて、iPhoneでスクショしたものです。
精度については、ふりがなが悪さしている気がします。
後は、本を読み終えるまで、も悪さしていますね。
再度別の本で試してみます。
今度はリサイズ(本文だけになるように)と、ふりがな無しです。
更に精度が上がった気がします。
完璧ではないですが、事前に読み込ませる画像をある程度シンプルにしてあげると、かなり使えそうですね。
1点注意点として、iPhoneでそのままリサイズをかけた場合、Googledriveアプリのアップロードボタンからアップロードしないと、拡張子が「.jpeg」になります。+ボタンのアップロードから行うと「.png」になるので、そのまま使えます。ここだけ注意ですね。
(写真アプリ中で画像を長押しし、ホールドした状態でGoogledriveを起動し、そこではなしてもアップロードできますが、そうすると拡張子が.jpegになって処理されなくなる、ということです。)
まとめ
コーディングがこうも手軽にできると良いですね。
出力結果も単にテキストでログに出されるだけなので、例えば.txtにして終了後にダウンロードするようにしたり等、工夫の余地はありそうですね。
おまけ
ChatGPTとのやりとりです。あまりに長いので一部抜粋です。
中略