# わたしの字典 — AIに自分の手書きを伝える筆跡辞書

**公開用・再実装ガイド兼機能仕様書 v1.0**  
作成日：2026-11-01  
対象：2026-10-31 23:01版の提供ZIP（`remix-tegaki-ai-poc-02`）  
出展：たねのま / AIクリエイターズマーケット2026

> **この文書の目的**：ソースコードを配布せず、アプリの発想、操作、データ設計、処理の順序、実装上の選択肢を公開すること。ChatGPT、Claude、Geminiなど、利用者が選んだAIや開発環境に入力して、同じ問題を解く**類似アプリ**を設計・実装できるようにする。画面や内部実装の完全一致は求めない。
>
> **記述の区別**：**【現行実装】**＝提供ZIPから確認できる動作・設計。**【再実装の選択肢】**＝別の技術構成で作るための提案。**【注意】**＝運用上の制約や、実機での検証が必要な点。

## 1. 解決したい問題と基本思想

写真に撮った手書きノートは、汎用の画像認識AIでテキスト化できる。しかし書き手固有の筆跡、崩した文字、似た字、言葉の区切りなどが誤読される。AIの推測だけに任せると、原文にない文字が補完されることもある。

本アプリは「自分の文字をAIに理解してもらいたい」という発想から、(1) 手書き画像を認識し、(2) 人間が結果を確認・修正し、(3) 誤読箇所の筆跡画像と正解を辞書として記録し、(4) 次の認識にその辞書を参考情報として渡し、(5) 本当に効果があるかを比較する、という一連の操作を提供する。

**重要：これはモデルの追加学習・ファインチューニングではない。** 保存した筆跡例を推論時の文脈（マルチモーダルな参考例）として渡す方式である。改善は保証されず、辞書ありでかえって誤読が増える場合も検証対象となる。

### 想定する利用者
- 自分の手書きノートを、後から検索・整理・AI活用したい人
- OCRの認識結果を自分で修正し、その知見を再利用したい人
- 辞書を使ったとき／使わないときの認識結果を比較したい人

### このアプリが行わないこと
- 独自の基盤AIモデルを訓練すること
- 手書き内容の意味を創作・要約・書き換えすること（認識処理の原則）
- すべての筆跡に対する正答を保証すること
- ローカル保存したデータを、別端末へ自動同期すること

## 2. 全体フロー

```text
手書きノート画像
     ↓
[画面1 手書き認識] 画像アップロード → AI文字起こし → 人間による修正
     ↓                                          ↓
[画面2 筆跡辞書登録] 誤読箇所を画像で切り抜く + 誤読文字 + 正解文字
     ↓
[画面3 辞書一覧] 保存・検索・編集・削除・バックアップ
     ↓
次回認識では、対象画像に加えて保存済みの筆跡画像＋正解例をAIへ渡す
     ↓
[画面4 比較・検証] 同じ対象画像を辞書なし／ありで認識し、正解文と照合
```

## 3. 利用者向け機能要求

### F-01 手書き認識【現行実装】
1. 手書き画像を選択し、必要に応じて向きを変更する。
2. 「辞書なし」または「辞書あり」を選ぶ。
3. 認識操作で画像とモードをサーバーへ送る。
4. AIから得た文字起こし結果を表示する。
5. 認識結果を人間が編集し、正しいテキストとして確定できる。
6. 修正した内容を辞書登録画面や比較・検証画面へ引き継ぐ。
7. 辞書が0件の場合、辞書ありモードでも実際には参考例が渡せないことを明示する。

**認識の原則【現行実装】**：原文の順序・改行・記号をできるだけ保持する。創作や推測による補完はしない。読めない箇所には `[判読不能]` を記す。解説やコードフェンスではなく、文字起こし本文のみを返す。

### F-02 筆跡辞書登録【現行実装】
1. 原本画像を表示する。表示範囲の移動、拡大縮小、90度回転ができる。
2. キャンバス上の選択ツールで誤読された文字・語句を矩形選択し、移動・リサイズする。タッチのピンチ操作にも対応する。
3. 選択箇所のプレビューを表示する。
4. **正解テキスト**と**AI誤認識テキスト**を必須項目として入力する。
5. 種別を「文字／単語／短文／その他」から選ぶ。任意で出現文脈、備考を入力する。
6. 保存すると画像切り抜きと文字情報が1件の辞書項目として保存され、`H001` などのIDが付く。
7. 登録後は入力フォームがクリアされ、同じ画像から連続登録しやすい。
8. 上部と下部に登録ボタンを設けている。

**入力制約【現行実装】**：選択領域は少なくとも4×4画像座標単位、正解・誤認識テキストは空欄不可。選択プレビューがないと登録ボタンは無効になる。

### F-03 辞書一覧とバックアップ【現行実装】
- 保存した辞書項目の一覧を、切り抜き画像、ID、正解、過去の誤読、種別、文脈などとともに表示。
- キーワード検索・種別絞り込み、編集、削除、削除確認。
- 画像を含む辞書全体のJSONエクスポート。
- JSONからのインポート。IDが既存のものは上書き、初出のIDは新規追加。必須項目の不足した行はスキップしエラーを報告。
- IDは `H` + 3桁以上の連番。消した番号の再利用を避けるため最大採番値を別途保存。

### F-04 比較・検証【現行実装】
1. 対象画像を用意する。
2. 同じ画像について「辞書なし」のAI認識を実行する。
3. 次に「辞書あり」のAI認識を実行する。
4. 両者のテキストを並べ、表示・スクロール比較する。
5. 人間が作成した正解全文を登録する。画面1の修正済みテキストを取り込める。既存の正解全文と異なるときは上書き確認する。
6. 検証対象が辞書に未登録の画像かどうか、メモを記録する。
7. 比較結果を検証ログへ保存・参照・削除できる。

**【注意】** 現行実装は比較テキストと正解全文を保存する。これだけで「辞書の精度向上率」を客観的に主張できるとは限らない。評価時は手動確認、同一画像での比較、複数サンプルでの再試験を基本とする。

## 4. データモデル

### 4.1 筆跡辞書項目（DictionaryEntry）【現行実装】

| 項目 | 意味 | 必須 |
|---|---|---|
| `id` | 項目識別子（例 `H001`） | ○ |
| `imageBlob` | 誤読箇所のPNG切り抜き画像 | ○ |
| `correctText` | 人間が確認した正しい文字列 | ○ |
| `misreadText` | AIの過去の誤認識文字列 | ○ |
| `kind` | 文字／単語／短文／その他 | ○ |
| `context` | その文字が現れた文脈 | 任意 |
| `note` | 自由記入メモ | 任意 |
| `createdAt`, `updatedAt` | ISO 8601形式の日時 | ○ |
| `sourceImageName` | 元画像名 | 任意 |

保存用の画像はバイナリBlob。表示・API送信用にはData URL（Base64）へ変換する。バックアップJSONでは `imageBase64` として画像を含める。

**【再実装の選択肢】** 切り抜き画像はファイル、オブジェクトストレージ、SQLiteのBLOB列などでもよい。必ず「画像・正解・過去の誤読」が相互に結び付くデータ構造にする。

### 4.2 認識結果【現行実装】
- `text`: 認識本文
- `mode`: `without_dict` / `with_dict`
- `usedDictionaryCount`: 実際に送信した辞書参考例の件数
- `usedDictionaryIds`: 送信した辞書のID配列
- `model`: 使用モデル名
- `timestamp`: 処理日時（クライアント側で付与する構成）

### 4.3 比較ログ【現行実装】
- ログID、実行日時、辞書なし本文、辞書あり本文、正解全文（任意）
- 使用辞書ID群・件数、モデル名、未登録画像フラグ、メモ

### 4.4 保存方式【現行実装】
- WebブラウザのIndexedDB
- DB名：`tegaki_ai_poc_db`、DBバージョン：1
- ストア：`dictionary`、`eval_logs`、`metadata`
- サーバー側のGoogle Sheets / Drive / GASへの自動保存はこの実装の主経路ではない。
- **端末・ブラウザ・サイトオリジンごとにデータが分かれる**。ブラウザのデータ削除や別端末利用に備えてJSONバックアップを案内する。

## 5. AI認識ロジック：プラットフォーム非依存の考え方

### 5.1 辞書なしモード【現行実装】

```text
入力：対象画像、翻刻ルール
AIへの依頼：文字を忠実に転記する。
出力：認識本文のみ
```

### 5.2 辞書ありモード【現行実装】

```text
入力：
  A. 辞書の説明（筆跡のクセと、人間確認済みの正解例を参考にする）
  B. 辞書項目ごとの「筆跡切り抜き画像」
  C. その項目の「正解文字列」「過去の誤読」「種別」「文脈」
  D. 新しく読み取りたい手書きノート画像
  E. 辞書なしと共通の忠実な翻刻ルール
処理：画像と文字列を扱えるAIモデルに一括で入力する
出力：認識本文、送信した辞書IDと件数、モデル情報
```

辞書あり／なしを比較するため、**基本の翻刻ルールは共通**にする。「辞書なし」では参考例を渡さない。辞書画像を受け付けないモデルで代替する場合は、辞書画像の特徴を別の手段で表現する必要があり、**同じ方式ではなく代替方式**であることを明示する。

### 5.3 プロンプトの移植可能な骨格【再実装の選択肢】

```text
あなたは手書き文書の忠実な転記を行うアシスタントです。
原文の文字順・改行・箇条書き・記号を維持してください。
意味に合わせた創作、修正、要約、穴埋めはしないでください。
判読不能な部分は [判読不能] としてください。
転記本文以外の文章を出力しないでください。

[辞書ありモードのみ]
以下は同じ書き手の筆跡切り抜きと人間が確認した正解です。
各例は参考情報であり、新しい画像の文字を置き換える絶対規則ではありません。
辞書例：画像 / 正解 / 過去の誤読 / 種別 / 文脈

[対象画像]
```

※上記は公開用の**概念テンプレート**で、非公開ソース内のプロンプトの逐語コピーではない。

### 5.4 APIインターフェイス【現行実装】

- `POST /api/recognize`
- リクエスト：`image`（対象画像のData URL/Base64）、`mimeType`、`mode`、`dictionaryEntries`（辞書画像と文字列）
- レスポンス成功：`ok`, `text`, `mode`, `usedDictionaryCount`, `usedDictionaryIds`, `model`
- 対象画像がなければHTTP 400。処理失敗はHTTP 500。
- 現行サーバーはNode.js / ExpressとGemini SDKを用いる。モデル識別子は提供ソースでは `gemini-3.8-flash` と記載されている。**これはZIPの記録であり、別環境でのモデル提供・利用可能性を保証するものではない。**

**【再実装の選択肢】** 同等の画像理解が可能なら、Gemini、OpenAI、Anthropic等のモデルをAPI経由で利用できる。あるいはローカルVLMを使ってもよい。画像入力仕様、料金、プライバシー、文脈長、出力制御、モデル提供状況は各環境に合わせて調整する。

## 6. 技術構成と画像処理

### 現行実装
- フロントエンド：React / TypeScript / Vite
- APIサーバー：Node.js / Express
- モデル呼び出し：`@google/genai` SDK
- ローカル永続化：ブラウザIndexedDB
- 画像処理：HTML Canvasで縮小、回転、矩形切り抜き
- 入力画像は長辺最大4000pxに縮小し、PNGまたはJPEGとして扱う（JPEG品質値0.92）。
- 登録画面は選択矩形、拡大・移動、ピンチズーム、回転、Undoなどを備える。

### 代替アーキテクチャ【再実装の選択肢】

| 方式 | 例 | 向いているケース |
|---|---|---|
| Web＋クラウドAPI | React/Vue/Svelte + Node/Python + 任意の画像対応モデル | Webから利用・共有したい |
| Python単体 | Streamlit/Gradio + 画像対応API + SQLite | 個人試作を素早く作る |
| ローカル中心 | デスクトップUI + ローカルVLM + SQLite | ネット接続やデータ送信を減らしたい |
| ノーコード／ローコード | フォーム + データ保存 + 画像認識API | コード量を抑えたい |

大切なのは言語や製品名ではなく、「画像のアップロード」「人間による訂正」「画像と正解のセット保存」「辞書を添えた再認識」「辞書なしとの対照実験」の5要素をつなぐこと。

## 7. 安全性・プライバシー・公開運用

### 現行実装からわかる制約
1. IndexedDBはブラウザ側の保存領域。共有リンクを他人が開いたとき、元の利用者の辞書が自動共有される設計ではない。
2. ただし**認識実行時**は、対象画像と辞書に含まれる切り抜き画像・文字情報がAI APIへ送られる。完全オフラインではない。
3. バックアップJSONには筆跡画像と人間が書いた内容が含まれる。個人情報として適切に管理する。
4. ブラウザに配信されるJavaScriptやHTMLは閲覧・解析され得る。「ソースコード非公開」は**開発元のZIP・リポジトリ・サーバー側の秘密情報を公開しない**ことと区別する。
5. APIキーはブラウザに埋め込まず、サーバー側の環境変数またはシークレット管理で保持する。

### 期間限定デモで追加する対策【再実装の選択肢】
- 公開終了日時と終了時の案内を決める。
- 利用量制限、アクセス制限、CAPTCHA等の濫用対策を検討する。
- 入力画像のサイズ・形式検証、リクエストサイズ上限、タイムアウトを実装する。
- 第三者の秘密情報や機微情報をアップロードしないよう表示する。
- **他人の辞書を共有するサービス**に変更する場合は、認証・権限・データ分離・削除手順を別途設計する。
- 料金・モデル提供状況を確認する。無課金で同等のAPIを永続利用できるとは限らない。

## 8. テスト・評価の進め方

### 必須の操作テスト
1. JPEG/PNG画像を読み込めるか。縦長・横長・大きな画像で表示できるか。
2. 認識結果に原文の改行・箇条書きが保持されるか。
3. AIが判読不能な文字を勝手に作り足していないか。
4. 辞書登録時、切り抜き画像・正解・過去の誤読が保存されるか。
5. 必須入力が未入力のとき保存できないか。
6. 辞書を編集・削除できるか。ID衝突が起きないか。
7. JSONをエクスポート後、別ブラウザでインポートできるか。
8. 辞書なしでは辞書情報がモデルに送られないか。
9. 辞書ありで使用した参考例ID・件数が記録されるか。
10. 同じ未登録画像で「辞書なし／あり」を比較し、正解全文と照合できるか。
11. 通信失敗、モデル利用不可、ブラウザ容量不足で利用者にエラーを示せるか。
12. スマートフォン・タブレット操作時に選択とスクロールが競合しないか。

### 評価指標【再実装の選択肢】
- **CER（文字誤り率）**：正解全文と認識全文の編集距離 ÷ 正解全文の文字数（事前に改行・空白・記号の扱いを統一）。低いほどよい。
- **完全一致率**：正解文と完全一致した画像数 ÷ 評価画像数。
- **辞書による変化**：同一画像について `CER(辞書なし) − CER(辞書あり)`。正なら改善、負なら悪化。
- **未登録画像への一般化**：辞書を作ったのと同じ画像だけでなく、事前に辞書に入れていない別画像を使う。

これらの自動スコア算出は**追加実装の候補**であり、提供ZIPからすべての指標の自動計算が実装済みだとは断定しない。

## 9. AIにこの仕様書を渡すときの依頼文

以下を、この仕様書と一緒に任意のコーディングAIへ入力してください。

```text
添付の「わたしの字典」公開仕様書を読み、同じ目的・主要フローを持つ
手書き認識＋筆跡辞書＋比較検証アプリを設計してください。
ソースコードの完全再現や画面の一致は不要です。

まず次の順序で進めてください。
1. 要求を「必須」「任意」「未決定」に整理する。
2. 私の開発環境・使えるAIモデル・予算・データ保存の条件を確認する。
3. 実現可能な実装方式を2〜3案比較する（費用・難易度・プライバシー）。
4. 画面、辞書データ、AIへの入力、保存、エラー処理、テストを設計する。
5. 最小構成として「画像認識 → 人間修正 → 筆跡辞書登録 → 辞書あり再認識」を実装する。
6. 辞書なし比較・正解全文・ログ保存・バックアップを追加する。
7. 過去の文字列を記憶させるモデルの再学習ではなく、
   推論時に画像と正解の参考例を渡す方式を第一候補にする。
8. 仕様書の【現行実装】と【再実装の選択肢】を区別し、
   変更した仕様と残る制約を最後に明示する。

APIキーをフロントエンドに埋め込まないでください。
認識結果を事実として扱わず、人間が修正できる設計にしてください。
```

## 10. 推奨実装順序

**MVP（最初に動くもの）**
1. 画像読込と文字認識
2. 認識結果の編集・確定
3. 切り抜き画像＋正解＋過去の誤読を辞書に保存
4. 辞書の参考例を次回の認識へ渡す

**使いやすさの改善**
5. 辞書一覧／検索／編集／削除
6. 拡大・回転・矩形切り抜き・タッチ操作
7. JSONバックアップ／復元

**効果の検証**
8. 辞書なし／ありの比較
9. 正解全文と検証ログ
10. 未登録画像による評価と任意のCER算出

## 11. 既知の前提と非保証事項

- 本文は提供されたソースの**静的確認**を根拠としており、全機能の実機テスト・セキュリティ監査・外部APIの稼働確認を済ませたものではない。
- 現行ソースに記載されたモデル識別子、ライブラリ、保存方式は2026-10-31版の情報である。サービスの将来仕様を保証しない。
- 辞書参照による改善はケース依存。辞書件数の増加が必ず精度向上につながるわけではない。
- この公開版にはAPIキー、個人のメールアドレス、Google Drive / Sheets / GASの実ID・管理URL、開発元ソースファイルを掲載しない。
- 自由に類似アプリを制作するための説明文書だが、第三者サービス・AIモデル・ライブラリの利用規約と著作権は各自で確認する。

---

**LPの導線**：①作品について知る → ②実際に使ってみる（期間限定） → ③仕様書を読む・ダウンロードする。  
**公開の考え方**：ソースコードは非公開。コンセプト、必要機能、データモデル、処理フロー、実装上の選択肢は公開。
