【自作】撮るだけで自動整理される書類管理システムの作り方|OCR×ローカルAI
この記事は に運営者が実際に検証した内容に基づきます。
前回の概要記事で「家中の紙を、スマホで撮るだけでAIが自動仕分けしてくれる仕組み」を紹介しました。今回はその続きで、実際にどう作るかを手順に沿って書きます。
コードを全文写経するのではなく、要点・設計の意図・つまずきやすい所にしぼって解説します。
前提:母艦は Mac(macOS)、言語は Python(3.9以上)。Windowsでも考え方は使えますが、自動起動の部分は読み替えが必要です。
全体像:5つのブロックでできている
作るものを分解すると、たった5つです。
- 取り込み:画像/PDFをOCRで読み、AIでカテゴリと期限を判定してフォルダへ振り分ける
- 索引:書類1枚ごとに検索用のMarkdownメモを自動生成する
- ダッシュボード:全書類の期限を集計して一覧化する
- スマホ連携:家のMacで小さなWebサーバーを立て、QRで繋ぐ
- 守り:自宅ネット以外を遮断する「鍵」と、常時起動の設定
上から順に作れば、一つずつ動作確認しながら積み上げられます。いきなり全部を目指さず、まず1と2だけで「撮る→仕分け」が動くところを最初のゴールにすると挫折しにくいです。
0. 必要なもの
ソフトはすべて無料(Python本体、OCRエンジン、ローカルAIまで月額0円)。ハードは手持ちで始められます。何を買うべきか・買わなくていいかは 道具の選び方の記事 で正直に整理しました。
1. 環境準備(OCR / AI / Python)
ここが一番つまずく所。でも入れるものは決まっています。
- Python(3.9以上):macOSに最初から入っている
python3でOK。 - OCRエンジン(tesseract):紙の文字を読む頭脳。Macなら Homebrew で
tesseractと日本語の言語データを入れる。 - Pythonライブラリ:Webサーバー用(Flask 等)と、OCR用(pytesseract / pdf2image / Pillow)。
- ローカルAI(Ollama・任意):抽出精度を上げる「賢い読み手」。手元で動く軽量モデルを使う。入れなくても動く——その場合はキーワード一致で振り分ける簡易モードに自動で切り替わる。
つまずき①:「
pytesseractを入れたのに動かない」。これはほぼ全員がやります。pytesseractは橋渡しで、本体のtesseractコマンドが別に必要。本体と日本語言語データを入れ忘れていないか確認を。
つまずき②:環境が揃ったかは目視で確認しない。必要なものが入っているか一発で診断する小さなチェックスクリプトを最初に作ると、「動かない」時にそこを叩くだけで原因が切り分けられます。足りなければ入れるコマンドまで出すようにすると、一番得をする部品になります。
2. フォルダ設計(DBを使わない割り切り)
このシステムはデータベースを使いません。**フォルダ階層そのものが分類で、Markdownのメタデータが「DBのレコード」**という割り切りです。SQLもクラウドも要らず、Finderでそのまま見れて、壊れにくい。
書類管理/
├── 00_Inbox/ ← 取り込みのただ1つの入口(ここに放り込むだけ)
├── 01_保険/ ← 医療 / 生命 / 自動車 / 火災 …
├── 02_重要書類/ ← 契約書 / 年金 / 税金
├── 03_家電・設備/
├── 09_未分類_その他/ ← 自動判定できなかった物の受け皿
└── scripts/ ← 自動化スクリプト一式
効いた工夫が3つあります。
- 入口を1つに固定(
00_Inbox)。「どこに入れるか」を考えさせないことで、家族でも迷わない。 - 番号プレフィックスで物理的な棚の並びと一致させる。紙の現物に同じ番号のラベルを貼ると、デジタルと現物が一瞬で行き来できる。
- **
_始まりは「隔離領域」**というルール。自動処理から外したい書類はここへ。削除せず「処理対象から外す」逃げ道を用意しておくと運用が楽。
各Markdownには最低限このメタデータを持たせます。とくに**期限(expiry)**が後のダッシュボードの心臓部。
expiry: YYYY-MM-DD ← ダッシュボードが読む期限の正典(必須)
- 重要度: 高 / 中 / 低
- 更新/期限日: YYYY-MM-DD ← 人が読む用
- 原本保管: あり / なし
- スキャンデータ: [ファイル名.jpg](./ファイル名.jpg)
3. 取り込みの流れ(OCR → AI → 振り分け)
中核の処理。流れはシンプルです。
00_Inboxの画像/PDFを取り出す- OCRでテキストに変換(PDFは画像化してからOCR)
- テキストをAIに渡し、カテゴリ・会社名・書類名・日付・契約者・有効期限をJSONで受け取る
- カテゴリに応じたフォルダへ元ファイルを移動し、検索用Markdownを自動生成
- ファイル名は「日付_会社名_契約者名」のように規則化
設計で大事なのは、AIへの問いかけを「JSONで返せ」と固定すること。出力フォーマットを縛ると後処理が安定します。「カテゴリは決まった候補から選ぶか、無ければ短い新カテゴリ名を作ってよい」と許可しておくと、未知の書類にも柔軟に対応できます。
つまずき③:AIが無い/失敗した時に全部止まる設計にしない。「AIで読めなければキーワード一致の簡易判定に落とす」二段構えにしておくと「とりあえず動く」状態を保てます。
つまずき④:OCRの精度がシステムの生命線。読み取りが外れると仕分けも期限も連鎖でズレる。対策は地味で、(a) 傾き・影を避けて明るく撮る、(b) AIに渡すテキストは長すぎると精度が落ちるので適度に絞る、(c) 自信が無い物は隔離フォルダへ退避して人が確認する。「最後は人が一目見て直す」前提で作ると気が楽です。
4. 期限ダッシュボード(更新忘れを物理的に防ぐ)
保険や契約の「気づけば更新を逃して損していた」を無くす部品。やっていることは単純で、全Markdownを走査して期限を集め、近い順に並べて1枚の表にするだけ。
- 期限切れ / 更新間近 / 期限未設定 の3グループに分ける
- クリックでその書類のメモへ飛べるリンクを張る
- 取り込みの直後に自動で作り直す
ポイントは、期限の根拠を「ファイル名の日付」ではなくメタデータに一本化したこと。ファイル名は表示用、判断はメタデータ、と役割を分けると破綻しません。
5. スマホ連携(QRで繋ぐ)
家族に一番ウケる部分。家のMacで小さなWebサーバー(Flask)を立て、同じWi-Fiのスマホからブラウザで閲覧・撮影取り込みできるようにします。繋ぎ方は「QRを画面に出す→スマホのカメラで読む→ホーム画面に追加」の3ステップ。IPもURLも入力させないのがコツ。
- URLにMac名(
<あなたのMac名>.local)を使う。IPは再起動やルーターの都合で変わるが、Mac名は安定。QRを貼り替える手間が消えます。 - アクセス用の合言葉(トークン)を永続固定に。再起動してもURL・QRが変わらず、一度配れば配り直し不要。
処理はMac側なので、Macとサーバーが起動している必要があります——ここは仕組み上の制約として正直に押さえておきます。
6. 常時起動(「開いたら繋がらない」を無くす)
毎回ターミナルを開くのは家族には無理があるので、ログイン時に自動起動し、落ちても再起動する設定にします。macOSなら launchd に登録するだけ。
- ログイン時に自動起動/落ちたら自動再起動
- 外付けドライブが未接続なら起動せず待機し、接続されたら自動で立ち上がる
つまずき⑤:再起動が暴走しないよう最短の再試行間隔を設ける。ドライブ未接続で「起動→即終了」を高速で繰り返すと無駄にCPUを食います。あと、Macがスリープするとサーバーも止まるので、常時アクセスしたいならスリープを抑止しておく。
7. セキュリティ設定(家庭用の最適解を選ぶ)
家の保険・金融書類を扱う以上、手は抜けない。でもガチガチにしすぎると家族が使えない。この綱引きの決着が一番考えた所です。
入れたもの:
- 自宅ネットの外を遮断する「鍵」:私設ネットワーク以外のIPからのアクセスは弾く
- トークン認証:LAN経由は合言葉必須。本人(同じMac)からは免除して手間を省く
- 総当たりの自動ブロック:認証失敗が続いたIPを一時的に締め出す
- 漏れた時のワンクリック失効:トークンを変えるボタンで古いURL・QR・アイコンを即無効化
あえて入れなかったもの:
- 通信の暗号化(HTTPS):
.localの自己署名証明書はブラウザが警告を出し、非技術な家族には扱いづらい。家庭内利用では割に合わないと判断し、代わりにOS標準のディスク暗号化(FileVault)を推奨する形にしました。
面白かったのは、自分のコードをAIに敵対的にレビューさせたら、自分では気づかなかった抜けが見つかったこと。「外部IPが特殊な書式だと鍵をすり抜ける」「対策が真面目すぎて正規の家族まで締め出す」——どちらも直せました。学びは一言、全部盛りが正解ではなく、家庭には家庭用の最適解がある。脅威モデル(誰から・何を守るのか)を先に決めると、過不足のない守りに落とせます。
まとめ:作る順番のおすすめ
迷ったら、この順で積むのが一番折れにくいです。
- フォルダ設計とメタデータの形を決める(紙の上でいい)
- 環境を整え、チェックスクリプトで「揃った」を確認する
- 取り込み(OCR+AI振り分け)を動かす ← まずここがゴール
- ダッシュボードを足す
- スマホ連携(サーバー+QR)を足す
- 常時起動とセキュリティで仕上げる
最初から完璧を目指さず、3まででいったん「使える」状態にしてしまうのが続けるコツです。