video-qa-gates
測定で判断する。「問題なさそう」と目視で言うことが、4秒のフリーズを見逃す原因です。
| スクリプト | 測定内容 | 失敗条件 |
|---|---|---|
scripts/qa_video.py | オーディオストリームの有無、サイズ、長さ(±許容値または最大値)、最長のほぼ静止状態(10 fpsにダウンスケールしたコピーで測定。背景のゆっくりした動きで静止が隠れないようにする)、無音(-50 dB、0.3秒以上)、統合ラウドネス(デフォルト -14 LUFS ±1.5)、トゥルーピーク(<= -1 dBFS) | いずれかの制限を超過 |
scripts/opening_density.py | 先頭数秒間の「平坦な」8x8グリッドセルの割合(輝度の標準偏差 < 5)、中央値と最大値 | オープニングがほとんど空の背景で構成されている、使用可能なフレームがN未満(= 未測定) |
scripts/subtitle_lint.py | キューあたりの行数、1行あたりの文字数、最小表示時間、1秒あたりの文字数、重なり | いずれかの違反、ゼロキューのパース(= 未測定) |
python3 scripts/qa_video.py out.mp4 --expect-size 1080x1920 --max-duration 30
python3 scripts/opening_density.py out.mp4 --seconds 3
python3 scripts/subtitle_lint.py out.vtt --max-chars 20
bash tests/run.sh # ffmpegで合成クリップを作成し、すべての欠陥が正しい理由で検出されることを確認
設計ノート(なぜこのように構築されているか)
- 終了コード3は「測定不能」を意味します。 ffmpegの欠如、読み取れないファイル、またはN未満の使用可能フレームは、決して合格にしてはいけません。
- フリーズ検出には10 fpsにダウンスケールしたコピーを使用します。 回転する光線や背景のグローは、フリーズしたシーンをフル解像度では「生きている」ように見せます。低品質コピーはそのノイズを取り除きます。制限は
--max-freeze(デフォルト 4 秒)です。クリップの最後まで続くフリーズもカウントします。 - フラッシュ/ブラックアウトフレーム(平均輝度 <8 または >247)は密度計算でスキップされます。これらはシーンについて何も語りません。
- 自分自身の良い例と悪い例から閾値を校正し、記録してください。 適切と考えるオープニングといくつか平坦なオープニングを測定し、その間に制限値を設定します。デフォルト値は出発点であり、あなたの数値は異なります。
- テスト入力が間違っている可能性があり、ゲート自体が間違っているわけではありません。
testsrc2パターンは大きな色のブロックであり、「空」と測定されます。ノイズ動画は正直なコントロールです。ゲートとテスト入力が一致しない場合、どちらが間違っているかを見つけてください。 - これらは**「本当のショート動画のように感じる」ためのプロキシ**です。合格しても楽しいとか魅力的であることを保証するものではありません。人間の苦情(「スライドデッキのように見える」「字幕が画面上のテキストを複製している」)は、新しい測定可能なゲートにすべきです。
組み合わせて使うと良いもの
cold-read-comprehension-review— 「視聴者が理解できるか」(数値では測れない部分)を評価。llm-adaptation-fidelity-check— スクリプトがソーステキストから翻案されている場合。llm-verdict-gate+ci-gate-forgery-test— 周辺プロセス用。
追加すると良いゲート(未実装)
画面監査(すべての画面上テキストボックス:重なり、プラットフォームUIのセーフエリア、字幕帯の侵入);画面上文字列の許可リスト(偽造防止);テキストサイズの下限(フレーム幅に対する%);カットのリズム(平均/最大カット長);STTによる字幕と音声の文字誤り率(<= 0.08);レンダリングされたDOM内の絵文字禁止;字幕/画面上テキストの重複率。これらにはレンダラーのDOM/タイムラインが必要なため、汎用化できません。
ランタイム依存関係:python3 -m pip install -r requirements.txt で requirements.txt をインストールしてください。Pillowは少なくとも12.3.0が必要です。オプションのモデル依存関係は上記とは別です。