🖨️

GitHub × Gemini APIを使って家庭内の紙プリント管理を仕組み化してみた

に公開

はじめに

今年から長男が小学校に通っています。
学校から日々の生活の状況や行事の予定などを紙のプリントで配布されるのですが、
見落としていたり、そのまま捨ててしまうで「あれ、今週参観日だったの?!」なんてことも...

そこで私はそんな家庭内の情報共有の課題を解決するために
GitHubとGemini APIを活用してみました。

こんなものを作りました

  1. スマホで撮影 → GitHubアプリから Issue 作成
  2. ラベルを付ける → 「ocr-request」をポチッと
  3. 数分待つ → テキスト化された内容がコメントに!

プリントをスマホのカメラで撮って
GitHub Issueにするだけで文字起こしをしてくれます。

実際の処理結果

Before: 学校からのプリント(一部)

PTA案内

After: Gemini が生成したテキスト

## 〇〇小学校PTA作業(春・秋)事前調査のお願い 要約

この文書は、〇〇小学校PTAが春と秋に予定している作業への参加を促すものです。

**作業日程:**
* 春:5月24日(土)午前8時〜9時頃(2・4・6年生保護者中心)
* 秋:10月11日(土)午前8時〜9時頃(1・3・5年生保護者中心)

**調査票提出期限:4月25日(金)**
...

例には載せませんでしたが、手書きの文字を含んだプリントでもかなり正確に読み取ってくれました。

仕組みの概要

処理の流れ(シーケンス図)

ユーザーの操作は、紙プリントを撮影して、GitHubアプリでIssueに添付&作成。
特定のラベルにのみ、GitHub Actionsが反応するようにしています。

使用技術

  • GitHub Issues: 画像アップロード・管理
    • 妻もGitHubを使ったことがあったのが選定理由として大きいです。
    • プライベートissueとして管理できて、無料の範囲内で利用できるのもポイント。
  • GitHub Actions: 自動処理のトリガー
  • Gemini API: 画像からテキスト抽出
    • geminiアプリはすでにプライベートでも試していたのですが、
      画像からの文字起こしがこんなに簡単にかつ無料で使えるのだから便利な世の中です。
  • Python: 処理スクリプト
    • 実はここの実装もCLINE + Gemini LLM を使い、ほぼ自動で実装してもらいました。
      本筋でないので今回は詳細は省きますが、unittestなども書いてもらったので実装に安心感ありました。

実装のポイント

1. GitHub Actions の設定

name: OCR Request

on:
  issues:
    types: [labeled]

jobs:
  ocr:
    if: contains(github.event.issue.labels.*.name, 'ocr-request')
    runs-on: ubuntu-latest
    
    steps:
      - name: Run OCR and comment
        run: |
          # Issue から画像を取得して Gemini API で処理
          # 結果を Issue にコメント

「ocr-request」ラベルが付いたら自動実行されるようにしました。
動作テストなどで一番手を動かしたため、一番時間がかかったのは実はこのあたりだったりします。

GitHub プライベートリポジトリのIssueの添付画像は数年前から認証が必須だったため
gh auth token コマンドを実行することで認証トークンを発行し
GitHub Action上で発行することで、そのトークン使ってPythonで画像ダウンロードに利用するようにしました。

https://github.blog/changelog/2023-05-09-more-secure-private-attachments/
https://cli.github.com/manual/gh_auth_token

2. Gemini API でのOCR処理

def generate_gemini_response(image, prompt):
    model = genai.GenerativeModel("gemini-1.5-flash")
    response = model.generate_content([prompt, image])
    return response.text

# 実際に設定しているプロンプト
prompt = "画像に含まれる文章を日本語で要約しMarkdown形式で返してください"

コードの一部ではありますが、主要な実装はほとんどこれだけ。。!
画像を Gemini に送るだけで、文脈を理解した要約まで作ってくれます。
マークダウンで返すように指示したので、そのままGitHub Issueへのコメントとして返しています。

使ってみた感想

良かった点

  • 検索が便利: 「水泳」「PTA」などで過去の情報がすぐ見つかる
  • 共有が楽: 家族全員が同じ情報にアクセスできる
  • 履歴が残る: 過去の予定も確認できる

今後改善したい点

  • ラベルの自動設定
  • 期日や行事予定がある場合Issueの期日として設定
  • カレンダーアプリへの自動登録&更新

その他気づき

  • テストとして同じ画像を何度も文字起こししてもらうと、内容に若干のゆらぎ?があった。
    そういうものという理解はしていたけども。たとえば、Markdownのフォーマットも指定したら改善するのだろうか?

まとめ

GitHub Actions と Gemini API を組み合わせることで、
プライベートな用途でも実用的なシステムが作れました。

少し前までOCRや要約などをするにしても専用のライブラリを選定したり、調整したりで結構面倒だったのですが、
今はGeminiなどの生成AIサービスが単体でかつ高精度でそれら担ってくれるので、
すごい時代になったなと感じます。

便利にできそうなことありそうです。

引き続き家族で運用を続けつつ、新しい仕組みも考えてみようと思います。

Discussion