
2026/03/24 23:58
HNに投稿:Geminiはもはやネイティブに動画を埋め込むことができるようになりました。そこで、私はサブ秒レベルの動画検索機能を構築しました。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
SentrySearchは、音声や映像を文字起こしせずに長時間のダッシュカム動画から瞬間を素早く見つけることができる軽量Pythonツールです。各MP4ファイルを30秒間隔で重複5秒のオーバーラップ付きに分割し、480 p、5fpsへダウンサンプリングします。静止フレーム(JPEGサイズでヒューリスティックに検出)は埋め込み前にスキップされます。埋め込みはGoogleのGemini Embedding 2を使用して768次元ベクトル空間へ変換し、ローカルのChromaDBデータベースに保存します。クエリ時には最も類似したチャンクが抽出され、元のMP4から切り取られます。
テキストクエリは一度だけ埋め込みを生成し、その後は埋め込み同士を比較して最も類似するチャンクを検索します。クエリ時にテキスト埋め込みのみが行われるため、検索コストは低く抑えられます。インデックス作成の費用はフレームスキップと事前処理オプション(
--no-preprocess、--target-resolution、--target-fps)により約2.50ドル/時間程度です。ユーザーはsentrysearch indexコマンドの多数のフラグでこれらを調整できます。
検索結果はタイムスタンプ付きでランク付けされ、デフォルトでは最良クリップが保存されます。詳細情報は
--verboseオプションで確認でき、全体統計はsentrysearch statsで取得可能です。
SentrySearchはディレクトリツリー内の任意のMP4映像(Tesla Sentry Modeに限らず)をサポートし、Python 3.10+、ffmpeg(またはバンドルされたimageio‑ffmpeg)、Gemini APIキー(
sentrysearch initで設定)が必要です。Gemini Embedding 2の価格変更や動作変更がコスト/性能に影響を与える可能性があります。また、静止フレーム検出やチャンク境界処理の改善により精度向上が期待できます。
SentrySearchは車両録画から特定イベントを高速かつ低コストで取得できるため、安全解析者、保険調査官、および事故分析のためにダッシュカム映像をレビューする組織にとって有益です。
本文
ダッシュカム映像のセマンティック検索
探したい内容を入力すると、該当箇所だけが切り出されたクリップが返ってきます。
仕組み
SentrySearch はダッシュカム動画を重複するチャンクに分割し、Google の Gemini Embedding モデルで各チャンクを直接「ビデオ」ベクトル化します。生成したベクトルはローカルの ChromaDB に保存されます。検索時にはテキストクエリも同じベクトル空間へ埋め込み、保存済みビデオ埋め込みと照合。最も相性が良いチャンクを元ファイルから自動でトリミングし、クリップとして保存します。
はじめに
クローン & インストール
git clone https://github.com/ssrajadh/sentrysearch.git cd sentrysearch python -m venv venv && source venv/bin/activate pip install -e .
API キーの設定
sentrysearch init を実行すると Gemini API キーを入力させ、.env に書き込みテスト埋め込みで検証します。
$ sentrysearch init Enter your Gemini API key (get one at https://aistudio.google.com/apikey): **** Validating API key... Setup complete. You're ready to go — run `sentrysearch index <directory>` to get started.
初期化を使わない場合は
.env.example をコピーして .env にキーを手入力してください。
フッテージのインデックス作成
$ sentrysearch index /path/to/dashcam/footage Indexing file 1/3: front_2024-01-15_14-30.mp4 [chunk 1/4] Indexing file 1/3: front_2024-01-15_14-30.mp4 [chunk 2/4] … Indexed 12 new chunks from 3 files. Total: 12 chunks from 3 files.
オプション
– チャンクあたりの秒数--chunk-duration 30
– チャンク間の重複秒数--overlap 5
– ダウンスケール/フレームレート低減をスキップ(生チャンク送信)--no-preprocess
– 前処理時の高さピクセル--target-resolution 480
– 前処理時のフレームレート--target-fps 5
– 視覚変化がないチャンクも埋め込む--no-skip-still
検索
$ sentrysearch search "red truck running a stop sign" #1 [0.87] front_2024-01-15_14-30.mp4 @ 02:15‑02:45 #2 [0.74] left_2024-01-15_14-30.mp4 @ 02:10‑02:40 #3 [0.61] front_2024-01-20_09-15.mp4 @ 00:30‑01:00 Saved clip: ./match_front_2024-01-15_14-30_02m15s-02m45s.mp4
オプション
– 表示する結果数--results N
– クリップ保存先ディレクトリ--output-dir DIR
– 自動トリミングをスキップ--no-trim
統計
$ sentrysearch stats Total chunks: 47 Source files: 12
任意のコマンドに
--verbose を付けるとデバッグ情報(埋め込み次元、API 応答時間、類似度スコア)が出力されます。
なぜこれが可能なのか
Gemini Embedding 2 は生のビデオピクセルをテキストクエリと同じ 768 次元ベクトル空間へ直接埋め込むことができます。文字起こしやフレームキャプションは不要です。「red truck at a stop sign」というクエリは、30 秒間のクリップとベクトルレベルで直接比較できるため、数秒以内に数時間分の映像をセマンティック検索できます。
コスト
1 時間あたりのインデックス作成コストは Gemini の埋め込み API で約 $2.50(30 秒チャンク、5 秒重複)です。ファイルサイズではなくチャンク数がコストを決定します。
最適化
| 機能 | 効果 |
|---|---|
| 前処理(デフォルト有効) | 480p, 5fps にダウンスケールしてアップロード量とトークン数を削減。速度向上に寄与。 |
| スタイルフレームスキップ(デフォルト有効) | 視覚変化のないチャンクを除外し、API 呼び出しとコストを削減。 |
検索クエリはテキスト埋め込みのみなので、ほぼ無視できるコストです。
チューニングオプション
– 長いチャンクで重複を減らすと API 呼び出しが減りコスト低下。--chunk-duration / --overlap
– すべてのチャンクを埋め込む。--no-skip-still
– 前処理品質を調整。--target-resolution / --target-fps
– 生データで送信。--no-preprocess
制約と今後の課題
- スタイルフレーム検出はヒューリスティック(JPEG ファイルサイズ比較)で、微細な動きや静止シーンを誤判定する可能性があります。必要に応じて
で無効化。--no-skip-still - 検索品質はチャンク境界に依存します。重複ウィンドウは改善策ですが完全ではありません。シーン検出などよりスマートな分割が有望です。
- Gemini Embedding 2 はプレビュー段階であり、API 動作や価格は変更される可能性があります。
互換性
任意の MP4 フッテージに対応(Tesla Sentry Mode 限定ではありません)。ディレクトリスキャナは再帰的にすべて
.mp4 ファイルを検出します。
要件
- Python 3.10+
がffmpeg
にあるか、デフォルトでインストールされるPATH
を使用。imageio‑ffmpeg- Gemini API キー(無料)