🔥

Gemini APIで画像解析を試す(TypeScriptサンプル付き)

2024/12/29に公開

はじめに

この記事では、Geminiモデルに画像を投稿して解析する方法をTypeScriptで解説します。プロジェクトの構築には軽量で高速なJavaScriptランタイムであるBunを使用しています。また、ローカル画像ファイルの読み込み、Google Generative AIを利用した画像解析、そして料金体系についても説明します。

必要な準備

以下の手順を事前に行ってください。

  1. プロジェクトの作成:
bun create ts
cd ts
  1. 依存関係のインストール:
bun add @google/generative-ai
bun add dotenv
  1. Google CloudのAPIキー設定: 環境変数 GCP_API_KEY にAPIキーを設定してください。.env ファイルに以下を記載します。
.env
GCP_API_KEY=your-google-cloud-api-key

Gemini に画像を送信して解析するコード例

import { GoogleGenerativeAI } from "@google/generative-ai";
import 'dotenv/config';
import * as fs from "node:fs/promises";
import * as path from "node:path";

// 環境変数からAPIキーを取得し、検証する関数
function getApiKey(): string {
  const apiKey = process.env.GCP_API_KEY;
  if (!apiKey) {
    console.error("GCP_API_KEY 環境変数が設定されていません。");
    process.exit(1);
  }
  return apiKey;
}

// ローカルの画像ファイルを読み込み、Base64エンコードする関数
async function readImageFile(filePath: string): Promise<{ data: string; mimeType: string }> {
  try {
    const fileBuffer = await fs.readFile(filePath);
    const base64Data = fileBuffer.toString("base64");
    const mimeType = getMimeType(filePath); // ファイルの拡張子からMIMEタイプを取得
    return { data: base64Data, mimeType };
  } catch (error) {
    console.error(`画像ファイルの読み込みに失敗しました: ${filePath}`, error);
    throw error;
  }
}

// ファイルの拡張子からMIMEタイプを取得する関数
function getMimeType(filePath: string): string {
  const ext = path.extname(filePath).toLowerCase();
  switch (ext) {
    case ".jpg":
    case ".jpeg":
      return "image/jpeg";
    case ".png":
      return "image/png";
    case ".gif":
      return "image/gif";
    case ".webp":
      return "image/webp";
    default:
      throw new Error(`サポートされていないファイル形式です: ${ext}`);
  }
}

// Geminiモデルを初期化する関数
function initializeGeminiModel(apiKey: string) {
  const genAI = new GoogleGenerativeAI(apiKey);
  return genAI.getGenerativeModel({ model: "gemini-1.5-flash-latest" });
}

// 画像を分析する関数
async function analyzeImage(imagePath: string) {
  const apiKey = getApiKey();
  try {
    const model = initializeGeminiModel(apiKey);
    const { data: base64Image, mimeType } = await readImageFile(imagePath);

    const prompt = "この画像に書かれている文章を教えて下さい。";
    const imagePart = {
      inlineData: {
        data: base64Image,
        mimeType: mimeType,
      },
    };

    const result = await model.generateContent([prompt, imagePart]);
    const response = await result.response;
    console.log(response.text());
  } catch (error) {
    console.error(`画像の分析中にエラーが発生しました: ${imagePath}`, error);
  }
}

// 実行例
const imagePath = path.resolve("./sentence.png"); // ローカルの画像ファイルパスを指定
analyzeImage(imagePath);

Bunでの実行方法

以下のコマンドを実行してスクリプトを実行します。

bun run index.ts

送信した画像
カツ丼は人を幸せにする

結果:

**上部(画像広告)**

#カツ丼は人を幸せにする 日本橋本店

人を幸せにする
#とじないカツ丼

LINE会員限定
配信クーポン


配信限定 海老フライ一本プレゼント!

LINE会員様限定でクーポンをプレゼントいたします🎁
またのお越しを心よりお待ちしております。

有効期間:2024年12月28日~2025年1月27日

午前 11:50


**下部(チャットメッセージ)**

先日は、ご来店有難う御座いました。

次回、ご来店時のサービスクーポンをプレゼント致します。

海老フライ一本プレゼント。

またのご来店をスタッフ一同、心よりお待ち致しております。

KATSUDON makes people HAPPY

お客様は次回来店でシルバーランクになります。
シルバーランクになるとソフトドリンク一杯無料クーポンプレゼント

午前 11:50

Gemini で画像を解析する料金

モデル 入力料金 (128Kトークン以下) 入力料金 (128Kトークン以上) 出力料金 (128Kトークン以下) 出力料金 (128Kトークン以上)
Gemini 1.5 Flash $0.00002 / 画像 $0.00004 / 画像 $0.000075 / 1,000文字 $0.00015 / 1,000文字
Gemini 1.5 Pro $0.00032875 / 画像 $0.0006575 / 画像 $0.00125 / 1,000文字 $0.0025 / 1,000文字

Vertex AI の料金

まとめ

この記事では、Bunを使用してGeminiモデルに画像を投稿し、解析する方法を詳しく解説しました。高速な開発環境を活用しながら、画像を使った高度な解析を簡単に試すことができます。ぜひお試しください!

Vertex AI API for Gemini にリクエストを送信する

Discussion