GASでOCRする方法!Google Cloud Vision APIで画像から文字を抽出しよう

今日の部長から「GASを使ったOCRソリューションを考えろ」って言われたんだけど…。画像の文字を自動で読み取るって、GASでもできるのかな?
猫男
猫男
catman
catman
できるぞ。今回はGoogle Cloud Vision APIを使って、GASから画像の文字を読み取る方法を教えてやろう。

 

GASでOCRを行う方法はいくつかあるが、今回はGoogleドライブのOCR機能ではなく、Google Cloud Vision APIを使う方法を紹介する。

Vision APIを使えば、画像内の文字を検出し、テキストデータとして取得できる。レシート、書類、スクリーンショットなどの文字読み取りにも応用できるぞ。

Google Cloud Vision APIを使う準備

まずは、Google Cloud側でVision APIを使えるようにしておこう。

  • Google Cloud Consoleにアクセスする
  • プロジェクトを作成する
  • Cloud Vision APIを有効化する
  • 認証情報からAPIキーを作成する
  • 作成したAPIキーをGASのコードに設定する

APIキーを使えば、GASからVision APIへリクエストを送ることができる。

画像URLから文字をOCRで抽出するGASコード

まずは、画像URLを指定してOCRするシンプルなコードを見てみよう。

function ocrWithVisionApi() {
  const apiKey = 'YOUR_API_KEY';
  const imageUrl = '画像のURLをここに入力';

  const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;

  const requestBody = {
    requests: [
      {
        image: {
          source: {
            imageUri: imageUrl
          }
        },
        features: [
          {
            type: 'TEXT_DETECTION'
          }
        ],
        imageContext: {
          languageHints: ['ja']
        }
      }
    ]
  };

  const response = UrlFetchApp.fetch(visionUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(requestBody)
  });

  const result = JSON.parse(response.getContentText());

  const text = result.responses[0].fullTextAnnotation.text;

  Logger.log(text);
}

このコードを実行すると、指定した画像URLに含まれる文字がOCRで読み取られ、ログに表示される。

  • apiKey:Google Cloudで取得したAPIキー
  • imageUrl:OCRしたい画像のURL
  • TEXT_DETECTION:画像内の文字を検出する指定
  • languageHints: ['ja']:日本語の文字認識を補助する指定
  • UrlFetchApp.fetch():GASからVision APIへリクエストを送る処理

 

 

実際にこのサイトのロゴ画像のURLを指定して試してみるぞ。

gas ocr

すると、このようなレスポンスを得られるはずだ。

 

gas ocr

 

画像URLを指定するだけで、文字を読み取れるんですね。これはかなり使いやすそうです!
猫男
猫男

 

Googleドライブ内の画像をOCRする方法

次に、Googleドライブに保存してある画像をOCRする方法だ。

Drive内の画像を使う場合は、画像ファイルを取得し、Base64形式に変換してVision APIへ送信する。

function ocrDriveImageWithVisionApi() {
  const apiKey = 'YOUR_API_KEY';
  const fileId = '画像ファイルのID';

  const file = DriveApp.getFileById(fileId);
  const blob = file.getBlob();
  const base64Image = Utilities.base64Encode(blob.getBytes());

  const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;

  const requestBody = {
    requests: [
      {
        image: {
          content: base64Image
        },
        features: [
          {
            type: 'TEXT_DETECTION'
          }
        ],
        imageContext: {
          languageHints: ['ja']
        }
      }
    ]
  };

  const response = UrlFetchApp.fetch(visionUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(requestBody)
  });

  const result = JSON.parse(response.getContentText());

  const text = result.responses[0].fullTextAnnotation.text;

  Logger.log(text);
}

このコードでは、Googleドライブ上の画像ファイルをGASで取得し、Vision APIに送信している。

  • DriveApp.getFileById():Googleドライブ内のファイルを取得する
  • getBlob():ファイルをBlob形式で取得する
  • Utilities.base64Encode():画像データをBase64形式に変換する
  • image.content:Base64化した画像データをVision APIへ送信する
catman
catman
Googleドライブに画像を置いておけば、GASだけでOCR処理までつなげられる。業務自動化ではこの形がかなり使いやすいぞ。

 

試しに、ドライブ上に保存した次の画像をOCRで読み取ってみよう。読み取る画像のファイルIDを指定するだけさ。

gas ocr

すると、こんな感じのレスポンスが得られたぞ。

gas ocr

 

OCR結果から必要な文字だけ取り出す

OCRで取得した文字列は、そのままだと長いテキストとして返ってくる。

たとえばレシート画像から「合計金額」だけを取り出したい場合は、取得したテキストを行ごとに分割し、必要なキーワードを探すといい。

function extractTotalAmountFromReceipt() {
  const text = getOcrTextFromDriveImage();

  const lines = text.split('\n');

  for (let i = 0; i < lines.length; i++) {
    const line = lines[i];

    if (line.includes('合計')) {
      Logger.log(line);
      return line;
    }
  }

  Logger.log('合計金額が見つかりませんでした');
}

このコードでは、OCR結果を改行ごとに分割し、「合計」という文字を含む行を探している。

  • split('\n'):OCR結果を行ごとに分ける
  • includes('合計'):「合計」という文字が含まれているか確認する
  • return line:見つかった行を返す

OCR処理を関数として分ける

何度もOCR処理を使う場合は、OCR部分を関数として分けておくと便利だ。

function getOcrTextFromDriveImage() {
  const apiKey = 'YOUR_API_KEY';
  const fileId = '画像ファイルのID';

  const file = DriveApp.getFileById(fileId);
  const blob = file.getBlob();
  const base64Image = Utilities.base64Encode(blob.getBytes());

  const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;

  const requestBody = {
    requests: [
      {
        image: {
          content: base64Image
        },
        features: [
          {
            type: 'TEXT_DETECTION'
          }
        ],
        imageContext: {
          languageHints: ['ja']
        }
      }
    ]
  };

  const response = UrlFetchApp.fetch(visionUrl, {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(requestBody)
  });

  const result = JSON.parse(response.getContentText());

  if (!result.responses[0].fullTextAnnotation) {
    return '';
  }

  return result.responses[0].fullTextAnnotation.text;
}

このように関数化しておけば、レシート処理、書類処理、画像内テキストの検索など、いろいろな処理から再利用できる。

なるほど。OCRする関数を作っておけば、あとから合計金額を探したり、特定の文字をチェックしたりできるんですね。
猫男
猫男

GASでOCRを使うときの注意点

Google Cloud Vision APIを使う場合、いくつか注意点がある。

  • Google Cloud側でVision APIを有効化する必要がある
  • APIキーの管理に注意する
  • 利用量によっては料金が発生する場合がある
  • 画像がぼやけていると認識精度が下がる
  • 文字が小さすぎる画像や斜めになっている画像は読み取りにくい

特にAPIキーをコードに直接書く場合は、外部に公開しないように注意しよう。

まとめ

今回は、GASからGoogle Cloud Vision APIを呼び出して、画像から文字を抽出する方法を紹介した。

GoogleドライブのOCR機能を使う方法もあるが、Vision APIを使うと、API連携としてOCR処理を組み込みやすくなる。

レシート画像、書類画像、スクリーンショットなどから文字を取得したい場合は、GASとGoogle Cloud Vision APIを組み合わせることで、自動化の幅が大きく広がるぞ。

EARTHPG 自動化研究所

「その作業、仕組みにできます。」

Google Apps Script、Python、スプレッドシート自動化、WordPress開発、 API連携、AI活用まで対応。 小さな自動化から業務全体の設計まで、研究所が支援します。