問題:編集者がいない、ラベルもない動画アーカイブ
マサイマラでサファリロッジを運営しながらソフトウェアエンジニアとしても活動するNJ氏は、ある矛盾に直面していた。日々撮影される映像は増え続けるが、編集のボトルネックは解消されない。SNSアカウントは「コンテンツ不足」ではなく「編集時間不足」で更新が止まっていた。
初期の解決策はSaaSの組み合わせだった。Eddie AI、Higgsfield MCP、Submagic、Buffer — 月額約140ドルのスタック。しかし生成AIビデオを本物の旅行ブランドで使うリスク(TripAdvisorで致命的)と、週3〜5投稿の現実的な目標に阻まれた。
ここで著者は重要な気づきを得る。すべてのAI動画編集ツールは、映像がすでにラベル付けされている前提で設計されている。 しかし実際のアーカイブは IMG_1103.MOV が Mara june 2024 backup final FINAL に放り込まれているだけ。本当に必要なのは編集ツールではなく、検索可能なインデックスだった。
アーキテクチャ:1,400行のPythonローカルパイプライン
8つのステップで1クリップあたりのメタデータを抽出し、.description.md のサイドカーファイルとして保存する。
ffprobe— コーデック、解像度、フレームレートなどの基本メタデータを取得exiftool— iPhone、DJI、ドローンのGPS緯度経度・高度を抽出- 逆ジオコーディング — Nominatimで座標を地名に変換
ffmpeg— 5フレームを均等間隔で抜き出し、1920pxにリサイズ- WhisperX — 単語レベルのアラインメント付き文字起こし + pyannote話者分離(97言語対応)
- insightface — 顔検出、512次元ArcFace埋め込みをSQLiteデータベースに保存
- Gemma 4 31B — フレーム + 文字起こし断片 + フォルダコンテキストからYAMLフロントマターと説明文を生成
- サイドカーファイルを書き出し
# Gemma 4 が IMG_1103.MOV に対して生成したメタデータ
lighting: bright_daylight
time_of_day: midday
color_palette: warm_greens
people: 1
faces: [512次元埋め込みベクトル...]
location: "-1.234, 35.678"
description: |
サファリテントのデッキに立つエリー。
背景にサバンナが広がる。カメラが
室内から室外へパンする。
このサイドカーファイル形式の利点は3つある:プレーンテキストでgrep可能、ドライブを移動しても壊れない、中央データベースが不要。
ハードウェア:5年前のMacBookが50GBスワップで31Bモデルを動かす
2021年発売のMacBook Pro M1 Max(64GBメモリ)— 購入時はChromeタブとDaVinci Resolve用だったマシンが、5年後にローカルLLMのワークホースとして稼働している。
バルク実行時の状態:
- Gemma 4 31B Q4(28.40 GB メモリにロード)
- 50.89 GB スワップ使用(メモリプレッシャー黄色ゾーン)
- ファンはフル回転だが、1〜2日の連続実行には耐える
Apple Siliconのユニファイドメモリは、ここで真価を発揮する。同量のVRAMをGPUで確保するにはRTX 4090(24GB)を2枚挿しする必要があるが、MacBook Proなら1台で64GBをシームレスに使える。50GBのスワップは乱暴に見えるが、Appleの設計ではSSD寿命よりメモリプレッシャーを優先するトレードオフであり、短期間のバルク処理なら許容範囲内だ。
4つのバグと教訓
1. WhisperX 3.8の破壊的変更
DiarizationPipeline が whisperx.diarize に移動し、use_auth_token が token に改名された。
解決策:コンストラクタ呼び出しをイントロスペクションでラップ — token= を試し、TypeErrorが出たら use_auth_token= にフォールバック。
教訓:進化の速いAIライブラリでは、defensive constructor callsが必須。
2. Claude CLIのパーミッションエラーが成功として返る問題
--permission-mode bypassPermissions フラグを付けないと、パーミッション拒否のテキストがexit code 0で成功レスポンスとして返される。
解決策:フラグを追加 + 短いレスポンスに"I need permission"が含まれていないかチェック。
教訓:非インタラクティブモードの権限フローは、サイレント障害の温床である。
3. Gemmaが people_count: "many" を返した問題
プロンプトで「整数、ただし10人を超える場合は文字列’many’」と指定したところ、Gemmaは指示通り many を返したが、このユニオン型スキーマが後続のパーサーで予期せぬ動作を引き起こした。
解決策:スキーマを整数0〜99に固定 + レガシーパーサーで強制変換。
教訓:「intまたはこの特定の文字列」のようなユニオン型スキーマは絶対に避ける。フィールドは必ずintかstringのどちらかに統一する。自由度を与えるほど、モデルは予想外の値を生成する。
4. 夜間のバイククリップを誤って削除した問題
初期のフィルタ条件を「フォトグラファー向けポートフォリオ基準」(モーションブラー、ソフトフォーカス → 削除)に設定したところ、手ぶれの多い夜間のバイク移動クリップが削除対象になった。このクリップは技術的に低品質だが、思い出として価値があった。
教訓:技術的品質と記憶価値は直交する。削除条件は「撮影ミス(レンズキャップなど)」のみに限定すべき。
最も重要な知見:enum制約スキーマがハルシネーションを防ぐ
このプロジェクトから得られた最も普遍的な教訓は、enum制約スキーマの重要性である。
NJ氏は当初、各クリップの説明を自由形式で生成させていた。しかし「誰が映っているか」「照明条件は何か」という質問に対して、モデルがもっともらしい嘘を答える頻度が高かった。そこでスキーマを lighting は bright_daylight | golden_hour | overcast | night | indoor のようなenum値に制限し、説明文もYAMLに構造化した。この変更によりハルシネーションは劇的に減少した。LLMは自由形式の生成で最も幻覚を起こしやすく、選択肢が制限されているほど正確になるからだ。
# 悪い例:自由形式 → ハルシネーション率高
prompt = "この映像の照明条件を説明してください"
# 良い例:enum制約 → 精度向上
prompt = """以下の選択肢から照明条件を1つ選んでください:
- bright_daylight | golden_hour | overcast
- night | indoor | mixed
回答は選択肢の値のみを返してください。"""
このパターンはコードレビュー、データ分類、ログ分析にも応用できる。LLMに判断させるあらゆる場面で、出力の構造を事前に制約することで信頼性が飛躍的に向上する。
AI動画編集ツールの「間違ったレイヤー」問題
NJ氏の洞察で最も示唆に富むのは、AI動画編集スタートアップへの批判である。現在のAI動画編集ツール(Eddie AI、Descript等)は、映像がすでに整理・ラベル付けされていることを前提にしている。しかし現実のクリエイターは IMG_1103.MOV の山に埋もれている。
この「間違ったレイヤーを解決している」問題は、AIツール一般に見られる現象だ。コード生成AIは「コードが書かれていること」を前提にし、AIエージェントは「APIが整備されていること」を前提にする。真の価値は、その前提となる基盤を整えるレイヤーにある。
DaVinci Resolve StudioはIntelliSearch等の機能を内蔵しており、Eddie AIの価値の70%をカバーする。月額140ドルのSaaSスタックは22ドルに縮小された。
日本語開発者への示唆
このパイプラインは日本語の動画アーカイブにも直接応用できる。WhisperXが97言語対応のため、日本語の音声も正確に文字起こし可能だ。
- 取材映像のアーカイブ化 — インタビュー動画に自動で文字起こしと顔認識タグを付与
- 会議録の自動生成 — 社内ミーティングの録画から検索可能なナレッジベースを構築
- 旅行・イベント映像の整理 — 未整理動画から条件指定で目的のシーンを瞬時に検索
ハード面では、M4 Max(128GBメモリ)ならスワップなしでGemma 4 31Bを快適に動かせる。M1 Max(64GB)でもQ4量子化で上記と同程度のパフォーマンスが得られる。
まとめ
このプロジェクトが示したのは、5年前のコンシューマーハードウェアで、31BパラメータのローカルLLMを使った実用的な映像インデックスパイプラインが構築できるという事実だ。
重要ポイント:
- SaaSに頼らず、1,400行のPythonでローカル完結型のパイプラインを構築できる
- 50GBスワップでもApple Siliconは耐える — 短期間のバルク処理には実用的
- enum制約スキーマでLLMのハルシネーションを劇的に削減できる
- AIツールを選ぶ際は「どのレイヤーを解決しているか」を見極めるべき
- 動画編集の前に「検索可能なインデックス」を作ることが、実は最も重要なステップ
著者は次に、このインデックスを使ってDaVinci Resolveでの編集計画を自動化する予定だという。ローカルLLMのユースケースはまだ拡大し続けている。
この記事はAIによって生成され、人間の編集を経て公開されています。 Appwright AI は AI によるコンテンツ制作の可能性を探求する実験的プロジェクトです。