Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 89 additions & 0 deletions skills/recoup-internal-video-grok-1.5-imagine-facetime/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
name: recoup-internal-video-grok-1.5-imagine-facetime
Comment thread
coderabbitai[bot] marked this conversation as resolved.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The skill slug contains 1.5, which isn't a plain-English hyphenated token and may break skill registration/routing that expects the recoup-internal-[domain]-[verb]-[noun] pattern. Consider normalizing to something like recoup-internal-video-grok-imagine-facetime or recoup-internal-video-grok-15-imagine-facetime.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At skills/recoup-internal-video-grok-1.5-imagine-facetime/SKILL.md, line 2:

<comment>The skill slug contains `1.5`, which isn't a plain-English hyphenated token and may break skill registration/routing that expects the `recoup-internal-[domain]-[verb]-[noun]` pattern. Consider normalizing to something like `recoup-internal-video-grok-imagine-facetime` or `recoup-internal-video-grok-15-imagine-facetime`.</comment>

<file context>
@@ -0,0 +1,119 @@
+---
+name: recoup-internal-video-grok-1.5-imagine-facetime
+description: INTERNAL — Recoup staff tooling, gated by the recoup-internal keyword. Invoke ONLY when the request explicitly includes "recoup-internal" (e.g. "recoup-internal make a FaceTime ad"). Never use for customer-facing or artist requests. Produce a FaceTime-call-style ad — two people on a screen-recorded video call — where every talking-head clip is generated by Grok Imagine 1.5 on fal.ai speaking a scripted dialogue verbatim, with native voice and lipsync (no TTS, no lipsync model). Use when the user wants a FaceTime call ad, a two-person conversation video, a Grok Imagine video, or an AI-talking-artist clip. Covers script/take structure around Grok's 15s cap, the prompt grammar that gets word-perfect dialogue, the real-person likeness pipeline and its consent gate, fal mechanics, QC, assembly, and the handoff to hyperframes (chrome/render) and recoup-internal-social-ship-posts (publish/measure).
+---
</file context>

description: INTERNAL — Recoup staff tooling, gated by the recoup-internal keyword. Invoke ONLY when the request explicitly includes "recoup-internal" (e.g. "recoup-internal make a FaceTime ad"). Never use for customer-facing or artist requests. Produce a FaceTime-call-style ad — two people on a screen-recorded video call — where every talking-head clip is generated by Grok Imagine 1.5 on fal.ai speaking scripted dialogue verbatim, with native voice and lipsync (no TTS, no lipsync model). Use when the user wants a FaceTime call ad, a two-person conversation video, a Grok Imagine video, or an AI-talking-artist clip. Covers take structure around the 15s cap, the prompt grammar for word-perfect dialogue, the real-person likeness pipeline and consent gate, QC, assembly, and handoffs to hyperframes (chrome/render) and recoup-internal-social-ship-posts (publish/measure).
---

# FaceTime-Call Ads with Grok Imagine 1.5

Two people on what looks like a screen-recorded FaceTime call, talking about the product.
Core discovery: `xai/grok-imagine-video/v1.5/image-to-video` **speaks prompt-scripted dialogue
verbatim, with the speaker's own voice and correct lipsync** — no TTS, no lipsync pass (both
lost the bake-off; a sync pass deadens the face, HeyGen avatars read as studio ads).

Reference build (copy it, don't rebuild): `strategy/recoup-rostrum-baseline/sweetman/content/facetime-call/`
— `NOTES.md` is the decision log, `index.html` the FaceTime chrome. `FAL_KEY`: `mono/api/.env.local`.

## ⚠️ Consent gate

Real artists' AI likenesses **never ship without the artist's explicit sign-off** + an AI/permission
disclosure in the post. Send each artist their clip privately for approval first (it doubles as
warm-lead outreach). Fictional characters need no gate.

## Pipeline

1. **Script** ~45-60s as alternating turns (A, B, A, B): topic-first, one proof point, organic
close ("okay, send me the link") — ship-posts' copy principles apply.
2. **Faces**: one 9:16 FaceTime-frame image per character (below).
3. **⛔ FRAME APPROVAL GATE — user OKs every frame before ANY video call.** Frames cost $0.022
to fix; takes ~$2, and a frame defect multiplies into every take generated on it. Skipping
this roughly doubled the prototype's spend.
4. **Takes**: one generation per turn. On a new frame, QC one take before batching the rest.
5. **Cut** (every cut = character switch) → **chrome** (hyperframes) → **ship** (ship-posts).

## Takes

- **15s hard cap per generation** (rejected at generation time, not enqueue). Prompt in
timestamped ~5s beats: `(0-5s) … (5-10s) … (10-15s) …`.
- **One generation = one continuous voice; voice is NOT stable across generations.** Never split
a character's consecutive lines across takes; hide every take joint behind a cut to the other
character. Alternating turns does this for free.
- Unbroken shot >15s: `extend-video` (+2-10s, "what happens next" prompt) continues voice and
scene — input must be **≤15.0s** (outputs run ~15.04s; trim to 14.9s first).
- Size duration to the lines (~2.5-3 words/s). Trim end-of-take dead air in assembly using
Whisper word timestamps.

## Prompt grammar

```
FaceTime video call, subtle camera micro-shake, <room/lighting>, natural casual delivery
with clear enunciation. Exactly one person in the room, only <her> voice, <her> lips move
with every word <she> speaks starting immediately from the very first word.
(0-5s) <The character> says, speaking from the first moment: "<line>"
(5-10s) <small physical direction> and says: "<line>"
(10-15s) Looking straight into the camera <she> says: "<line>"
```
Comment on lines +47 to +54

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Add a language tag to the prompt example.

The fenced block is missing a language specifier, which is already tripping markdownlint and makes the snippet less readable.

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 52-52: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/recoup-internal-video-grok-1.5-imagine-facetime/SKILL.md` around lines
52 - 59, The fenced prompt example in the SKILL.md snippet is missing a language
specifier, which is causing markdownlint to flag it and reducing readability.
Update the fenced block in the prompt example to include an appropriate language
tag, keeping the existing FaceTime prompt content intact; the relevant snippet
is the one starting with the video-call description and continuing through the
three timed lines.

Source: Linters/SAST tools


- **No action verbs in dialogue beats** — "laughs and says" produces 3s of laughing INSTEAD of
the line. Emotion goes in the tone direction; the beat verb is always plain `says`.
- The one-person / only-her-voice / lips-from-first-word / one-hand-on-the-phone clauses each
kill a real artifact (phantom voices, opening mime, third hands). Keep them all.
- **QC every take**: `ffmpeg -vn` → `fal-ai/whisper` (`chunk_level: "word"`), diff transcript
against script; pull frames at suspect timestamps. Slurs or mime-gaps → re-roll (~$2).

## Faces

- Fictional: `grok-imagine-image` t2i — "vertical smartphone selfie video call still frame …
grainy front-camera quality … authentic FaceTime screenshot aesthetic, not professional."
- Real person: photo → `grok-imagine-image/edit`. **Letterbox square sources to 9:16 first**
(else x-axis squish). Prompt must say "**plain raw camera image only: no user interface, no
status bar, no text**" or Grok bakes a fake FaceTime UI into the image. Bars survive → one
more edit ("extend this exact scene … no black bars"). Strip gibberish clothing text if it appears.
- **Reuse the same approved frame for all of a character's takes** — that locks face and room.
- Artist photo sources, in order: workspace `sweetman/content/*/assets/art/`; og:image of their
IG post pages (profile avatars are 150px); Spotify oEmbed `thumbnail_url`.

## Mechanics, assembly, handoff

- fal queue: `POST queue.fal.run/<model>` → poll `…/requests/{id}/status` → GET result. Media
inputs >~700KB must go via fal storage (`rest.fal.ai/storage/upload/initiate` → PUT → `file_url`).
Validation failures cost nothing.
- Assemble: normalize takes (720x1280@30, h264, aac) → concat demuxer, trimming each at its
Whisper speech-end (+0.3s).
- Chrome: copy the reference hyperframes project (caller bar + ticking timer, rec pill, PiP of
the other character with crossfade at cuts, grain, end card; Geist fonts — the renderer can't
supply Apple system fonts). `npm run check` must pass with zero errors, then `npm run render`.

## Cost (measured 2026-07-02)

720p video bills $0.14/s (480p $0.08/s — untested quality lever); identity edits $0.022. A
debugged 50s two-character video ≈ **$10**; budget ~2 re-rolls per 4 takes.
Loading