SECTION 1
概要
保険代理店の面談録音から、意向確認に必要な説明義務の充足状況を自動判定し、意向確認シートを生成するスタンドアロンアプリケーション。
- 機能: 録音データ → 文字起こし → 意向確認チェック → シート生成(単一機能に集中)
- 技術制約: AI APIを一切使わない。文字起こし含め完全ローカル完結
- インフラ: JIB社内 Mac mini 1台で完結。外部通信なし
- 横展開: 他の保険代理店への販売を前提とした汎用設計
設計方針
既存JIB MVPコードベース(16帳票・38エンドポイント)とは完全に独立した新規アプリとして開発。1機能に絞り、コードベースも1機能分に留める。
SECTION 2
システムアーキテクチャ
2.1 処理パイプライン
録音ファイルアップロード
営業マンがブラウザから録音ファイル(.m4a, .wav, .mp3)をアップロード
ローカル文字起こし(mlx-whisper)
Apple Silicon最適化のWhisperモデルでタイムスタンプ付き文字起こし
ルールエンジンによる自動チェック
rules.yaml のチェック項目をキーワード/パターンマッチで判定。該当セグメントを自動引用
営業マンによる確認・補足
チェック結果のメモ追記、判定の手動上書き
意向確認シート Excel 生成
openpyxlでJIBのテンプレートに結果を流し込み、.xlsx をダウンロード
2.2 技術スタック
| レイヤー | 技術 | 選定理由 |
|---|---|---|
| 言語 | Python 3.12+ | Whisperエコシステムとの親和性 |
| 文字起こし | mlx-whisper | Apple Silicon最適化。Mac上で最速 |
| Webサーバー | FastAPI | 非同期処理(文字起こし待ち)に強い。軽量 |
| フロントエンド | HTML + Vanilla JS | フレームワーク不要。1ファイルで完結 |
| 帳票出力 | openpyxl | Excel生成。JIBのテンプレートに流し込み |
| ルール定義 | YAML | コードレスで編集可能。UIからも書き戻し |
| データ保存 | SQLite | 履歴管理。1ファイルでバックアップ容易 |
2.3 インフラ構成
ハードウェア
Mac mini M4 (16GB) 1台
ネットワーク
JIB社内LAN内のみ
外部通信
なし(完全ローカル)
アクセス方法
ブラウザで http://<mac-mini-ip>:8000
SECTION 3
ルールエンジン
保険業法上の意向確認で必要な説明義務項目をルールとして定義。各ルールは「定義されたキーワード群が文字起こしテキストに含まれていれば説明済みと判定」するチェックリスト型。
3.1 ルール定義例(rules.yaml)
categories:
- id: important_matters
name: "重要事項説明"
items:
- id: contract_overview
name: "契約概要の説明"
keywords: ["契約概要", "保障内容", "保険金額", "保険期間"]
match_mode: "or" # いずれか1つ含まれれば「説明済み」
- id: intent_confirmation
name: "意向の確認"
items:
- id: purpose
name: "加入目的の確認"
keywords: ["目的", "なぜ", "きっかけ", "理由", "備え"]
match_mode: "or"
3.2 判定ロジック
| ステップ | 処理内容 |
|---|---|
| 1 | rules.yaml からカテゴリ・項目・キーワードを読み込み |
| 2 | 文字起こしテキストを正規化(空白除去・lowercase) |
| 3 | 各項目のキーワードリストでテキストを検索 |
| 4 | match_mode: "or" → いずれか1つ含まれれば「説明済み」 |
| 5 | match_mode: "and" → 全キーワードが含まれなければ「説明済み」にならない |
| 6 | ヒットしたキーワードを含むセグメントを「根拠」として自動引用 |
3.3 ルールの管理
- ルール変更はWeb UI(タブ2: ルール設定)から実施可能
- 変更時は
rules_historyテーブルに自動バックアップ(いつでも復元可能) - 初期ルールはJIBの意向確認シートの項目に合わせて設定
SECTION 4
UI設計
4.1 画面構成(3タブ)
| タブ | 名称 | 主な利用者 | 用途 |
|---|---|---|---|
| 1 | 録音 → チェック | 営業マン | メイン作業。録音アップ → 確認 → ダウンロード |
| 2 | ルール設定 | 管理者 | チェック項目・キーワードの追加・編集 |
| 3 | 履歴 | 全員 | 過去の記録一覧・再ダウンロード |
4.2 メイン作業画面イメージ(タブ1)
録音 → チェック
ルール設定
履歴
録音ファイルをドラッグ&ドロップ、または クリックして選択
.m4a / .wav / .mp3 対応
.m4a / .wav / .mp3 対応
文字起こし結果
田中様: 子供が来年大学に入るので、学資の備えが心配なんです...
募集人: 学資の保障内容についてご説明しますね。まず保険期間ですが...
田中様: 月々の予算は2万円くらいまでなら...
チェック結果
重要事項説明
契約概要の説明
学資保険の保障内容・保険期間を説明済み
注意喚起情報の説明
未検出 — メモを入力して手動で ✓ に変更可能
意向の確認
加入目的の確認
子供の大学進学資金の準備
保険料の意向確認
月々2万円まで
顧客名
田中太郎
担当者
佐藤
意向確認シート ダウンロード
4.3 操作フロー
| ステップ | 操作内容 |
|---|---|
| 1 | 営業マンが録音ファイルをアップロード |
| 2 | 文字起こし処理(進捗バー表示) |
| 3 | ルールエンジンが自動チェック → ✓/✗ リスト表示 |
| 4 | ✓ の項目: 文字起こしから該当箇所を自動引用してメモ欄にプリセット |
| 5 | 営業マンがメモを確認・補足・修正 |
| 6 | ✗ の項目: 必要に応じて手動でメモを書き、✓ に変更可能 |
| 7 | 顧客名・担当者名を入力 |
| 8 | 「ダウンロード」→ 意向確認シート.xlsx が生成される |
SECTION 5
データモデル
5.1 SQLiteテーブル
-- 面談記録
CREATE TABLE records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_name TEXT NOT NULL,
recruiter_name TEXT NOT NULL,
audio_filename TEXT NOT NULL,
audio_path TEXT NOT NULL,
transcript_text TEXT NOT NULL,
segments_json TEXT NOT NULL, -- タイムスタンプ付きセグメント
check_results_json TEXT NOT NULL, -- チェック結果 + メモ
created_at TEXT NOT NULL DEFAULT (datetime('now','localtime')),
exported_at TEXT -- Excel出力した日時
);
-- ルール変更履歴
CREATE TABLE rules_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
rules_yaml TEXT NOT NULL, -- 変更時点のYAMLスナップショット
changed_by TEXT,
changed_at TEXT NOT NULL DEFAULT (datetime('now','localtime'))
);
5.2 チェック結果JSON構造
{
"categories": [
{
"id": "important_matters",
"name": "重要事項説明",
"items": [
{
"id": "contract_overview",
"name": "契約概要の説明",
"status": "explained",
"matched_keywords": ["保障内容", "保険期間"],
"evidence_segments": [
{"start": "2:30", "end": "3:15", "text": "..."}
],
"memo": "学資保険の保障内容・保険期間を説明済み",
"manually_overridden": false
}
]
}
]
}
SECTION 6
API設計
| メソッド | パス | 用途 |
|---|---|---|
| POST | /api/transcribe | 録音ファイルをアップロードし文字起こし実行 |
| GET | /api/transcribe/{job_id}/status | 文字起こしの進捗確認 |
| POST | /api/check | 文字起こし結果に対しルールチェック実行 |
| PUT | /api/records/{id} | チェック結果・メモの更新(手動上書き含む) |
| POST | /api/records/{id}/export | 意向確認シートExcel生成・ダウンロード |
| GET | /api/records | 履歴一覧取得(検索・フィルタ対応) |
| GET | /api/records/{id} | 個別記録の詳細取得 |
| GET | /api/rules | 現在のルール取得 |
| PUT | /api/rules | ルール更新(YAML書き戻し + 履歴保存) |
SECTION 7
ディレクトリ構成
intent-checker/
├── src/
│ ├── main.py # FastAPIアプリ起動
│ ├── transcriber.py # mlx-whisper文字起こし
│ ├── rule_engine.py # ルール読み込み・チェック判定
│ ├── exporter.py # Excel生成(openpyxl)
│ ├── database.py # SQLite操作
│ └── models.py # Pydanticモデル
├── static/
│ ├── index.html # SPA(3タブ構成)
│ ├── app.js # フロントエンドJS
│ └── styles.css # CSS
├── config/
│ └── rules.yaml # ルール定義
├── templates/
│ └── intent_sheet.xlsx # 意向確認シートテンプレート
├── data/
│ ├── db.sqlite3 # SQLiteデータベース
│ └── audio/ # アップロードされた録音ファイル
├── tests/
│ ├── test_transcriber.py
│ ├── test_rule_engine.py
│ ├── test_exporter.py
│ └── test_api.py
├── requirements.txt
└── README.md
SECTION 8
納品スコープ・費用・スケジュール
8.1 納品物
| # | 納品物 | 内容 |
|---|---|---|
| 1 | Mac mini M4 (16GB) | 初期費用に含む。セットアップ済みで納品 |
| 2 | 意向確認チェッカー アプリ | Mac mini上で動作。ブラウザからアクセス |
| 3 | 意向確認シートテンプレート | JIBの書式に合わせたExcelテンプレート |
| 4 | 初期ルール設定 | JIBの意向確認項目に合わせたrules.yaml |
| 5 | 操作マニュアル | 営業マン向け + 管理者向け |
8.2 費用
別途ご相談
8.3 開発スケジュール(テンプレート受領後 6週間)
前提条件: JIBから意向確認シートのテンプレート(記入済みサンプル)を受領済みであること。Mac mini購入は発注後1週間程度で到着想定。
SECTION 9
横展開の拡張ポイント
本システムは1機能に絞った設計だが、以下の拡張を想定:
- ルールのプリセット: 保険業界標準のチェック項目をプリセットとして複数用意し、代理店ごとにカスタマイズ
- 複数帳票対応: 意向確認シート以外の帳票(アフターフォロー報告等)も同じパイプラインで生成
- Whisperモデル選択: Mac miniのスペックに応じてmedium/large-v3を切替可能に