おはようございます。まさきんです。
子どもが学校から持ち帰る連絡帳は、手書きです。しかも字が独特で、読み解くのに時間がかかることがあります。
この「読み解いて、家族に伝える」という部分をAIに手伝ってもらう仕組みを作りました。今回は画像の前処理から表示の更新まで、実際の手順で紹介します。
きっかけは「見返すタイミングがずれる」こと
連絡帳は、子どもがランドセルから出してくれないと存在に気づけません。気づいたときには、もう夕方だったりします。
家族の誰かがいつでも見られる場所に、内容を反映しておきたい。そう考えて、リビングに置いているディスプレイに連絡帳の内容を映す仕組みを作りました。
仕組みの流れ
やっていることは次の4ステップです。
- 連絡帳のページをスマートフォンで撮影する
- 画像の向きを補正する(縦書きの写真は正立していないことがあるため)
- AIに文字起こしを依頼する
- 結果をデータに書き込み、ディスプレイの表示を更新する
撮影から表示更新まで、人の手を介するのは「撮る」ところだけにしています。あとの工程は自動で流れる設計です。
撮影した画像を読み取れる形に整える
iPhoneで撮った写真は、そのままではAIが向きを誤認識することがあります。特にHEIC形式は、標準的な画像ビューアでは開けても、AIの画像読み取りツールが対応していない場合があります。
なので、まずJPEGに変換しつつ、向きを揃えます。Macであれば標準搭載のsipsコマンドで完結します。
# HEIC を JPEG に変換
sips -s format jpeg IMG_xxxx.HEIC --out notice.jpg
# 縦書きが横向きに見えるときは時計回りに90度回転
sips -r 90 notice.jpg --out notice_rot.jpg
一度変換した画像を確認し、向きが違っていればもう90度足すか、180度で反転させます。数枚試して当たりを付けてしまえば、あとは同じ変換をスクリプト化しておくだけで済みます。
さらに、全体画像のままだと文字が小さく判読しづらいので、PIL(Pillow)で文字が集中しているエリアを切り出してから読み取らせています。
from PIL import Image
im = Image.open("notice_rot.jpg")
# 中央の文字エリアを切り出す(実際のプリントのサイズ感に合わせて調整する)
im.crop((1300, 500, 3100, 2800)).save("zoom_main.jpg", quality=95)
全体を渡すより、文字が集中している範囲だけを拡大して渡したほうが、AIの読み取り精度は明らかに上がります。
手書き文字への向き合い方
ここが一番気をつけている部分です。子どもの字は、大人の字よりくせがあります。AIに読ませても、100%正確に読めるとは限りません。
なので、AIへの指示には次の一文を必ず入れています。
これは子どもの手書きの連絡帳です。文字が読み取りにくい箇所があっても、
推測で埋めないでください。自信を持って読める部分だけを書き起こし、
判読できない箇所は「判読不可」として、その位置も分かるようにしてください。
推測で埋めてしまうと、間違った情報が家族に伝わるリスクがあります。「分からない」と正直に返してもらうほうが、結果的に信頼できる仕組みになります。判読できなかった部分は、最終的に人が確認して埋めます。
考えてみると、この仕組みはスマホでの撮影から始まります。表示の更新も、最後はネット越しの通信で完結します。入り口も出口も、結局は通信頼みです。自分の契約も、見直したくなるものですね。
表示するデータの持ち方
読み取った内容は、シンプルなJSON形式で保存しています。ディスプレイ側のプログラムは、このファイルを読んでHTMLを生成する仕組みです。
{
"updated": "2026-09-01T07:30:00+09:00",
"valid_for": "2026-09-01",
"schedule": ["9月1日(火曜日)", "1 こくご", "2 さんすう", "3 たいいく", "4 おんがく"],
"homework": ["かんじの れんしゅう"],
"items": ["ずこうの どうぐばこ"],
"notice": []
}
配列の先頭要素をタイトル、それ以降を「時限 教科」の形式で並べています。連絡がない日は、このscheduleをまるごと空配列にし、homeworkやitemsも同様に扱います。撮影し忘れた日は、この構造そのものをnullに戻し、ディスプレイ側では「連絡帳を確認してね」という文言を表示するようにしています。
「今日の時間割のうち何コマ分が埋まっているか」も、あわせて記録しています。この数字にちょっとした使い道があります。
「埋まっているコマ数」で気づけること
時間割の欄が全部埋まっていれば、普通の一日だったと分かります。ただ、途中までしか埋まっていない日があります。
そういう日は、早退や特別日課だった可能性があります。埋まっているコマ数が想定より少ないときは、無条件で反映せず「早帰りや半日課程の可能性がある」として、確認を挟むようにしています。
連絡帳の文字を読むだけでなく、「情報量そのもの」からも気づきを拾える設計にしています。これは文字起こしの精度とは別の話で、地味に役立っている工夫です。
表示の更新をどう自動化しているか
JSONを更新したら、次の2ステップで表示を反映します。
- JSONを読み込んでHTMLを再生成するスクリプトを実行する
- ディスプレイ側のブラウザに、再読み込みの指示を送る
再読み込みの指示は、単にページを更新するだけでなく「キャッシュを消す→保存データを消す→URLを再読み込みする」という順番で行っています。ブラウザ側のキャッシュが残っていると、スクリプトを再実行しても画面が古いままになることがあるためです。
反映がうまくいったかどうかは、次のように確認しています。
- 再読み込みの各ステップが、すべて正常応答(HTTPステータス200)になっているか
- 生成したHTMLに埋め込んだ「生成時刻」のメタ情報が、期待した時刻になっているか
いずれかが失敗している場合は、ネットワーク経由での再読み込みではなく、ディスプレイ側のアプリそのものを再起動する、というフォールバック手段も用意しています。画面が一瞬暗くなるので、確認が取れた時だけ使う想定です。
表示側の工夫
ディスプレイには、その日の連絡帳の要約だけを出しています。生のテキストをそのまま表示すると、情報量が多すぎて誰も見なくなるからです。
- 今日やること(持ち物・翌日の準備)
- 判読できなかった箇所があるかどうか
- 早退などの可能性がある日はその旨
情報を絞ることで、通りがかりに一瞬見るだけで済むようにしています。
やってみて感じたこと
一番よかったのは、「誰かが気づくのを待つ」状態がなくなったことです。撮影さえしてしまえば、家族の誰でも同じ情報にアクセスできます。
一方で、AIに任せきりにはしていません。判読不可の表示が出たら、最終的には人の目で確認します。ここを飛ばすと、間違った情報がそのまま家族に伝わってしまうので、そこだけは崩さないようにしています。
こういう人に向いている
- 子どもの連絡帳やお便りを、家族で共有するタイミングがずれがちな人
- 手書き文字をAIに読ませることに関心がある人
- JSONを読んでHTMLを生成する程度の、簡単なスクリプトを組む気力がある人
まとめ
手書きの連絡帳をAIに読ませ、家のディスプレイに反映する仕組みを作りました。ポイントは、AIに推測させないこと、情報を絞って表示すること、そしてキャッシュを確実に消してから再読み込みすることだと感じています。
技術的には難しいことをしているわけではありません。ただ、こういう小さな仕組み化の積み重ねが、日々の家族の情報共有を少し楽にしてくれると思います。
スマホで撮り、ネットで届ける。それがこの仕組みの根っこです。通信まわりを整えておくのも、地味に効いてくる気がします。
本記事にはアフィリエイト広告を含みます。当サイトのリンクを経由して商品・サービスへお申し込みいただいた場合、提携先企業から成果報酬を受け取ることがあります。 また、運営者は楽天グループに所属する社員であり、紹介プログラムを通じた報酬を受け取る場合があります。記事内容・評価は広告の有無にかかわらず、運営者の実体験と調査に基づき作成していますが、 上記の関係性をご理解のうえお読みください。詳しくは免責事項・アフィリエイト表記をご覧ください。