MCPInstall

audiogram

This skill should be used when the user asks to "make an audiogram", "turn a podcast into a video", "create a waveform video", "make a podcast clip video", "convert audio to video", "animate a waveform/audio bars", "add a moving waveform to my voiceover", or "make a square/vertical clip for a podcast quote". Covers amplitude-driven waveforms, frequency bars, synced captions, cover-art layout, a progress bar, and 1:1 / 9:16 social framing.

Installs
720
Last 24h
+16
Trending rank
#6668
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/iart-ai/youtube-video-skills --skill audiogram
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads audiogram automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Audiogram

Turn an audio clip — a podcast highlight, a voiceover, a quote — into a short, captioned video that stops the scroll in a muted feed. The moving element (a waveform or equalizer bars) signals "there is sound here," the captions carry the message for the 80% who watch on mute, and cover art + title + a progress bar give it a finished, branded frame.

When to use

  • A podcast soundbite or quote clip for Reels / TikTok / Shorts / feed posts.
  • A voiceover or narration that needs a visual so it can post as video.
  • Music or any audio where a reactive waveform/bars is the hero.

The one rule that prevents 90% of bugs

Drive every bar height from the current frame, never from a real-time analyser loop. 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. Instead, decode the whole file to amplitude samples once, then compute the displayed value as a pure function of the frame. In Remotion this is useAudioData() + visualizeAudio(); in plain canvas it is decodeAudioData() into a sample array you index by frame.

import { useAudioData, visualizeAudio } from "@remotion/media-utils";
import { useCurrentFrame, useVideoConfig } from "remotion";

const audioData = useAudioData(staticFile("episode.mp3"));
if (!audioData) return null; // still loading
const { fps } = useVideoConfig();
const bars = visualizeAudio({
  audioData,
  frame: useCurrentFrame(),
  fps,
  numberOfSamples: 32, // MUST be a power of two
}); // → Float array, length 32, each 0–1, low freq → high freq

Two ways to render the wave

LookDataAPIBest for
Equalizer barsfrequency spectrum, values 0–1visualizeAudio()music, energy, "feed the bars"
Smooth oscilloscope wavetime-domain amplitude, −1…1visualizeAudioWaveform()voice, podcasts, a calm minimal look

visualizeAudio returns lows on the left, highs on the right. For a centered equalizer, take the first N bars and mirror them around the middle so the bass sits in the center. numberOfSamples must be a power of two (16/32/64); use 16–32 for a chunky branded look, 64+ for a detailed spectrum. See references/waveform-render.md for full bars and oscilloscope components.

Long files: don't load the whole episode

useAudioData() reads the entire file into memory — fine for a 30–90s clip, slow and memory-heavy for a full episode. For anything long, trim first or use useWindowedAudioData(), which fetches only the audio around the current frame via HTTP range requests.

import { useWindowedAudioData } from "@remotion/media-utils";
const { audioData } = useWindowedAudioData(
  staticFile("full-episode.mp3"),
  fps,
  /* windowInSeconds */ 10,
);

Best practice: trim to the soundbite (≤90s) before rendering. A tight clip is a better social asset and a lighter render.

The layout

A finished audiogram is five stacked layers. Keep them in fixed zones so one composition crops cleanly to every aspect.

LayerJobNotes
Backgroundbrand color / subtle gradient / blurred covernever busy enough to fight captions
Cover art + titlewho/what this issmall square cover + episode/show title, top zone
Waveform / barsthe motion that signals audiocenter band, the hero element
Captionsthe message, for muted viewershigh contrast, one short phrase at a time
Progress barhow far through the clipthin bar driven by frame / durationInFrames
// progress bar — a pure function of frame, no audio needed
const { durationInFrames } = useVideoConfig();
const progress = useCurrentFrame() / durationInFrames; // 0 → 1
<div style={{ width: `${progress * 100}%`, height: 6, background: "#fff" }} />

Captions synced to speech

Captions are not optional — most feed video plays muted, and subtitled video holds attention far longer. Generate word/phrase timings with a transcription step (Whisper / @remotion/captions parseSrt), then show one short phrase at a time, switching on its start frame. The mechanics of word-by-word reveal, active-word highlighting, and SRT/JSON timing belong to the caption-animation skill — use it for the caption layer rather than duplicating it here. This skill's job is to place that caption track inside the audiogram layout and keep it synced to the same audio clock the waveform uses.

Social framing

Design once inside the center safe zone, then reframe — don't letterbox.

AspectUseResolutionLayout
1:1feed posts1080×1080cover+title top, wave center, captions lower third
9:16Reels / TikTok / Shorts1080×1920more vertical breathing room; keep captions clear of bottom 18% (UI)
16:9YouTube, landing embed1920×1080wave wide and low, captions centered

Make the clip playable on mute and on sound: the waveform + captions must tell the whole story silently, while the actual audio track plays for anyone who taps. Always include the real audio with <Audio src={...} /> so the export carries sound.

Output checklist

  • Bar/wave height is a pure function of useCurrentFrame() — no live analyser loop.
  • numberOfSamples is a power of two; centered bars are mirrored around the middle.
  • Clip trimmed to ≤90s, or useWindowedAudioData() for long source.
  • Captions present, high-contrast, synced to the same audio clock (via caption-animation).
  • Cover art + title + progress bar render; progress = frame / durationInFrames.
  • Real audio muxed in (<Audio>); story still reads with sound off.
  • 1:1 + 9:16 (and 16:9 if needed) from one composition, key content in the safe zone.

Deliver & verify (rendered stills → MP4)

Packaged helper (scripts/): tile your stills with scripts/contact-sheet.sh sheet.png f-hook.png f-mid.png f-end.png, then assert the encode with scripts/probe-mp4.sh out.mp4 [WxH] [fps]. See scripts/README.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. Verify a few frames as stills before paying for the full encode.

Output contract:

  • A Remotion project with the audiogram registered (<Composition> + zod schema + defaultProps), all motion frame-driven — no Date.now() / Math.random() / timers, and no realtime analyser.
  • Bake the amplitude/waveform samples into props (or decode once via useAudioData) offline — never analyse audio at render time; headless render has no realtime audio clock.
  • Deliverable = the rendered out/*.mp4 (audio muxed via <Audio src={staticFile()}>) plus the project, so the user can re-render with new audio/captions.

Verify loop — render stills → inspect → encode.

# 1. Frame-exact stills at start / mid / end, WITH SHIPPED PROPS (not just defaultProps)
npx remotion still Audiogram out/f-start.png --frame=0   --props=./props.json
npx remotion still Audiogram out/f-mid.png   --frame=N   --props=./props.json
npx remotion still Audiogram out/f-end.png   --frame=N-1 --props=./props.json   # last = durationInFrames-1

# 2. Inspect each PNG — fidelity (waveform/bar heights match the audio's amplitude at
#    that exact time; the right caption phrase is on screen and synced) AND artifacts
#    (missing cover art, caption off-canvas / under the bottom UI band, bar overflow).

# 3. Only once the stills check out, encode the full video (audio muxed):
npx remotion render Audiogram out/audiogram.mp4 --props=./props.json
  • The waveform is data-driven — verify amplitude + caption sync at a few frames before the full render, so a desync is caught once, not after a long encode.
  • Use npx remotion compositions to read durationInFrames/fps and pick the end frame.
  • README demo: npx remotion render Audiogram out/demo.gif --codec=gif (silent, but proves the motion).

Before you finish:

  1. npx remotion still renders cleanly at frame 0, mid, and last — no errors, no missing cover/audio assets.
  2. Bar/wave height at each checked frame matches the audio's amplitude there; the correct caption phrase is on screen and synced.
  3. Frame-driven only — no realtime analyser / Date.now() / Math.random() / timers; samples baked offline.
  4. Captions stay inside the safe zone (clear of the bottom ~18% UI band) at every checked frame; cover art + title + progress bar present.
  5. Full MP4 encoded with real audio muxed in and plays; (optional) GIF rendered for the README.

Reference files

  • references/waveform-render.md — complete runnable components for both looks: a mirrored frequency-bar equalizer and a smooth oscilloscope wave (visualizeAudio / visualizeAudioWaveform), the full five-layer audiogram composition with cover art, title, progress bar and audio mux, a power-of-two/smoothing cheat sheet, and a dependency-free Web Audio + canvas variant that decodes to a per-frame sample array. Ends with build/attribution notes.

FAQ

What does the audiogram skill do?

This skill should be used when the user asks to "make an audiogram", "turn a podcast into a video", "create a waveform video", "make a podcast clip video", "convert audio to video", "animate a waveform/audio bars", "add a moving waveform to my voiceover", or "make a square/vertical clip for a podcast quote". Covers amplitude-driven waveforms, frequency bars, synced captions, cover-art layout, a progress bar, and 1:1 / 9:16 social framing.

How do I install audiogram?

Run npx skills add https://github.com/iart-ai/youtube-video-skills --skill audiogram in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/audiogram/ (personal) or .claude/skills/audiogram/ (project).

Which AI agents can use audiogram?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is audiogram safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains audiogram?

It is published by iart-ai in iart-ai/youtube-video-skills. It has 720 recorded installs.

More from iart-ai/youtube-video-skills

View all →

youtube-intro-outro

iart-ai/youtube-video-skills

This skill should be used when the user asks to "make a YouTube intro", "create a channel intro", "build a logo sting/bumper", "design an outro / end screen / end card", "add subscribe and next-video cards", "make an intro animation", "build a reusable intro template", or "sync the logo reveal to an audio sting". Covers the 3-5s branded intro, the last-20s end-screen outro inside YouTube's element safe zones, timing conventions, audio-sting sync, and a swap-the-brand template.

Media & Creative733 installs

Popular media & creative skills

View category →

hyperframes

heygen-com/hyperframes

Read first to make, edit, animate or render any video with HyperFrames (HTML rendered to video), including launch films, explainers, music videos, charts, maps, vertical clips, title cards, captions and overlays. Holds the render contract, the work loop and what each kind of video needs.

Media & Creative1.2M installs

media-use

heygen-com/hyperframes

Get or make any media for a HyperFrames video - music, sound effects, images, icons, logos, voiceover, avatar and generated video, transcripts, cutouts, colour grades and looks - with HeyGen or free local tools, and mix placed audio. Also for footage that looks dark, flat or dull, or should be stylized or hidden.

Media & Creative1.1M installs

hyperframes-registry

heygen-com/hyperframes

About 450 ready-made HyperFrames blocks and components installed as editable source - transitions, overlays, titles, kinetic type, captions, charts, map overlays, 3D, camera moves. Use it before hand-building any named visual (CRT scanlines, glitch, film grain, a chart); also for hyperframes add and catalog.

Media & Creative1M installs

hyperframes-creative

heygen-com/hyperframes

Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use hyperframes-animation.

Media & Creative916.5K installs

ai-video-generation

101-skills/superpowers

Generate AI videos with Google Veo, Seedance 2.0, HappyHorse, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 2.0, HappyHorse 1.0, Wan 2.5, Grok Imagine Video, OmniHuman, Fabric, HunyuanVideo. Capabilities: text-to-video, image-to-video, reference-to-video, video editing, lipsync, avatar animation, video upscaling, foley sound. Use for: social media videos, marketing content, explainer videos, product demos, AI avatars. Triggers: video generation, ai video, text to video, image to video, veo, animate image, video from image, ai animation, video generator, generate video, t2v, i2v, ai video maker, create video with ai, runway alternative, pika alternative, sora alternative, kling alternative, seedance, happyhorse

Media & Creative881.5K installs

ai-image-generation

101-skills/superpowers

Generate AI images with GPT-Image-2, FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: GPT-Image-2, FLUX Dev LoRA, FLUX.2 Klein LoRA, Gemini 3 Pro Image, Grok Imagine, Seedream 4.5, Reve, ImagineArt. Capabilities: text-to-image, image-to-image, inpainting, LoRA, image editing, upscaling, text rendering. Use for: AI art, product mockups, concept art, social media graphics, marketing visuals, illustrations. Triggers: flux, image generation, ai image, text to image, stable diffusion, generate image, ai art, midjourney alternative, dall-e alternative, text2img, t2i, image generator, ai picture, create image with ai, generative ai, ai illustration, grok image, gemini image, gpt image, openai image, chatgpt image

Media & Creative880.3K installs