🔥
Gemini APIで画像解析を試す(TypeScriptサンプル付き)
はじめに
この記事では、Geminiモデルに画像を投稿して解析する方法をTypeScriptで解説します。プロジェクトの構築には軽量で高速なJavaScriptランタイムであるBunを使用しています。また、ローカル画像ファイルの読み込み、Google Generative AIを利用した画像解析、そして料金体系についても説明します。
必要な準備
以下の手順を事前に行ってください。
- プロジェクトの作成:
bun create ts
cd ts
- 依存関係のインストール:
bun add @google/generative-ai
bun add dotenv
- 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文字 |
まとめ
この記事では、Bunを使用してGeminiモデルに画像を投稿し、解析する方法を詳しく解説しました。高速な開発環境を活用しながら、画像を使った高度な解析を簡単に試すことができます。ぜひお試しください!
Discussion