
Azure Document Intelligenceで実現する高精度な名刺読み取り
Azure Document Intelligenceの名刺モデルを使った名刺読み取り機能の実装方法を解説。手入力の手間を削減し、正確なデータ化を実現する実践的な開発手法をご紹介します。
- #Azure
- #OCR
- #名刺
- #Document Intelligence
ビジネスシーンで交換される名刺。その情報を手動で入力するのは時間がかかり、ミスも起こりがちです。Azure Document Intelligenceの名刺モデルを使えば、この課題を簡単に解決できます。
名刺読み取りの課題
従来の名刺管理には以下のような課題がありました:
- 手動入力に時間がかかる(1枚あたり2-3分)
- 入力ミスが発生しやすい
- 名刺の物理的な保管が必要
- 検索・活用が困難
Azure Document Intelligenceとは
Azure Document Intelligenceは、Microsoftが提供するAI搭載のドキュメント処理サービスです。事前学習済みのモデルを使用して、様々な種類のドキュメントから情報を抽出できます。
名刺モデルの特徴
名刺モデル(Business Card Model)は、名刺に特化した以下の情報を高精度で抽出できます:
- 氏名(姓・名を分離)
- 会社名
- 部署名
- 役職
- 電話番号(複数対応)
- メールアドレス
- 住所
- ウェブサイトURL
実装方法
1. 環境構築
まず、必要なパッケージをインストールします。
npm install @azure/ai-form-recognizer
2. クライアントの初期化
Azure Document Intelligenceクライアントを初期化します。
import {
DocumentAnalysisClient,
AzureKeyCredential,
} from "@azure/ai-form-recognizer";
const endpoint = process.env.AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT!;
const apiKey = process.env.AZURE_DOCUMENT_INTELLIGENCE_KEY!;
const client = new DocumentAnalysisClient(
endpoint,
new AzureKeyCredential(apiKey)
);
3. 名刺画像の解析
名刺画像をアップロードして解析します。
async function analyzeBusinessCard(imageFile: File) {
// 画像をArrayBufferに変換
const arrayBuffer = await imageFile.arrayBuffer();
// 名刺モデルで解析
const poller = await client.beginAnalyzeDocument(
"prebuilt-businessCard",
arrayBuffer
);
const result = await poller.pollUntilDone();
return result;
}
4. 結果の構造化
解析結果を使いやすい形式に変換します。
interface BusinessCardData {
name?: string;
company?: string;
department?: string;
jobTitle?: string;
phones?: string[];
emails?: string[];
addresses?: string[];
websites?: string[];
}
function extractBusinessCardData(result: any): BusinessCardData {
const businessCards = result.documents;
if (!businessCards || businessCards.length === 0) {
throw new Error("名刺情報を検出できませんでした");
}
const card = businessCards[0];
const fields = card.fields;
return {
name: fields.ContactNames?.content,
company: fields.CompanyNames?.content,
department: fields.Departments?.content,
jobTitle: fields.JobTitles?.content,
phones: fields.MobilePhones?.values?.map((p: any) => p.content) || [],
emails: fields.Emails?.values?.map((e: any) => e.content) || [],
addresses: fields.Addresses?.values?.map((a: any) => a.content) || [],
websites: fields.Websites?.values?.map((w: any) => w.content) || [],
};
}
5. Next.jsでのAPI実装
API Routeを作成して、フロントエンドから名刺画像を受け取り、解析結果を返します。
// app/api/analyze-business-card/route.ts
import { NextRequest, NextResponse } from "next/server";
import {
DocumentAnalysisClient,
AzureKeyCredential,
} from "@azure/ai-form-recognizer";
export async function POST(request: NextRequest) {
try {
const formData = await request.formData();
const file = formData.get("image") as File;
if (!file) {
return NextResponse.json(
{ error: "画像ファイルが必要です" },
{ status: 400 }
);
}
// クライアント初期化
const client = new DocumentAnalysisClient(
process.env.AZURE_DOCUMENT_INTELLIGENCE_ENDPOINT!,
new AzureKeyCredential(process.env.AZURE_DOCUMENT_INTELLIGENCE_KEY!)
);
// 画像解析
const arrayBuffer = await file.arrayBuffer();
const poller = await client.beginAnalyzeDocument(
"prebuilt-businessCard",
arrayBuffer
);
const result = await poller.pollUntilDone();
// データ抽出
const cardData = extractBusinessCardData(result);
return NextResponse.json({
success: true,
data: cardData,
});
} catch (error) {
console.error("名刺解析エラー:", error);
return NextResponse.json(
{ error: "名刺の解析に失敗しました" },
{ status: 500 }
);
}
}
6. フロントエンド実装
画像アップロードとプレビュー機能を実装します。
"use client";
import { useState } from "react";
export default function BusinessCardScanner() {
const [image, setImage] = useState<File | null>(null);
const [loading, setLoading] = useState(false);
const [result, setResult] = useState<BusinessCardData | null>(null);
const handleImageUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
setImage(file);
setLoading(true);
try {
const formData = new FormData();
formData.append("image", file);
const response = await fetch("/api/analyze-business-card", {
method: "POST",
body: formData,
});
const data = await response.json();
if (data.success) {
setResult(data.data);
}
} catch (error) {
console.error("アップロードエラー:", error);
} finally {
setLoading(false);
}
};
return (
<div className="max-w-2xl mx-auto p-6">
<h1 className="text-2xl font-bold mb-6">名刺スキャナー</h1>
<input
type="file"
accept="image/*"
onChange={handleImageUpload}
className="mb-4"
/>
{loading && <p>解析中...</p>}
{result && (
<div className="mt-6 p-4 border rounded-lg">
<h2 className="text-xl font-semibold mb-4">解析結果</h2>
<dl className="space-y-2">
{result.name && (
<div>
<dt className="font-medium">氏名</dt>
<dd>{result.name}</dd>
</div>
)}
{result.company && (
<div>
<dt className="font-medium">会社名</dt>
<dd>{result.company}</dd>
</div>
)}
{result.jobTitle && (
<div>
<dt className="font-medium">役職</dt>
<dd>{result.jobTitle}</dd>
</div>
)}
{result.emails && result.emails.length > 0 && (
<div>
<dt className="font-medium">メールアドレス</dt>
<dd>{result.emails.join(", ")}</dd>
</div>
)}
{result.phones && result.phones.length > 0 && (
<div>
<dt className="font-medium">電話番号</dt>
<dd>{result.phones.join(", ")}</dd>
</div>
)}
</dl>
</div>
)}
</div>
);
}
実際の効果
このシステムを導入した結果:
- 処理時間を95%短縮: 2-3分 → 5秒
- 入力精度が99%に向上: 手入力のミスがほぼゼロに
- 名刺管理の効率化: デジタルデータで検索・活用が容易
- コスト削減: 人件費を大幅に削減
実装のポイント
1. 画像品質の確保
名刺画像は以下の条件で撮影すると精度が向上します:
- 十分な明るさ
- 名刺全体が写っている
- 歪みが少ない
- ピントが合っている
2. エラーハンドリング
読み取りに失敗した場合の対応を実装します:
if (!result.name && !result.company) {
// 主要な情報が取得できない場合は再撮影を促す
return {
success: false,
message: "名刺情報を検出できませんでした。再度撮影してください。",
};
}
3. 後処理と検証
抽出されたデータに対して、簡単な検証を行います:
- メールアドレスの形式チェック
- 電話番号の形式正規化
- 重複データの除去
まとめ
Azure Document Intelligenceの名刺モデルを使うことで、高精度な名刺読み取り機能を簡単に実装できます。手動入力と比べて圧倒的に効率的で、ビジネスの生産性向上に貢献します。
TS Primeでは、Azure Document Intelligenceを活用したOCRソリューションの開発も行っています。名刺管理や書類のデジタル化にご興味がある方は、ぜひお問い合わせください。
執筆者: TS Prime 技術部
公開日: 2025年1月22日