fix-my-look
Use when the user asks for fix my look or a task matching the examples below. Change ANYTHING inside a video — background, scene, lighting, outfit, weather, mood — from a free-form prompt, while keeping the EXACT original facial identity, motion, speech, audio AND closest supported output ratio. Edi
By pika-labs · 892 installs
npx skills add pika-labs/pika-plugins --skill fix-my-look
Source repository · Upstream listing
fix my look
Edit the source's first usable frame with gpt image 2 from the user's prompt,
then propagate that look across the clip with kling reference video while
locking the original face, motion and audio via the original video + audio as
references. All prep happens in one normalize video
call for short clips, or one normalize call per segment for longer clips. The
output ratio uses the normalized clip's closest supported output ratio; this
skill does NOT reframe the source video.
Inputs
<source — path or URL to a video file with audio
<change prompt — what to change (e.g. "make it night with neon lights",
"change my shirt to a leather jacket", "put me on a beach in Hawaii")
Empty args menu
1. "What's the source video path?"
2. "What do you want to change? (e.g. 'put me on a beach', 'make it night')"
Workflow
Working dir: ~/Downloads/fix my look/<run id / .
Step 0 — Cost, timer and task IDs
Every tool named below is a Pika MCP tool, written by its bare name. Call it
under whatever prefix your session exposes for the Pika MCP.
Start a timer when the source and change prompt are known. Before paid
generation, call estimate cost for the planned
generate image edit ,
generate reference video , any multi segment
edit concat , and any optional audio/lipsync repair
call. If cost is not surfaced by the host, say
Cost not surfaced by this harness in the final report instead of guessing.
When any tool returns a
task id , copy the exact value into the run notes and reuse it verbatim; do not
hand type long JWT style task IDs.
Step 1 — Prepare the clip
Local file? upload asset it first; an HTTPS media URL
passes directly. Decide the source windows before normalizing: use one 14.8s
window for sources <=15s, and split longer sources into ordered 14.8s windows.
Call
normalize video(video url=<source , start s=<offset , max duration s=14.8, extract audio=true, extract face frame=true)
once per window. Use the first window's face frame url for the edited still;
use each window's video url as that segment's motion/identity reference. For
multi window clips, also call
extract audio from video(video url=<source ) so the
final merged output can be restored to one continuous source audio track.
Wire the result into the rest: face frame url is the Step 2 edit target;
each normalized video url is Kling's reference for that segment in Step 4;
set aspect ratio = result.aspect ratio ?? result.closest aspect ratio for
each normalize result, then carry that local aspect ratio through the image
and video calls. If neither field is present, stop and report that normalization
output is missing an aspect label. Compute
duration = max(4, min(15, round(duration s))) per segment, and use
resolution="720p"
unless the user asked for high res. If face found is false, no clear face was
found and face frame url fell back to the t=0 frame — proceed but warn
identity may drift, or re run with a start s at a section where the subject
faces camera.
Reference video providers can reject oversized reference assets. If the
normalize result or the downstream provider error shows a normalized video is
over the provider limit, retry normalize video once
with crf=28 and the same start s , max duration s , extract audio , and
extract face frame values. If the reference is still too large, stop before
another paid video attempt and report that
normalize video needs a worker side 1080 edge /
reference size cap. Do not patch this with local shell media commands.
Step 2 — Edit the frame with gpt image 2 (the "change" stage)
generate image edit with provider="gpt image 2" ,
aspect ratio=<aspect ratio , resolution="2K" ,
images=[<face frame url ] , quality="high" , prompt:
"Modify the reference photograph as follows: <change prompt . Keep the
person's face, identity, hair, body and pose EXACTLY as in the reference.
CRITICAL: preserve every object the subject is holding or touching — phones,
products, drinks, bags, props, jewelry — in the exact same hand, position,
orientation and scale; never remove, replace or restyle them. Change only the
requested scene, background, clothing, lighting or environment, not who the
person is."
Keep the "preserve held objects" clause verbatim on every re render — without
it gpt image 2 silently drops products/phones the subject is holding.
If gpt image 2 returns a content policy false positive for fashion, glam, or
beauty prompts, retry once with the same intent but a modest / editorial wording
such as "polished event styling, opaque clothing, natural pose, non sexual
fashion portrait". For makeup prompts, explicitly preserve the original eye
shape, eyelids, iris color and gaze; heavy eyeliner/eye shadow is a high risk
identity drift source.
Step 3 — Show the edited frame and wait for approval
Surface the edited frame and STOP. Ask "Approve for video generation, or tweak
and re render?" Do NOT call video generation until approved. For tweaks, re run Step 2
(locked clauses verbatim) and loop.
Step 4 — Propagate via Kling reference video
For each normalized segment, call generate reference video
with provider="kling" , reference videos=[<segment video url ] ,
reference images=[<edited frame url ] , aspect ratio=<aspect ratio ,
duration=<segment duration , sound=false , video keep sounds=[true] ,
prompt:
"Apply the change shown in <<<image 1 to <<<video 1 . Keep the person in
<<<video 1 with the EXACT same face, identity, expressions, motion and
timing; preserve the original video's kept sound track. The new
scene/background/clothing/lighting should match <<<image 1 . CRITICAL:
preserve every object the subject is holding or touching in <<<video 1 —
phones, products, drinks, bags, props — in the same hand and orientation every
frame. Keep mouth motion active through the final frame when the person is
speaking. Do not alter the person's identity."
Append any extra creative direction (e.g. "very cinematic, soft golden light")
after the locked text — never replace it.
Do not pass sound=true to Kling with a video input. Kling rejects that
combination with error:1201 sound on is not supported with video input ; use
sound=false plus video keep sounds=[true] to keep the source video's audio.
If the source was split into multiple windows, call
edit concat(video urls=[<segment outputs in order ]) .
After concat, run
edit audio replace(video url=<concat url , audio url=<full source audio url , duration policy="video")
when the merged output audio is missing, drifted, or discontinuous.
Only try Seedance if the user explicitly asks for it, or if Kling fails and a
second provider attempt is useful. Use the same segmenting rule and record the
provider error plainly if Seedance rejects the input or drops speech/action.
Async handling: if any call returns a {task id, status} envelope, poll
task status({task id}) in a tight loop until terminal.
Step 5 — Audio, duration and identity QA
Before reporting success, verify the generated video against the source:
Duration must not be meaningfully cut off. If output duration differs from the
intended source window or merged source duration by more than 0.5s, mark the
run as failed / needs follow up.
If the source has speech, audio must be present through the tail and mouth
movement must not freeze before the spoken content ends. If words are missing,
garbled, silent, or visibly out of sync, do not call the run PASS .
The approved frame corrections must persist into the video. If the provider
reintroduces a removed artifact such as eyeglass glare, mark it as a
propagation caveat or re render from a stronger approved frame.
Compare identity at start, middle, segment boundaries, and end. If Kling
preserved motion but changed the face, call that out as a provider limitation
instead of a pass.
If the video is visually acceptable but speech audio is missing, incomplete, or
drifted, offer one paid repair pass:
1. edit audio replace(video url=<generated video url , audio url=<full source audio url or segment audio url , duration policy="video")
2. edit lipsync(video url=<audio restored url , audio url=<full source audio url or segment audio url , variant="v2 pro")
If the model froze the mouth near the end, do not keep escalating to sync 3
automatically; lip sync cannot reliably recover a face track with no mouth motion.
Offer trim / regenerate instead.
Step 6 — Download + return
Download the result to ~/Downloads/fix my look/<run id /result.mp4 and return
that path plus the final report fields: source, edited frame URL, final video
URL, provider, job/task IDs, cost estimate or not surfaced , elapsed
time, QA notes, and follow up issue.
Failure modes
Symptom Cause Fix
Output face drifts from the original gpt image 2 over edited the face OR the provider under weighted the source video Re run Step 2 with a stronger "keep the face the same" clause; soften change prompt .
Output looks like the original (no change) Edited image too similar, OR you passed the raw frame not the edited output Re run Step 2 with a more dramatic prompt; confirm the edited frame URL.
Output aspect doesn't match source Source aspect not in {16:9, 9:16, 1:1, 4:3, 3:4} Step 1 returns aspect ratio , or closest aspect ratio on older worker payloads; use it as the closest supported output label and ask the user for exotic aspects.
Provider rejects the normalized video as too large normalize output can remain too large for 4K/iPhone sources Retry normalize once with crf=28 ; if still too large, stop and file worker follow up for a 1080 edge / reference size cap.
Long source only returns the first short window The caller normalized once with max duration s=14.8 and skipped segmenting Split into 14.8s windows, generate each segment, then edit concat in order and restore full source audio if needed.
Speaking clip loses sound, drops words, or freezes mouth at the tail Provider regenerated speech/audio instead of preserving the source, or the face track has no mouth motion to drive Mark as not pass. Offer one edit audio replace + edit lipsync repair pass; if tail mouth motion is frozen, offer trim/regenerate instead.
Approved frame fix disappears in the video Provider propagation reintroduced the original artifact Re render from a stronger approved frame or mark provider propagation caveat; do not claim the frame correction shipped.
Kling rejects with error:1201 sound on is not supported with video input sound=true was passed with a video reference Retry the Kling call with sound=false and video keep sounds=[true] ; do not use reference audio for Kling video input.
Kling output is shorter than the normalized source Provider returned a shorter render, or the caller accidentally passed a trimmed reference Do not mark pass. Compare output duration to the normalized source, then regenerate that segment or ask the user for a shorter window.