コンテンツ制作 · iart-ai/ecommerce-video-skills

photo-slideshow

This skill should be used when the user asks to "make a photo slideshow", "turn photos into a video", "create a photo montage video", "make a picture slideshow with music", "build a memories/recap video from photos", "add Ken Burns pan/zoom to photos", "sync slide changes to the music beat", or "render a video from a folder of images". Covers per-photo Ken Burns motion, transitions, beat-synced timing, mixed aspect-ratio handling, captions/dates, intro/outro cards, and templating a photo folder into a finished video.

L4 高権限 · 段階的認可と監査V1 コミット固定コマンド実行ネットワーク通信ファイル書き込みDual-pass Audit
Author iart-aiGitHub iart-ai/ecommerce-video-skills ↗Stars 8License MIT(仓库根 LICENSE:「MIT License」/「Copyright (c) 2026 iart.ai」;.claude-plugin/plugin.json 与 README「## License」同声明 MIT)Commit 2bd0dd19c9
管理レベルは Skill の能力と推奨統制措置を示すものであり、品質や安全性の認証、利用可否の判定ではありません。使用の可否はユーザーおよび管理者が決定します。Agent 環境によって制約が異なるため、自動保護を仮定しないでください。第三者製 Skill の著作権は原著作者に帰属し、利用リスクは利用者が負います。

1仕組みと動作原理

唯一の鉄則:同じモーションを使用する写真は2枚と存在してはならず、その差異はインデックスシードによる決定論的疑似乱数でなければならない。

skills/photo-slideshow/SKILL.md
**No two slides may move the same way.** The instant-giveaway of an amateur slideshow is every photo doing the identical slow zoom-in. Vary direction, zoom in vs. out, and start scale per photo — but make it **deterministic** (seeded by index), so re-renders are identical and a frame-based renderer stays stable.
「変化」は視覚的な飽きを解消し、「決定論」はフレームレンダラーによる順不同レンダリングの不整合を防ぐ。

シード機構には mulberry32 + インデックスシードを採用:同一写真は常に同一モーションとなり、隣接する写真は必ず異なる。

skills/photo-slideshow/references/ken-burns.md
`mulberry32` is a tiny, fast, well-distributed 32-bit PRNG. Seed it with the photo index so photo 0 always gets the same move, but adjacent photos differ.
reference では8種類のモーションボキャブラリと「フォールバック重複回避」セーフガードを提示。

Ken Burns は transform のみ操作し、初期 scale を1.05以上にしてパン時の余白露出を防ぐ。

skills/photo-slideshow/SKILL.md
Always start scale ≥ `1.05` so a pan never exposes an empty edge.
KB の解説では、width/height の変更がレイアウト再計算、カクつき、チラつきを引き起こすと説明。

アスペクト比混在の写真には blurred-pad(ぼかし背景 + contain 前景原画)を使用し、引き伸ばしは厳禁。

skills/photo-slideshow/references/aspect-and-layout.md
Blurred-pad wins for mixed folders: it fills the frame, never crops the subject, and the soft blur reads as intentional depth rather than empty bars.
画素基準の判定条件:アスペクト比の差が15%未満なら cover、それ以外は blurred-pad を適用。

音楽先行:オフラインで1度ビートを検出して props に焼き込み、レンダリング時にフレーム単位の音声解析は行わない。

skills/photo-slideshow/references/timing-and-audio.md
The rule: **lock the music first, derive slide boundaries from it.** Detect beats once, offline, and bake them into props — audio analysis per frame is non-deterministic and slow.
スライド切り替えは2拍または4拍ごとに行い、BPMグリッドによるフォールバックも提供。

フォルダー → manifest:自然順ソート、EXIF 撮影日時、ファイル名からのキャプション抽出をすべてデータから導出。

skills/photo-slideshow/references/templating-folder.md
// natural sort so photo2 < photo10 (default lexical sort breaks this)
ファイルコピー後に信頼性が失われるため、ファイル mtime は使用しない。

画像読み込みはゲート制御(staticFile + delayRender/continueRender)が必須であり、怠ると特定フレームがブランク表示される。

skills/photo-slideshow/SKILL.md
- Photos loaded via `staticFile()`, gated with `delayRender`/`continueRender` so each image (and any caption font) is present before its frame renders — otherwise a slide pops in blank.
この要件は reference 実装では準拠されていない(second_pass 参照)。

検証ループの重点は画面の美しさではなく、「各写真が実際にロードされ、正しくリフレーミングされているか」にある。

skills/photo-slideshow/SKILL.md
A slideshow ingests a whole folder of user photos — the verify pass is mostly *did every photo actually load and reframe without distortion*.
複数アルバムを一括処理する場合は、まず代表フォルダーを1つ検証する。

トランジションは1種類のみ選択し(デフォルトは 0.4〜0.6s のクロスディゾルブ)、ビート同期のカットでない限りハードカットではなくオーバーラップさせる。

skills/photo-slideshow/SKILL.md
Pick **one** transition and keep it consistent — mixing wipes, spins and cubes screams "template."
reference では TransitionSeries + fade() を使用し、15フレーム(0.5s@30fps)で実装。

2コア機能

01シード式多様化 Ken Burns(モーションボキャブラリ + mulberry32 + 被写体アンカー)
02被写体認識アンカー(顔や注目点に応じて transform-origin を設定し、被写体のフレームアウトを防止)
033種類のアダプテーション戦略と自動判定(blurred-pad / cover / contain)
04ビート同期スライド切り替え(librosa によるオフラインビート検出 + 2/4拍切り替え + ヒットポイント動的制御)
05音声解析不要の BPM グリッドフォールバック(60/bpm × beatsPerSlide × fps)
06データ駆動型スライドショー(写真・ビート・音楽のすべてを props 化し、タイミングをデータから導出)
07純粋な FFmpeg フォールバック(zoompan による写真処理 + xfade 連結 + 音声トラック合成)
08マルチアスペクト比セーフゾーン(16:9 / 9:16 / 1:1、一度の構図設計で複数回レンダリング)

3外部依存関係

KindDependency / Endpoint
packageremotion(frame/interpolate/Easing/Img/Audio/Sequence)
package@remotion/transitions(TransitionSeries + fade)
packagesharp + exifr(读图像尺寸与 EXIF DateTimeOriginal)
packagelibrosa + soundfile(pip 安装;离线测 beat 与 onset)
cliffmpeg(blurred-pad、zoompan、xfade 与仓库共享 contact-sheet.sh)
networkiart.ai(reference 尾部推广链接,具 utm 参数;仅读者点击才请求)

4推奨統制措置と判定根拠

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: skill ディレクトリ内に同梱スクリプトはなし。SKILL.md/reference が agent に対し `node scripts/build-manifest` の実行を指示。
  • 网络端点: 外部ネットワークアクセスの宣言: 実行時に業務 API の呼び出しはなし。写真および音楽はユーザーのローカルファイルを使用。
  • 本地工作目录: ファイル読み書きと成果物の出力: ユーザープロジェクト内で `photos.json`/`props.json`、`beats.json`、`out/<name>.mp4`、`out/*.gif` を書き出し
監査ノート: 。トリガー項目は分類基準の「サードパーティのプラグイン、イメージ、リモートパッケージへの依存」であり、今回の9つの skill の中で最も依存関係の幅が広い:remotion および @remotion/transitions(npm)、sharp および exifr(npm、manifest 構築用)、librosa および soundfile(pip)、さらに ffmpeg/ffprobe。これらすべてを公開リポジトリから取得して実行する必要がある。同一リポジトリの `remotion-video` も同基準でオレンジ判定となっており、本作もそれに準拠。**明確に非該当の項目**:process.env / API キー / トークン / クッキー / キーチェーンの読み取りなし(トークンスキャンで実質的なヒットゼロ)。写真や音楽を外部サービスへアップロードしない(解析とレンダリングは完全にローカルで完結し、素材は外部に出ない)。TLS ダウングレードなし、`--no-verify` なし、サンドボックス無効化なし、対抗自動化回避なし。トリガー条件:manifest 構築、ビート検出、および動画レンダリング時のみ発生。

5二重目の独立検証

  • [discrepancy] 图片加载门控口径是否实现一致 — SKILL.md 要求 staticFile() + delayRender/continueRender 门控,但 templating-folder.md 的 Slideshow 直接把 manifest 里的文件系统路径(join(dir, f))交给 Img/KenBurnsImage,既未用 staticFile 也无 delayRender——照抄 reference 会拿不到 Remotion public/ 之外的资源,且仍可能出现空白帧。
  • [discrepancy] 被引用的「打包脚本」是否真的存在 — reference 以 `scripts/build-manifest.mjs` 文件名给出源码、SKILL.md 也写 `node scripts/build-manifest.mjs ./photos`,但仓库根 scripts/ 只有 seek-shot.sh / contact-sheet.sh / probe-mp4.sh,没有 build-manifest.mjs;`python beats.py` 同理(脚本内联在文档里)。使用前必须自行落盘。
  • [ok] 起始 scale 与运动确定性口径 — SKILL.md 的 start scale ≥ 1.05、seeded by index 与 ken-burns.md 的 `const base = 1.05;`、`mulberry32(index * 2654435761)` 完全一致。
  • [ok] 适配策略与判据是否自洽 — aspect-and-layout.md 的三策略表与 fitStrategy 阈值(<0.15 → cover)一致;SKILL.md 的 never stretch 与 blurred-pad 默认选择一致。
  • [ok] 换片节奏的量化声明 — timing-and-audio.md 的每张 3–6s、低于约 2.5s 会显仓促、每 2/4 拍换片,与 SKILL.md 的 photos hold ≥1 musical unit, not every beat 一致。
  • [unlocatable] 隐私面:照片元数据是否被提示处理 — manifest 读取 EXIF DateTimeOriginal 并把日期上屏,但全文未讨论照片 GPS/相机信息的处理与输出视频的元数据策略;源码内定位不到任何隐私处理声明,记 unlocatable(能力缺口,不作为档位依据)。

6結論

  • 「写真ごとに異なるモーション」を実装可能な仕組み(インデックスシード + モーションボキャブラリ)に落とし込み、フレームレンダリングの決定論を維持
  • 混在アスペクト比の写真に対する最適なデフォルト解と判定基準を備え、引き伸ばしによる歪みを排除
  • 音楽先行のエンジニアリング:オフラインで一度検出し props に焼き込むことで、フレームごとの音声解析による非決定論性を回避
  • manifest が自然順ソート、EXIF、ファイル名キャプションといった実際のアルバムにおける落とし穴を網羅的に処理
  • Node 環境がない場合でも完全な FFmpeg パイプラインを残しており、利用境界が明確
  • 最適な用途: アルバムフォルダー丸ごとを1本の完成動画に変換するシナリオ:結婚式、旅行、年間ダイジェスト、メモリアル動画など。縦横の写真が混在し、Ken Burns の躍動感、音楽ビートに同期したスライド切り替え、日付キャプション、再利用可能なテンプレートパイプラインが求められる用途。
    不向きな用途: 静止画カード1枚のみの作成。ナレーションによるストーリーテリングが尺を主導する場合(presentation-video を推奨)。依存関係のインストールやスクリプト配置を許容しない環境。
    Install Agent-Ready
    ① Verified Mirror 2026-09-28
    Option A · Direct DownloadDownload photo-slideshow.tar.gz
    sha256: 58ffd9961bdf764e…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit 2bd0dd19c9.