Communitygithub.com

ever-just/agentskills

.SRT 파일에서 자막을 가져와 Remotion 비디오에 애니메이션 자막과 캡션을 추가합니다. TikTok 스타일의 단어별 강조, 가라오케 효과 등을 지원합니다.

agentskills란 무엇인가요?

이 스킬은 Remotion 비디오 프로젝트에 SRT 형식의 자막 파일을 불러와 애니메이션 효과가 적용된 자막을 손쉽게 추가할 수 있도록 해줍니다. TikTok 스타일의 단어별 하이라이트, 가라오케 효과 등 다양한 스타일링 옵션을 제공하여, 비디오 제작자가 전문적인 자막을 쉽게 구현할 수 있도록 돕습니다. TypeScript/React 기반의 오픈 소스 라이브러리인 `remotion-subtitles`를 사용하며, `npm install remotion-subtitles` 명령어로 간단히 설치할 수 있습니다. SRT 파일을 직접 로드하거나 수동으로 자막 배열을 정의할 수 있어 유연하게 사용할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ever-just/agentskills/tree/HEAD/skills/remotion-captions

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Remotion Captions — 비디오를 위한 애니메이션 자막

.SRT 파일에서 자막을 가져와 Remotion 비디오에 애니메이션 자막과 캡션을 추가합니다. TikTok 스타일의 단어별 강조, 가라오케 효과 등을 지원합니다.

개요

  • 저장소: github.com/ahgsql/remotion-subtitles
  • 언어: TypeScript / React
  • 라이선스: 오픈 소스
  • 설치: npm install remotion-subtitles
  • 필요 사항: Remotion 프로젝트

설정

npm install remotion-subtitles

기본 사용법

SRT 파일에서

import { useSubtitles, SubtitleSequence } from "remotion-subtitles";

export const CaptionedVideo: React.FC = () => {
  const subtitles = useSubtitles("./subtitles.srt");

  return (
    <AbsoluteFill>
      <Video src={staticFile("video.mp4")} />
      <SubtitleSequence subtitles={subtitles} />
    </AbsoluteFill>
  );
};

SRT 형식

1
00:00:00,000 --> 00:00:02,500
Custom Agents에 오신 것을 환영합니다

2
00:00:02,500 --> 00:00:05,000
AI 기반 이메일 플랫폼

3
00:00:05,000 --> 00:00:08,000
받은 편지함을 자동으로 관리합니다

자막 스타일링

<SubtitleSequence
  subtitles={subtitles}
  style={{
    position: "absolute",
    bottom: 80,
    left: 0,
    right: 0,
    textAlign: "center",
    fontSize: 42,
    fontWeight: "bold",
    color: "white",
    textShadow: "2px 2px 8px rgba(0,0,0,0.8)",
    fontFamily: "Inter, sans-serif",
  }}
/>

단어별 강조 (TikTok 스타일)

import { useCurrentFrame, interpolate } from "remotion";

export const WordHighlightCaption: React.FC<{
  words: { text: string; startFrame: number; endFrame: number }[];
}> = ({ words }) => {
  const frame = useCurrentFrame();

  return (
    <div style={{
      position: "absolute",
      bottom: 100,
      width: "100%",
      textAlign: "center",
      display: "flex",
      justifyContent: "center",
      gap: 8,
      flexWrap: "wrap",
      padding: "0 60px",
    }}>
      {words.map((word, i) => {
        const isActive = frame >= word.startFrame && frame <= word.endFrame;
        const scale = isActive
          ? interpolate(frame, [word.startFrame, word.startFrame + 3], [1, 1.15], { extrapolateRight: "clamp" })
          : 1;

        return (
          <span
            key={i}
            style={{
              fontSize: 48,
              fontWeight: 800,
              color: isActive ? "#FFD700" : "white",
              textShadow: isActive
                ? "0 0 20px rgba(255,215,0,0.5)"
                : "2px 2px 4px rgba(0,0,0,0.8)",
              transform: `scale(${scale})`,
              transition: "color 0.1s",
              display: "inline-block",
            }}
          >
            {word.text}
          </span>
        );
      })}
    </div>
  );
};

수동 자막 타이밍

SRT 파일이 없는 경우, 자막을 수동으로 정의할 수 있습니다:

const captions = [
  { text: "Custom Agents에 오신 것을 환영합니다", startFrame: 0, endFrame: 75 },
  { text: "AI 기반 이메일 자동화", startFrame: 80, endFrame: 150 },
  { text: "몇 분 만에 에이전트 만들기", startFrame: 155, endFrame: 240 },
];

export const ManualCaptions: React.FC = () => {
  const frame = useCurrentFrame();

  const current = captions.find(
    (c) => frame >= c.startFrame && frame <= c.endFrame
  );

  if (!current) return null;

  const progress = interpolate(
    frame,
    [current.startFrame, current.startFrame + 10],
    [0, 1],
    { extrapolateRight: "clamp" }
  );

  return (
    <div style={{
      position: "absolute",
      bottom: 80,
      width: "100%",
      textAlign: "center",
      opacity: progress,
      transform: `translateY(${(1 - progress) * 10}px)`,
    }}>
      <span style={{
        fontSize: 44,
        fontWeight: 700,
        color: "white",
        backgroundColor: "rgba(0,0,0,0.6)",
        padding: "8px 24px",
        borderRadius: 8,
      }}>
        {current.text}
      </span>
    </div>
  );
};

모범 사례

  1. 하단에 배치 — 표준 자막 위치는 중앙 하단입니다
  2. 대비 사용 — 흰색 텍스트에 어두운 그림자 또는 반투명 배경을 사용하세요
  3. 큰 글꼴 — 비디오에서 가독성을 위해 최소 40-50px을 사용하세요
  4. 짧은 구문 — 캡션당 최대 2줄, 6-8단어로 유지하세요
  5. 타이밍 버퍼 — 오디오보다 2-3프레임 먼저 자막을 시작하세요
  6. 애니메이션 진입 — 미묘한 페이드/슬라이드 인, 종료 시 애니메이션 없음
  7. 굵은 글꼴 두께 — 비디오 가독성을 위해 700 이상의 글꼴 두께를 사용하세요

출처

  • remotion-subtitles: github.com/ahgsql/remotion-subtitles
  • Remotion Audiogram template: github.com/remotion-dev/template-audiogram

Individual skills in this repo

This repo contains 9 individual skills — each has its own dedicated page.

ever-just/agentskills

> Declarative animations for React. Springs, gestures, layout animations, and page transitions. GPU-accelerated, production-ready.

ever-just/agentskills

> Create animated logos, icons, and micro-interactions as lightweight Lottie JSON files. No After Effects needed — build animations entirely in code.

ever-just/agentskills

> A TypeScript library using generators to program animations with a real-time editor. Ideal for explainer videos, code walkthroughs, and educational content.

ever-just/agentskills

> Create videos programmatically using React components. The most mature framework for code-driven video production.

ever-just/agentskills

> Copy-paste video components for Remotion. Intros, text effects, transitions, and full scene templates. Like shadcn/ui but for video.

ever-just/agentskills

Extract actionable intelligence from video content across YouTube, Vimeo, and company websites. Video reveals what text sources cannot: facility scale, team composition, product demonstrations, signage, event attendance, and operational reality.

ever-just/agentskills

Optimize and embed an existing video as a fast, crisp, autoplaying hero/background/loop on a website. Use when adding or replacing a video on a marketing site and it is too heavy, will not autoplay (especially on mobile/Safari), shows a codec error, or looks soft — to transcode it to web-safe H.264 with the right pixel format, faststart, retina-aware sizing, and a poster frame, then embed and verify it actually plays. This is optimization + embedding of footage you already have, not creating/animating a video (for that use remotion/moviepy/motion-canvas). Use when the user says "add this video to the site", "the hero video is too big / won't play / isn't crisp", "replace the homepage video", or "make this loop on the landing page".

ever-just/agentskills

Full conversion audit for any homepage or landing page. Use when someone asks to "review my homepage," "audit my landing page," "why isn't my page converting," "check my website," or wants feedback on their marketing page. Requires URL or screenshot before proceeding.

ever-just/agentskills

Automatically fetch YouTube video transcripts, generate structured summaries, and send full transcripts to messaging platforms. Detects YouTube URLs and provides metadata, key insights, and downloadable transcripts.

관련 스킬