Communitygithub.com

Remotion 字幕 — 動画用アニメーション字幕

SRTファイルからRemotion動画にアニメーション付きの字幕やキャプションを追加します。TikTokスタイルの単語単位ハイライト、カラオケ効果などに対応。

Remotion 字幕 — 動画用アニメーション字幕 とは?

このスキルは、SRT形式の字幕ファイルを基にRemotion動画にアニメーション付き字幕を追加するためのパッケージ「remotion-subtitles」を提供します。TikTokやカラオケ風の単語単位ハイライト、フェードインやスケール変化などのエフェクトを簡単に実装可能です。TypeScript/Reactベースで、npm installで導入でき、Remotionプロジェクトと組み合わせて使用します。基本的な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 テンプレート: 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.

関連スキル