tiktok-promo-video
0
总安装量
1
周安装量
安装命令
npx skills add https://github.com/yusuketsunoda/ppt-trans --skill tiktok-promo-video
Agent 安装分布
amp
1
cline
1
opencode
1
cursor
1
continue
1
kimi-cli
1
Skill 文档
TikTok Promo Video (Remotion)
PPT翻訳SaaSã®TikTok縦åããã¢åç»ãRemotionã§ä½æã»ç·¨éããã¹ãã«ã
When to Use This Skill
- TikTokããã¢åç»ã®æ°è¦ã·ã¼ã³ä½æã»æ¢åã·ã¼ã³ç·¨é
- åç»ã®æè¨ã»ã¿ã¤ãã³ã°ã»ã¬ã¤ã¢ã¦ãä¿®æ£
- æ°ããCompositionï¼A/Bããªã¢ã³ãï¼ã®è¿½å
- ã³ã³ãã¼ãã³ã追å ã»ä¿®æ£
- ã¬ã³ããªã³ã°ã¨ãããã°
Project Structure
promo-video/
âââ package.json # Remotion + Reactï¼ãã¼ã¸ã§ã³ã¯package.jsonåç
§ï¼
âââ tsconfig.json
âââ public/screenshots/ # ã¹ã¯ãªã¼ã³ã·ã§ããç´ æ
â âââ upload.png
â âââ dashboard-empty.png
â âââ landing.png
âââ src/
âââ index.ts # registerRoot(RemotionRoot)
âââ Root.tsx # Compositionç»é²ï¼Folder + Compositionï¼
âââ constants.ts # å
¨å®æ°: FPS, ãµã¤ãº, ã·ã¼ã³å°º, ã«ã©ã¼, ã³ãã¼
âââ fonts.ts # NotoSansJP (@remotion/google-fonts)
âââ motion.ts # ã¢ãã¡ã¼ã·ã§ã³ã¦ã¼ãã£ãªãã£
âââ index.css # Tailwind (optional)
âââ TikTokAd.tsx # Adçã¡ã¤ã³ (Sequence)
âââ TikTokPromo.tsx # LPçã¡ã¤ã³ (TransitionSeries)
âââ components/
â âââ Background.tsx # ãã¼ã¯èæ¯
â âââ SafeArea.tsx # TikTokå®å
¨é å (top:160, bottom:260)
â âââ KineticLine.tsx # ããã¹ã表示ï¼emphasis, veil対å¿ï¼
â âââ Icons.tsx # SVGã¢ã¤ã³ã³ï¼Bolt, Shield, Table, Globe, Pen, Arrowï¼
â âââ TapRing.tsx # ã¿ããã¢ãã¡ã¼ã·ã§ã³
â âââ TimerBadge.tsx # ã¿ã¤ãã¼è¡¨ç¤º
â âââ ProgressBar.tsx # ããã°ã¬ã¹ãã¼
â âââ GlowEffect.tsx # ã°ãã¼æ¼åº
â âââ PhoneMockup.tsx # ã¹ããã¢ãã¯
âââ scenes/
âââ HookScene.tsx # LP: ããã¯ï¼èª²é¡æç¤ºï¼
âââ SolutionScene.tsx # LP: 証æ ï¼ã¿ã¤ãã¼ + ã¹ã¯ã·ã§ï¼
âââ DemoScene.tsx # LP: ç·¨éãã¢ï¼1è¡ä¿®æ£ï¼
âââ FeaturesScene.tsx # LP: ç¹å¾´ã«ã¼ãï¼éã/表ã翻訳/å¤è¨èª/ç´ããï¼
âââ CTAScene.tsx # LP: CTAï¼comment/tryï¼
âââ AdHookScene.tsx # Ad: Before/After ã«ã¼ã
âââ AdProofScene.tsx # Ad: ã¿ã¤ãã¼ + ã¹ã¯ã·ã§
âââ AdDiffScene.tsx # Ad: 1è¡ä¿®æ£ãã¢
âââ AdCTAScene.tsx # Ad: CTAï¼profile/commentï¼
TikTok Format Constraints
| é ç® | å¤ |
|---|---|
| è§£å度 | 1080 x 1920 (9:16 縦å) |
| FPS | 30 |
| Safe Areaä¸é¨ | 160px (UIãªã¼ãã¼ã¬ã¤) |
| Safe Areaä¸é¨ | 260px (UIãªã¼ãã¼ã¬ã¤) |
| Safe Areaå·¦å³ | 60px padding |
| Adçå°º | 11.5s = 345f |
| LPçå°º | 15.0s = 450f |
Composition Architecture
Adç (TikTokAd) â Sequence ãã¼ã¹
Hook(24f/0.8s) â Proof(126f/4.2s) â Diff(105f/3.5s) â CTA(90f/3.0s) = 345f
Sequenceã®from+durationInFramesã§æ£ç¢ºãªãã¬ã¼ã å¶å¾¡COPY_VARIANTS(A/B/C) ã§æè¨A/Bãã¹ãctaVariant(“profile” | “comment”) ã§CTAã¢ã¼ãåæ¿
LPç (TikTokPromo) â TransitionSeries ãã¼ã¹
Hook(29f) â Proof(107f) â Edit(143f) â Cards(128f) â CTA(75f)
= 482f - 4*8f(transitions) = 450f
TransitionSeries+linearTimingã§ã·ã¼ã³éãã©ã³ã¸ã·ã§ã³- ãã©ã³ã¸ã·ã§ã³å°º = 8f (LP_TRANSITION)
- è¨ç®å¼: åè¨ = sum(ã·ã¼ã³å°º) – (ãã©ã³ã¸ã·ã§ã³æ° * ãã©ã³ã¸ã·ã§ã³å°º)
Animation Rules (CRITICAL)
ç¦æ¢äºé
- CSS transition/animation ç¦æ¢ â Remotionã¯åãã¬ã¼ã ãç¬ç«ã¬ã³ããªã³ã°ããããåä½ããªã
- emojiç¦æ¢ â ã¯ãã¹ãã©ãããã©ã¼ã ã§ã¬ã¤ã¢ã¦ããºã¬ãSVGã¢ã¤ã³ã³ (Icons.tsx) ã使ç¨
- native
<img>ç¦æ¢ â<Img>+staticFile()ã使ç¨
å¿ é ãã¿ã¼ã³
// ã¢ãã¡ã¼ã·ã§ã³ã¯å¿
ã useCurrentFrame + interpolate/spring
const frame = useCurrentFrame();
const opacity = interpolate(frame, [0, 10], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
motion.ts ã¦ã¼ãã£ãªãã£
| 颿° | ç¨é | ç¹å¾´ |
|---|---|---|
fadeIn(frame, start, duration) |
ãã§ã¼ãã¤ã³ | interpolate |
fadeOut(frame, start, duration) |
ãã§ã¼ãã¢ã¦ã | interpolate |
enterFromBottom(frame, start, duration) |
ä¸ããç»å ´ | Easing.out(exp) |
enterFromRight(frame, start, duration) |
å³ããç»å ´ | Easing.out(exp) |
scaleIn(frame, fps, delay) |
ã¹ã±ã¼ã«ã¤ã³ | spring(damping:200) â ãã¦ã³ã¹ãªã |
springBounce(frame, fps, delay) |
ãã¦ã³ã¹ | spring(damping:12, stiffness:200) |
Component API Quick Reference
詳細㯠components.md ãåç §ã
| ã³ã³ãã¼ãã³ã | 主ãªProps | ç¨é |
|---|---|---|
SafeArea |
children | TikTokå®å ¨é åã©ããã¼ |
KineticLine |
text, fontSize, emphasisWord, veil | ããã¹ã表示ï¼åºå®å¹ ãä¸å¤®æãï¼ |
Icons.* |
size | SVGã¢ã¤ã³ã³ (Bolt/Table/Globe/Pen/Arrow) |
TapRing |
x, y, delay | ã¿ããæ¼åº |
TimerBadge |
seconds, done | ã¿ã¤ãã¼è¡¨ç¤º |
ProgressBar |
progress, done, width | 鲿ãã¼ |
Background |
– | ãã¼ã¯èæ¯ |
GlowEffect |
color, size, delay | ã°ãã¼æ¼åº |
Workflow
æ°è¦ã·ã¼ã³ä½æ
constants.tsã«ã·ã¼ã³å°ºãå®ç¾©scenes/ã«ã·ã¼ã³ã³ã³ãã¼ãã³ãã使- ã¡ã¤ã³ã³ã³ãã¼ãã³ã (TikTokAd/TikTokPromo) ã«ã·ã¼ã³ã追å
- TransitionSeriesä½¿ç¨æã¯ãã¬ã¼ã è¨ç®ãæ¤è¨¼:
sum(scenes) - (transition_count * LP_TRANSITION) = LP_FRAMES
æè¨å¤æ´
- LPç: åã·ã¼ã³ãã¡ã¤ã«å ã®ããã¹ãç´æ¥å¤æ´
- Adç:
constants.tsã®COPY_VARIANTS(A/B/C) ã夿´
ã¬ã³ããªã³ã°
cd promo-video
npx tsc --noEmit # åãã§ãã¯ï¼å¿
é ï¼
npm run render:all # å
¨4æ¬ã¬ã³ããªã³ã°
# åå¥:
npm run render:ad-profile # Ad Profile CTA
npm run render:ad-comment # Ad Comment CTA
npm run render:lp-comment # LP Comment CTA
npm run render:lp-try # LP Try CTA
åºåå
: promo-video/out/
Common Pitfalls
| åé¡ | åå | å¯¾å¦ |
|---|---|---|
| Folder name error | Folder nameã«ã¹ãã¼ã¹ | a-z, A-Z, 0-9, - ã®ã¿ä½¿ç¨ |
| NotoSansJP subset error | “japanese” subsetæå® | çªå·ä»ãsubset [0]–[123] ãä½¿ç¨ |
| 循ç°åç § | Root.tsx â Composition | fonts.ts ãç¬ç«ãã¡ã¤ã«ã«å颿¸ã¿ |
| render command format | remotion render Root CompId |
remotion render CompId --output path |
| ç»å表示ãããªã | native <img> |
<Img src={staticFile("path")}/> |
| ãã©ã³ããã | fontFamilyæªè¨å® | AbsoluteFill ã® style ã« fontFamily è¨å® |
| ã¬ã¤ã¢ã¦ããã | åºå®å¹ æªè¨å® | KineticLine (maxWidth), ããã¹ãã¯center align |
AI Assistant Instructions
ãã®ã¹ãã«ãæå¹åãããæ:
- promo-video/ ã§ä½æ¥: cd ãã絶対ãã¹ã使ç¨
- constants.ts ãèµ·ç¹ã«: å°ºã»ã«ã©ã¼ã»ã³ãã¼ã¯ãã¹ã¦ãã
- åãã§ãã¯å¿
é : 夿´å¾ã¯
npx tsc --noEmitãå®è¡ - ã¬ã³ããªã³ã°ç¢ºèª:
npm run render:allã§å ¨æ¬åºåç¢ºèª - Remotion best practices skill ãåç §: ã¢ãã¡ã¼ã·ã§ã³ã»ãã©ã³ã¸ã·ã§ã³è©³ç´°
Always:
- ã¢ãã¡ã¼ã·ã§ã³ã¯
useCurrentFrame+interpolate/springã®ã¿ - ããã¹ã表示ã¯
KineticLineãåªå ä½¿ç¨ - ã¢ã¤ã³ã³ã¯
Icons.tsxã®SVGã¢ã¤ã³ã³ã使ç¨ï¼emojiç¦æ¢ï¼ - ç»åã¯
<Img src={staticFile("...")}/>ãä½¿ç¨ - TransitionSeries ã®ãã¬ã¼ã è¨ç®ãæ¤è¨¼ãã
- SafeArea å ã«ã³ã³ãã³ããé ç½®ãã
Never:
- CSS transition/animation ã使ããªã
- emoji ãããã¹ãã«å«ããªã
- native
<img>ã使ããªã - ãã¬ã¼ã è¨ç®ãæ¤è¨¼ããã«ã³ãããããªã