name: animated-voiceover-ad description: מודעת וידאו אנכית (9x16, ריל/סטורי לממומן במטא) שבנויה כולה בקוד ב-Remotion מעל קריינות של בעל העסק: טקסט קינטי על כל מילה, טלפון עם התראות, מונה תוצאות, חותמות, כרטיס הצעה ו-CTA, עם מוזיקה ואפקטים. להפעיל כשמבקשים "מודעת אנימציה", "סרטון אנימציה לממומן", "מודעה עם הקריינות שלי", "מודעה בלי לצלם את עצמי", או כששולחים הקלטת קול ומבקשים ממנה סרטון. גם לתיקונים במודעה כזו: "המוזיקה חזקה", "השנייה הזו משעממת", "הטקסט לא מסונכרן", "תעשה עוד גרסה".
מודעת אנימציה על קריינות
העיקרון
מה ששומעים = מה שרואים. הקריינות קובעת את הזמנים. מקליטים קודם, whisper נותן זמן לכל מילה, וכל טקסט, סצנה, התראה ואפקט נכנסים על מילה. בקוד אין מספרי פריימים: כותבים at: 'לקוחות' והזמן נשלף מ-public/words.json. הקלטה חדשה = npm run vo, והסרטון מתיישר לבד.
אף שנייה במסך לא עומדת. שנייה בלי תזוזה = הצופה גולל.
חוקי ברזל
- אתה לא שומע. בעל העסק הוא האוזן היחידה. כל בדיקת אודיו שלך היא מספרית (
silencedetect,ffprobe, תמלול חוזר). אסור לכתוב "האודיו תקין" בלי לצטט פלט. - קודם מנקים שקטים, אחר כך מתמללים. whisper טועה בזמנים ליד שקט.
prep-vo.shעושה את שניהם בסדר הנכון. - אחרי שינוי באודיו מריצים
npm run voמחדש. בלי זה כל הסנכרון זז. - הסרטון נגמר כשהקריינות נגמרת + 8 פריימים (
DURATIONב-time.ts).render-all.shמדפיס את האורך של כל קובץ מול הקריינות. אם הם שונים, משהו נחתך. - טקסט רק בין y=260 ל-y=1570. מעל ומתחת אינסטגרם מכסה.
validate()עוצר את הרינדור עם הסבר אם טקסט יוצא מהאזור או רחב מ-1000px. - האפקטים מתחת לקול. קבועים ב-
Ad.tsx: קריינות 1.15, מוזיקה 0.22, כל אפקט מוכפל ב-SFX = 0.38. "האפקטים חזקים" = משנים מספר אחד. - stills לפני mp4.
npm run checkמרנדר 10 פריימים ל-out/stills. להסתכל על כולם (Read על ה-PNG) לפני רינדור מלא. - רק תוכן אמיתי. מספרים, תשלומים והודעות של לקוחות: מה שקרה באמת. מותר להסתיר שמות, אסור להמציא תוצאות. גם בגלל מדיניות מטא וגם כי אנשים מריחים זיוף.
- עברית: הפונטים (Rubik, Heebo, וריאבליים, OFL) כבר בטמפלייט ונטענים עם
delayRender. השורש ב-direction: rtl. מספרים בתוך תווית מקבליםdirection: ltr.
התקנה ראשונה של פרויקט
cp -R ~/.claude/skills/animated-voiceover-ad/template ~/ads/<שם-המודעה>
cd ~/ads/<שם-המודעה>
npm install
npm run setup # אפקטים ומוזיקה מ-Mixkit
צריך: Node 18+, ffmpeg, whisper-cli (brew install ffmpeg whisper-cpp) ומודל whisper ב-~/.whisper/models/ggml-large-v3-turbo.bin (אם חסר, words.mjs מדפיס פקודת הורדה).
ה-pipeline
| שלב | מה עושים |
|---|---|
| 1. תסריט | לפי references/script-formula.md. כל משפט ממופה מראש לסצנה. מראים לבעל העסק לפני שהוא מקליט. |
| 2. הקלטה | בטלפון או ב-QuickTime, קובץ אחד. טעה? עוצר שנייה ומתחיל את המשפט מחדש. אחר כך מוחקים את הטייק הרע (ראה references/audio.md). |
| 3. ניקוי ותמלול | npm run vo -- recording.m4a. מדפיס את כל המילים עם זמנים. מראים לבעל העסק את התמלול ומתקנים מילים ש-whisper טעה בהן ישירות ב-public/words.json (רק את w). |
| 4. בימוי | עורכים רק את src/Ad.tsx: KTS (טקסט קינטי), התראות, SCENES. כל זמן = מילה, ['עוד', 2] למופע שני. פירוט הקומפוננטות ב-references/scenes.md. |
| 5. בדיקה | npm run check (tsc + stills). מסתכלים על כל still. |
| 6. רינדור | npm run render. כל מוזיקה ב-MUSICS (Root.tsx) = קובץ נפרד ב-out/, לבדיקת A/B. |
| 7. תיקונים | כל הערה של בעל העסק = שינוי קבוע אחד: מילה אחרת ב-at, ווליום, until. לא כותבים סצנה מחדש. |
גרסאות לממומן
- מוזיקה: כבר מובנה, 3 קומפוזיציות.
- פתיחות שונות: 3 השניות הראשונות קובעות. מקליטים 2-3 הוקים שונים כקבצים נפרדים, מחברים כל אחד לגוף עם
ffmpeg concat, מריציםnpm run voעל כל חיבור ומרנדרים לתיקייה נפרדת. כל ה-Ad.tsxנשאר זהה כל עוד המילים בגוף זהות. - כתוביות מלאות:
CAPTIONS = trueב-Ad.tsx. שורה אחת, נשברת לפי פיסוק. שימושי כי רוב הצפיות בממומן בלי סאונד.
תקלות מוכרות
| תקלה | פתרון |
|---|---|
המילה "X" לא נמצאה בקריינות | ההודעה מציעה מילים קרובות. בעברית whisper מדביק או מפצל תחיליות (ו/ה/ל/ב). משתמשים במילה כמו שהיא ב-words.json. |
| הרינדור מראה קוד ישן | bundle ישן ב-$TMPDIR/remotion-webpack-bundle-*. render-all.sh מוחק אותו. |
| TypeScript 7 מותקן | Remotion צריך [email protected]. |
delayRender נתקע | --timeout=180000 (כבר ב-render-all). |
| חותמת מתכווצת לפני שהיא נוחתת | overshootClamping: true ב-spring שלה (כבר בפנים). |
| מילים נדבקות אחרי ניקוי שקטים | להעלות stop_duration ב-prep-vo.sh ל-0.35. |
| שנייה "משעממת" | להוסיף שם שורת KT, התראה או אפקט על המילה הזו. אף שנייה בלי אירוע. |
הדמו שבטמפלייט
הטמפלייט מגיע עם קריינות דמו (קול TTS, public/vo.wav + public/words.json) ו-Ad.tsx שמסונכרן אליה, כדי שאפשר לראות הכל עובד לפני שמקליטים: npm install && npm run setup && npm run check. במודעה אמיתית: npm run vo -- recording.m4a דורס את שניהם, ואז כותבים את Ad.tsx מחדש לפי התסריט.