👁️

OpenAIのGPT-4oを日本語OCRとして使ってみる

2024/05/14に公開

昨日、OpenAIが生成AIの新しいモデルであるGPT-4oを発表しました。消費するトークン数の節約や、音声合成機能の改善、応答速度の向上など着実な品質改善を見せているようです。私も、特に音声合成(Text To Speech)の表現力について非常に興味を持っています。

私は以前、「OpenAIのGPT-4 Turbo with visionを日本語OCRとして使ってみる」で、GPT-4 Turboの画像認識機能の日本語OCRについて検証を行いました。その当時は、既存のコグニティブAI APIに比べて認識精度が十分でないという評価をしています。とはいえ、その後に出てきたClaude 3 Opusは驚くべき認識精度だったので、OpenAIも巻き返す可能性は十分にあると感じました。Azure OpenAI Serviceを使っている場合は、Vision enhancementという既存のコグニティブAIと連携する機能を使う方法もありそうですが、素のOpenAI APIでも性能が改善することは悪い話ではありません。今回のGPT-4oでは画像認識精度も向上してそうですので、これまでと同様の方法で検証を行ってみました。

GPT-4o OCR機能の利用

OpenAIのAPI Keyを準備します。API Keyを取得されていない方は、「OpenAI API Key取得」で検索してください。

今回の検証コードは、OpenAI API Document: VisionのQuick StartのNode.js(node)版を活用します。前回のエントリーのコードがNode.jsだったので、今回もNode.jsにしましたが、Pythonでも大差はないと思います。

Node.jsとnpmはインストール済みの前提です。npmでopenaiパッケージをインストールしてください。

$ npm install openai

OpenAIのAPI Keyを環境変数OPENAI_API_KEYに設定します。以下はMacのターミナルでの実行例です。値はダミーです。

$ export OPENAI_API_KEY='sk-Y9z2x8j7w6e5t4r3u2i1o0pQ6y5t8z2u9v1w4x7r3e0a5t4r'

サンプルコードではmax_tokensの指定が300でしたが、前回同様に1024に設定しました。また、純粋に抽出した文字だけ出力して欲しいので、systemメッセージとして、「あなたはOCRマシンで、抽出した文字以外は回答できません」という指示を追加しておきます。画像ファイルはurlの値としてリンクとして渡します。detailパラメータはデフォルトではautoということだったので指定はしません。

index.js
import OpenAI from "openai";

const openai = new OpenAI();

async function main() {
  const response = await openai.chat.completions.create({
    model: "gpt-4o",
    max_tokens: 1024,
    messages: [
      {
        role: "system",
        content: "You are an Optical Character Recognition (OCR) machine. You will extract all the characters from the image file in the URL provided by the user, and you will only privide the extracted text in your response. As an OCR machine, You can only respond with the extracted text."
      },
      {
        role: "user",
        content: [
          { type: "text", text: "Please extract all characters within the image. Return the only extacted characters." },
          {
            type: "image_url",
            image_url: {
              "url": "https://sample.com/images/01.jpg"
            },
          },
        ],
      },
    ],
  });
  console.log(response.choices[0].message.content);
}
main();

準備が出来たら、node index.jsでスクリプトを実行します。過去と同様に最初はテストとして、こちらの画像を文字認識させてみます。

$ node index.js
一行目おはようございます
二行目こんにちは
三行目こんばんは

文字認識結果が返ってくることが確認できました。GPT-4 Turboではこの時点で間違っていたのですが、期待ができそうです。

文字認識テストと文字認識率の測定

以前のエントリーと同様に、オスカー・ワイルド原作、結城浩翻訳の『わがままな大男』の冒頭部分の文章を使い、游ゴシック、メイリオ、MS P明朝、あんずもじ2020の4種類のフォントを使った画像(以前のエントリーと全く同じ画像)を使用します。改行や半角スペースは除去した上で、文字認識率も同じ計算式((正答の文字数 - 正答と文字認識結果のレーベンシュタイン距離 ) / 正答の文字数)で計算しました。

結果は下記表のとおりです。前回(GTP-4 Turbo)との比較も付けておきます。また、このエントリーの最後に実際に出力された文字列もつけておきます。

フォント 画像 文字認識率(GPT-4o) 文字認識率(GPT-4 Turbo)
游ゴシック 画像 99.5%(380/382) 93.7% (358/382)
メイリオ 画像 98.7%(377/382) 78.8% (301/382)
MS P明朝 画像 98.4%(376/382) 81.2% (310/382)
あんずもじ2020 画像 98.7%(377/382) 50.8% (194/382)

認識精度は前回に比べて劇的に改善しました。今回のサンプルの範囲では、Claude 3 Opusと比べても遜色がないレベルで文字認識をしてくれています。結果を目視する限りは、「たいそう甘い歌声を〜」という部分の「たいそう」部分があまり得意ではないのか4件中3件で認識に失敗していました。「甘い」というその後に続く部分に引きずられている感じの認識結果なので、単純に文字認識しているだけでなく、自然言語的に前後関係で多少の補正を内部的にしているのかもしれません(それはそれで人間的な脳の使い方に近い気もします)。

以上のようにGPT-4oはGPT-4 Turboと比べても劇的な音声文字認識精度の改善を見せてくれました。以前のエントリーでも書いたことですが、クラウド型のAPIというのは、継続的な品質改善がされていくことが一時的な性能の優劣以上に重要なことだと個人的には思っています。OpenAIが自分たちが提供している生成AI APIの機能を着実に改善していることが裏付けられた今回の検証結果は、OpenAIのAPIを使っているユーザーにとっては一つの安心材料になると思います。

出力結果
游ゴシック
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の織

細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたいそう甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。 「ここで遊ぶのはなんて

楽しいんだろう!」と、くちぐちに声をあげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間いっしょに過ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなっ

てきたので、自分の城に帰ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。
メイリオ
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。
そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美
しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の織
細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上で甘いそう甘い
歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて
楽しいんだろう!」と、くちぐちに声をあげました。
ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間
いっしょに過ごしていました。7年が過ぎ、話したいことは全部話ししたし、もう話題もなくなっ
てきたので、自分の城に帰ろうと思ったのでした。大男が戻ると、子どもたちが庭で遊んでいる
のが見えました。
MS P明朝
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美しい花が立っておりました。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれるように咲き、秋には豊かな果実が実ります。鳥たちは木々の上でたく甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きいるのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちに声を

あげました。

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで7年間いっしょに過ごしていました。7年が過ぎ、話したいことは全部話したし、もう話題もなくなってきたので、自分の城に帰ろうと思ったのてした。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。
あんずもじ2020
わがままな大男

子どもたちは毎日、午後になって学校から帰ってくると、大男の庭に行って遊ぶのが常でした。 

そこは、柔らかい緑の草が生えた、広くて素敵な庭でした。草むらのあちこちには、星に似た美しい花が立っておりま した。その庭には十二本の桃の木があり、春になると薄桃色と真珠色の繊細な花があふれるように咲き、秋には 豊かな果実が実ります。鳥たちは木々の上で甘いそうな甘い歌声を響かせるので、子どもたちは遊ぶのをやめて聞きい るのでした。「ここで遊ぶのはなんて楽しいんだろう!」と、くちぐちに声をあげました。 

ある日、大男が帰ってきました。彼はコーンウォールに住む鬼の友人を訪問し、そこで七年間いっしょに過ごしていま した。7年が過ぎ、話しtいことは全部話したし、もう話題もなくなってきたので、自分の城に帰ろうと思ったので した。大男が戻ると、子どもたちが庭で遊んでいるのが見えました。

Discussion