AIと一緒に、1週間分の写真と動画をまとめるCLIツールを作った話
こんにちは、yukiです。
今日は、ここしばらく取り組んでいた個人開発について振り返ってみます。
テーマは 「1週間分の写真・動画からスライドショー動画を自動生成するCLIツール」 です。
娘の写真や動画を毎日のように撮っていると、データは自然と溜まっていきます。
週末に見返すのは楽しい一方で、「毎週1本の動画にまとめたいけど、手作業は正直つらい」という気持ちもありました。
そこで、CLI一発で週次動画を生成できる仕組みを自分で作れないか、というのが今回の動機です。
あわせて、生成AIやコード補完ツールと一緒に、設計から実装、デバッグまでどこまで実用的なものが作れるのかを試したかった、というのも大きな理由でした。
この記事で書いているツールは、最終的に以下のリポジトリとして公開しました。
👉 https://github.com/yukimomo/weekly-slideshow-engine
コードを見たい方、READMEから全体像を把握したい方は、こちらもあわせて見てもらえると嬉しいです。
何を作ったのか(完成イメージ)
作ったのは、ざっくり言うと次のようなCLIツールです。
-
OneDrive上の写真・動画フォルダをスキャン
-
指定したISO週(例: 2026-W04)に該当するデータを抽出
-
撮影日時順にタイムラインを作成
-
写真・動画を混在させたスライドショー動画を自動生成
「今週分まとめて動画にしたいな」と思ったら、
のようなイメージで実行できるところまでをゴールにしました。
技術スタック
今回使った主な技術要素は以下です。
-
Python 3.11
-
venv による仮想環境
-
MoviePy + ffmpeg(動画生成)
-
EXIF 情報取得(撮影日時)
-
pytest(スモークテスト / E2E)
-
GitHub Actions(CI)
あくまで個人ツールですが、「壊れても直せる」「後から触っても思い出せる」構成を意識しました。
開発の進め方(AIとの協業)
進め方で特に意識したのは、Issue単位・タスク単位で指示することです。
いきなり「全部作って」ではなく、
-
CLIプロジェクトの雛形を作る
-
scan → timeline → render の責務を分ける
-
ISO週から日付範囲を計算する関数を作る
といった形で、かなり細かく区切りました。
その都度、
「この関数の責務はここまで」
「この入力と出力を保証したい」
と前提を明示して相談すると、設計レビュー役としてかなり頼りになります。
結果的に、一人で書いている感覚よりも、常に壁打ち相手がいる状態で進められました。
パイプライン設計の話
全体は、次の3ステップに分けました。
-
scan
-
OneDrive上の
YYYY-MM-DDフォルダを走査 -
写真・動画を列挙
-
EXIFから撮影日時を取得(なければmtimeでフォールバック)
-
-
timeline
-
ISO週から対象日付範囲を算出
-
撮影日時順に並べる
-
写真・動画を同じ構造体で扱う
-
-
render
-
MoviePyでクリップ生成
-
解像度・レイアウトを指定して書き出し
-
この分割のおかげで、「スキャンだけ」「タイムラインだけ」を単体でテストしやすくなりました。
詰まったポイントと解決
MoviePy / ffmpeg 周りのトラブル
一番時間を使ったのは、正直ここです。
-
MoviePyのバージョン差でAPIが微妙に違う
-
ffmpegが部分インストール状態で謎エラー
-
Windows特有のパス問題
エラーを一つずつ切り分けていく中で、
「環境構築もコードの一部だな」と強く感じました。
最終的には、
-
明示的なバージョン固定
-
起動時にffmpegの存在チェック
-
CIで最低限の動画生成テスト
を入れて、かなり安定しました。
縦横混在レイアウト問題
写真と動画を混ぜると、どうしても表示が崩れます。
最初は単純に中央配置していましたが、縦写真が小さくなりすぎました。
そこで、
-
背景に写真を拡大+ぼかしで敷く
-
前面に元画像をアスペクト比維持で配置
というレイアウトに変更しました。
これだけで「それっぽさ」が一気に上がり、家族で見返す動画としてかなり満足度が高くなりました。
テストとCIを最初に入れてよかった話
最初期から pytest と GitHub Actions を入れていたのは、本当に正解でした。
-
レイアウト修正で既存処理を壊してもすぐ気づける
-
AIに「このテストを通す形で修正して」と頼める
-
気軽にリファクタリングできる
精神的な負担がかなり減ります。
趣味開発でもテスト、大事ですね。
実際に動かしてみた感想
初めて 1週間分の写真と動画が1本の動画として書き出された瞬間は、素直に嬉しかったです。
「ちゃんと使えるものができたな」という感覚がありました。
それ以上に印象的だったのは、
これはもう一人で作ったとは言えないな、という不思議な感覚です。
設計も実装もデバッグも、常に対話しながら進めていました。
一人開発なのに、孤独感がほとんどなかったのが新鮮でした。
まとめ
今回の開発を通して感じたのは、
-
小さく動くものを積み上げる重要性
-
テストとCIがあると本当に楽
-
趣味 × 実用 × AI は相性がいい
ということでした。
自分や家族のために作ったツールが、
結果的に技術的にも学びの多いプロジェクトになりました。
もし、写真や動画が溜まりがちな人、
AIと一緒に何か作ってみたい人がいたら、
ぜひ「自分の生活に直結するツール」から作ってみてください。
今回のリポジトリも、その一例として置いておきます。
👉 https://github.com/yukimomo/weekly-slideshow-engine
それでは、また。
