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

audiogram

このスキルは、ユーザーが「オーディオグラムを作成したい」「ポッドキャストを動画に変換したい」「波形動画を作成したい」「ポッドキャストのクリップ動画を作りたい」「音声を動画に変換したい」「波形/オーディオバーをアニメーションさせたい」「ナレーションに動く波形を追加したい」「ポッドキャストの引用用に正方形/縦型のクリップを作成したい」と求めた場合に使用します。振幅連動の波形、周波数バー、同期字幕、カバーアートのレイアウト、プログレスバー、1:1 / 9:16 のソーシャル向けフレーミングをカバーします。

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

1仕組みと動作原理

落とし穴を防ぐ唯一の鉄則:バー/波形の高さは現在のフレームから導出する必要があり、リアルタイムの AnalyserNode + rAF ループは絶対に使用しないこと。

skills/audiogram/SKILL.md
**Drive every bar height from the current frame, never from a real-time analyser loop.**
ここでの処理:「波形アニメーション」をオーディオコールバックからフレーム駆動の関数へと移行させます。これはヘッドレスレンダリング環境で正常に出力するための前提条件であり、他のすべてのレイアウト規律はこの上に成り立っています。

仕組みの解説:リアルタイム分析は「今この瞬間に再生されている音」を読み取りますが、レンダラーはフレームを順不同または可変速度で描画するため、波形が音ズレしたり停止したりします。

skills/audiogram/SKILL.md
Live `AnalyserNode` + `requestAnimationFrame` reads "what is playing right now" — but a video renderer paints frames out of order and faster/slower than real time, so the wave desyncs or freezes.
ここでの処理:単なる禁止事項ではなく因果関係を説明することで、エージェントが「canvas を使って自前で描画する」際にも適切なアプローチ(フレーム単位のサンプルへのオフラインデコード)を選択できるようにします。

2つの実装ルートを個別の API にバインド:スペクトルバーには visualizeAudio、滑らかなオシロスコープ波形には visualizeAudioWaveform を使用。numberOfSamples は必ず 2 の累乗である必要があります。

skills/audiogram/SKILL.md
`numberOfSamples` must be a power of two (16/32/64); use 16–32 for a chunky branded look, 64+ for a detailed spectrum.
ここでの処理:「技術選定」を対照表(バー=音楽/躍動感、波形=声/ミニマル)として明記し、直接的なエラーや歪みの原因となる厳格な制約を提示します。

センター配置のイコライザーは、低周波数が中央に配置されるよう、前半部分を両端にミラーリングする必要があります。

skills/audiogram/SKILL.md
For a centered equalizer, take the first N bars and **mirror** them around the middle so the bass sits in the center.
ここでの処理:スペクトルが左から右へ並ぶ際に中心が高周波になってしまう視覚的課題を純粋な幾何学ルールで解決します。reference に `[...half.reverse(), ...half]` の完全な実装コードが記載されています。

長尺音声を丸ごとロードしないこと:事前に 90 秒以下にトリミングするか、useWindowedAudioData(HTTP range リクエストにより現在のフレーム付近のみを取得)に切り替えます。

skills/audiogram/SKILL.md
For anything long, trim first or use `useWindowedAudioData()`, which fetches only the audio around the current frame via HTTP range requests.
ここでの処理:「ポッドキャスト1エピソード分」のコストとメモリ負荷の問題を事前に解決します。また、これが本スキルにおける「オンデマンドのバイト取得」を伴う唯一の挙動です(ローカルファイル時はネットワーク不使用)。

レイアウトは5つのレイヤー(背景 / カバー+タイトル / 波形 / 字幕スロット / プログレスバー)に固定され、プログレスバーは frame/durationInFrames の純粋関数として動作します。

skills/audiogram/SKILL.md
const progress = useCurrentFrame() / durationInFrames; // 0 → 1
ここでの処理:レイヤー構造により「単一のレイアウトを 1:1 / 9:16 / 16:9 に切り取っても破綻しない」状態を担保します。プログレスバーも音声データに依存せずフレーム駆動を維持します。

字幕の仕組みは本スキル内では実装せず、明確に caption-animation(別リポジトリのスキル)へ委譲します。本スキルはレイアウト内に字幕トラックを配置し、同一の音声クロックを共有する役割のみを担います。

skills/audiogram/SKILL.md
The mechanics of word-by-word reveal, active-word highlighting, and SRT/JSON timing belong to the **caption-animation** skill
ここでの処理:パッケージ(リポジトリ)間での機能委譲を行います。トレードオフとして、youtube パッケージのみを導入している環境では字幕機能が利用できず、SKILL.md にはこの依存関係についての明示的な注意書きがありません。

1つの原稿からマルチ画角を展開:レターボックス(黒帯)を追加するのではなく、同一コンポーネントに対して複数の Composition を登録して再フレーミングします。

skills/audiogram/SKILL.md
Design once inside the center safe zone, then reframe — don't letterbox.
ここでの処理:reference では Audiogram-1x1 と Audiogram-9x16 の2つの登録例が提示され、durationInFrames = round(audioData.durationInSeconds × fps) を使用して実際の音声尺と同期させます。

HEAVY ティアの検収における中核は「オフラインベイク」:レンダリング時には音声分析を行わず、サンプルを props にベイクするか useAudioData で事前デコードします。

skills/audiogram/SKILL.md
never analyse audio at render time; headless render has no realtime audio clock.
ここでの処理:「リアルタイムクロックを排除する」ことを設計制約として直接組み込みます。これこそがリアルタイム可視化ライブラリとの最も根本的な境界線となります。

検証ループは「再現性+不具合防止」の2点に焦点を当てる:静止画の波形の高さがその瞬間の音声振幅と一致し字幕と同期していることを確認し、同時にカバー画像の欠落、字幕の見切れ、バーのはみ出しをチェックします。

skills/audiogram/SKILL.md
This is HEAVY tier: the deliverable is a real **MP4** (audio muxed in), and the waveform must be *data-driven* — its shape at any frame must match the audio at that time.
ここでの処理:「波形のように見える」ことと「実際にその音声の波形である」ことを明確に区別し、高コストなエンコードを実行する前に静止画を用いて音ズレを捕捉します。

2コア機能

01ミラーリングされたスペクトルイコライザー(visualizeAudio、numberOfSamples は 2 の累乗、smoothing のオン/オフ切り替え対応)
02滑らかなオシロスコープ波形(visualizeAudioWaveform、声/ポッドキャストに適した落ち着いた表現)
035層レイアウト(背景 / カバー+タイトル / 波形 / 字幕スロット / プログレスバー)およびカバー・タイトル領域
04実際の音声の多重化(<Audio> または staticFile)、書き出された MP4 に確実に音声を付与
051つの原稿からマルチ画角を展開:同一コンポーネントで 1:1 / 9:16 / 16:9 を登録し、durationInFrames は実際の音声尺から算出
06長尺音声対策:90秒以下にトリミングするか、useWindowedAudioData を使用してオンデマンドでバイト取得
07ゼロ依存の Web Audio + canvas バリアント(フレーム単位の RMS へのオフラインデコード、決定論的なフレーム描画)
08字幕レイヤー(caption-animation 経由)+ 9:16 における下部 18% の禁止区域などのセーフゾーン準拠

3外部依存関係

KindDependency / Endpoint
package@remotion/media-utils(useAudioData / useWindowedAudioData / visualizeAudio / visualizeAudioWaveform)
clinpx remotion still / render / compositions
cliscripts/contact-sheet.sh + scripts/probe-mp4.sh(仓库根共享验证工具箱,SKILL.md 明列)
network(条件式)useWindowedAudioData 对远程音频走 HTTP range 请求;本地 staticFile 时无网络
cli跨包委派:caption-animation(位于另一仓库 iart-ai/tiktok-video-skills)

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

安全運用のための推奨統制措置
Agent 向け
段階的・都度認可、サンドボックス推奨
管理者向け
承認フロー、ロールバック可能、全履歴監査
判定根拠(ファイルパスと抜粋)
  • scripts/: ローカルスクリプトまたはコマンドの実行: (SKILL.md に明記された検証ループ)`npx remotion still Audiogram out/f-{start,mid,end}.png -`
  • 网络端点: 外部ネットワークアクセスの宣言: `npx remotion …` および `@remotion/media-utils`: 初回実行時に npm 公式ルート経由でパッケージを取得(registry.npmjs.or)
  • 本地工作目录: ファイルの読み書きとアーティファクト出力: 本スキルに基づきエージェントが構築した Remotion プロジェクトおよび out/audiogram.mp4(1:1 の場合は out/clip-square.mp4)
監査ノート: 3段階の自己証明:① 判定対象=skills/audiogram/(find により SKILL.md、references/waveform-render.md、0 バイトの README のみであることを確認。スクリプトおよびアセットはゼロ);② ディレクトリ自体の挙動=素材(音声/カバー画像)のローカル読み込みとローカル書き込み(Remotion プロジェクト、out/*.mp4、静止画、sheet.png)+ローカル CLI(`npx remotion`;ffmpeg/ffprobe はリポジトリ直下の scripts/ 経由)。skills/ 配下全体で `process.env` / `api[_-]?key` / `token` / `cookie` / `https?://` のヒット件数はゼロ;③ ネットワーク接触は npm 公式ルート経由のパッケージ取得(remotion / @remotion/media-utils)のみであり、サイト内の Blue ティア先例(hyperframes、general-video、motion-background)と同一水準。useWindowedAudioData の range リクエストは音声ソースがリモートの場合にのみ発生し、スキル自律的な外部発信ではなくユーザー入力に起因。Yellow/Orange への昇格対象外:固定公開エンドポイントへの問い合わせなし、スクレイピングなし、認証情報/環境変数の読み取りゼロ。Red ティア非該当:TLS ダウングレードなし、サンドボックス無効化なし、アンチオートメーション回避なし、任意コード実行の余地なし。特記事項(判定変更なし):別リポジトリに存在する caption-animation へのクロスパッケージ委譲については、バッチ4 細則1 に基づき波及的なティア引き上げは行わない。youtube パッケージのみ導入時に字幕機能が欠落する点についてはリスクとして記載。

5二重目の独立検証

  • [ok] 「禁止实时 analyser」是否在 reference 的两条实现路线里都成立(防第一遍只信开头那句) — Remotion 路线:Bars 组件用 `useAudioData(staticFile(src))` + `visualizeAudio({ audioData, frame, fps, numberOfSamples, smoothing: true })`,值是 frame 的纯函数。canvas 路线:reference 明写 `No Remotion. Decode the file once to a per-frame amplitude array (RMS per frame), then a deterministic loop draws each frame`,并在末尾注明实时 AnalyserNode 只能用于实时预览——`// but never use it to drive a deterministic/offline render.`。两条路线都守住了铁律,且都点名了不得使用实时分析。
  • [discrepancy] windowInSeconds 参数在两处的语义是否一致(第一遍漏检) — SKILL.md 在「长文件」小节把 windowInSeconds 用在 `useWindowedAudioData(staticFile("full-episode.mp3"), fps, /* windowInSeconds */ 10)`——语义是「HTTP range 抓取窗口」;而 reference 的参数速查表写 `| windowInSeconds | visualizeAudioWaveform | small (≈1/fps) tracks per-frame amplitude |`——语义是「逐帧幅度分析窗口」,且 §参数示例里 `windowInSeconds: 1 / fps` 出现在 visualizeAudioWaveform 调用中。两个 API 确实各有同名参数,但文档未区分说明,读者极易把「抓取窗口」与「分析窗口」混为一谈(设成 1/fps 去抓长音频,或设成 10 去分析都会出问题)。属对 pin commit 有效的表述出入,非能力虚假。
  • [unlocatable] 「80% 静音观看」「加字幕显著提升留存」是否有据 — SKILL.md 写 "the captions carry the message for the 80% who watch on mute" 与 "subtitled video holds attention far longer",仓库内无引用来源与数据文件;只读侦查不验证,仅记为文档声明。
  • [discrepancy] 跨包字幕委派会不会造成「只装本包即能力缺失」 — SKILL.md 把词级字幕机制交给 `caption-animation`,但该 skill 位于**另一个仓库** iart-ai/tiktok-video-skills(本包目录树内不存在)。youtube 包的 .claude-plugin/plugin.json 只声明本包两个 skill,README 也未提示这一跨包依赖。结论:只安装 youtube 包时,本 skill 的「captions carry the message」这一层需要用户自行补装另一包,SKILL.md 未说明——属真实的安装面缺口(不影响档位)。
  • [ok] HEAVY tier 的「离线烘焙」要求是否与 reference 的实现一致 — SKILL.md 要求「Bake the amplitude/waveform samples into props (or decode once via useAudioData) offline — never analyse audio at render time」,reference 的两条路线恰好各对应一半:Remotion 路线在一次解码后按帧取值,canvas 路线预先把整轨解码为每帧 RMS 数组。要求与实现一致,不是空头约束。
  • [ok] 一稿多幅与真实音频长度对齐是否落实 — reference §Full audiogram composition 末尾给出 1x1 与 9x16 两个 `<Composition>` 注册示例,并写 `Set durationInFrames from the actual clip length: Math.round(audioData.durationInSeconds * fps), or read it ahead of time with getAudioDurationInSeconds() and feed it via calculateMetadata.`;批量命令 `npx remotion render Audiogram-1x1 …` / `Audiogram-9x16 …` 亦给出。

6結論

  • 1つの鉄則とメカニズムの説明により、「波形アニメーション」をオーディオコールバックからフレーム駆動の関数へ移行。canvas 代替ルートでもオフラインデコードを義務付け、スタック変更時も規律を維持
  • 技術選定に対照表と厳格な制約(バー vs 波形、numberOfSamples は 2 の累乗、低音域中央配置のためのミラーリング)を設け、手順に従うだけでプロ仕様の品質を実現
  • 事前のコスト抑制:まずは 90 秒以下にトリミングし、長尺音声には windowed 取得を適用することで、ポッドキャスト1話分を丸ごとメモリに読み込む事態を回避
  • 明確な成果物契約:音声を MP4 に確実に多重化し、サンプルはオフラインで準備され、成果物は使い捨てのファイルではなく再実行可能なプロジェクトとして納品
  • 再フレーミングによるマルチ画角対応(1:1 / 9:16 / 16:9)と、9:16 下部 18% の禁止区域に関する明確なルールを保持
  • 「波形らしく見える」ことと「確実に該当音声の波形である」ことを分離した検証:静止画で振幅と字幕の同期を照合し、長時間のエンコード後に音ズレが発覚するリスクを防止
  • 最適な用途: 適しているケース:ポッドキャスト、対談、ナレーションなどの音声をソーシャル向けショート動画(Reels/TikTok/Shorts/1:1 フィード投稿)に変換したい場合。ナレーションに「音が鳴っている」視覚的シグナルを追加したい場合。単一の原稿から 1:1 と 9:16 の両画角を書き出し、実際の音声を成果物にミックスする必要があるプロジェクト。「エンコードのコストを支払う前に、まず3枚の静止画で波形と字幕の同期を確認する」ワークフローを受け入れ可能な場合に適しています。
    不向きな用途: 適していないケース:① 音楽 MV や厳密な音画同期が求められる作品(本スキルは振幅連動のビジュアライズであり、ビート検出やスコア同期は行いません);② 長尺音声のそのままの書き出し(90秒を超え、トリミングを行わない場合はコストのミスマッチが発生);③ ネイティブ字幕機能が必要であるにもかかわらず youtube パッケージのみがインストールされている環境(caption-animation を利用するために tiktok パッケージも同時に導入すべきです);④ リアルタイムビジュアライズやライブ配信用途(設計自体がオフラインの決定論的レンダリング向けです);⑤ 無音環境またはテキストのみの動画(音声が存在しない場合、本スキルの中核となる視覚要素が無意味になります)。
    Install Agent-Ready
    ① Verified Mirror 2026-09-28
    Option A · Direct DownloadDownload audiogram.tar.gz
    sha256: 77694b043f16eba0…
    Option B · Copy Guide for Agent
    install.json
    Agent はこの JSON ガイドから自動的にダウンロードして検証します。
    ② Upstream GitHub
    GitHub Repo ↗
    Pinned to commit f3df381d65.