GPT-4oにGASでOCRをさせよう その2 - 画像をURL公開しないで直接APIに渡す
以前、画像からの解析性能が大幅にアップしたGPT-4oを使ったレシートOCR機能を紹介しました。
しかし、APIに渡すレシート等の画像ファイルを公開URLで渡すのはセキュリティ的に心配…という声もあり、APIに直接ファイルを送信する方式に今回は挑戦します。
BASE64エンコードしたURLを渡す
APIを使ったプログラミングをする際には、まずは公式リファレンスを見るのが基本です…と前回も実装スタートしましたが、OpenAIはリファレンスでなくドキュメントのモデルの紹介にも重要な情報が書かれていました…
https://platform.openai.com/docs/guides/vision/uploading-base-64-encoded-images
ドキュメントの書き方はサービスによって違うので、このあたりは悩ましいですね。
リンク先のドキュメントに書かれているのは、公開画像のURLではなく、画像ファイルをBASE64エンコードした文字列を含むURLを渡しても解析できるよ!ということでした。
// BASE64エンコードした画像ファイルを解析させる場合の指定形式
"data:image/jpeg;base64,BASE64エンコードした文字列"
BASE64エンコードとは
BASE64エンコードは、コンピュータが理解できるバイナリデータ(画像ファイルなど)を、テキスト形式に変換する方法です。
これによって、画像ファイルを公開することなく、直接OpenAIのAPIに送信することができます。
公開URLを使わずにデータを送れるため、当然ながらより安全にファイルを送信することができます。
今回用意した関数
ということで、「画像を公開しないで直接APIに渡す」方式で、GPT-4oにGASでOCRをさせるために今回以下の3つの関数を用意しました。
isImageFile_ - ファイルIDを受け取り、ファイルが画像かどうかを判定する関数
getFileMimeType_ - ファイルIDを受け取り、ファイルのMIMEタイプを返す関数
getBase64EncodedStr - ファイルIDを受け取り、Base64エンコードした文字列を返す関数
ファイルが画像かどうかを判定するisImageFile_関数
isImageFile_関数は文字通り指定されてGoogleドライブのファイルが画像ファイルかを判定する関数です。
gpt-4oモデルは、現在のところjpeg,png,gif,webpの画像のみに対応しているとのことですが、テストしてみたところwebp画像はうまく解析してくれなかったので、jpeg, png, gif に限定しました。
そして、残念ながら API経由ではpdf形式のファイルの解析は未対応となっています。むー残念。
ファイルIDを受け取り、ファイルのMIMEタイプを返すgetFileMimeType_関数
MIMEタイプ?ってなんぞや?となりますが、これはインターネット上で送受信されるファイルの種類を示すための標準的な方法らしいです。
image/jpeg
image/png
audio/mpeg
のような形式で表されます。
OpenAIのAPIに画像をアップロードするためにもこのMIMEタイプが必要になるので、取得するための関数を用意しました。
ファイルIDを受け取り、Base64エンコードした文字列を返すgetBase64EncodedStr関数
最後に画像ファイルをBase64エンコードする関数を用意して役者は揃いました。
注意と免責事項
スクリプトはテスト環境で動作テスト済ですが、ユーザー個々の環境で動作しない場合があります。
またGoogle Apps Script(以降GAS)はじめ、各種APIやサービスの仕様変更によって動作しなくなる場合があります。
一部のスクリプトでOpenAIのChat API(Chat GPTに相当)を利用しています。そのため、出力結果が必ずしも期待している内容にならない場合があります。
以上を踏まえ、本記事はコードの共有のみを目的としており、動作保証やサポートは必ずしもお約束しません。
賞味期限(管理人によるバグ修正や仕様変更に伴うアップデート対応期限)は本記事公開後3ヶ月とします。ただし、利用しているAPI等の大幅アップデート(破壊的変更)があった場合はこの限りではありません。
また、このスクリプトの使用から生じるいかなる結果に対しても責任を負いかねますので、ご自身のテスト環境で十分にテストを重ねた上で、使用者の自己責任にてのみご使用ください。
事前準備
今回の記事ではOpenAIのAPIを利用します。またgpt-4oモデルを使用するため、基本的に課金前提となります。リクエストで送信するトークン数に応じて費用がかかりますので、ご注意ください。
また以前の記事で紹介したOpenAIのChat APIを使用して画像入力を送信し、応答を取得する関数や与えられたテキストからJSON文字列を抜粋して出力する関数などもそのまま使用します。こちらも再度復習をお願いします。
OpenAIに直接レシート画像を送信し、解析させてJSON形式で出力する関数
ということで、早速実行結果を確認してみましょう。サンプルはいつものごとく、私の日常的な支出のレシートです。
本題とはズレますが、Drive APIのOCRからの解析りも精度が良い気がしています。
ということで実装したスクリプトの紹介です!
この記事が気に入ったらチップで応援してみませんか?