Fil · Skills

Create AI Avatar, a skill for Claude Code, Codex and Cursor

A skill for Claude Code, Codex and Cursor: a HeyGen digital twin trained on a couple of minutes of your own footage, saying lines you never recorded in your own ElevenLabs voice, on the engine whose mouth moves most like yours, judged close up beside your real footage.

Install it

Claude Code:

curl -fsSL https://fil.design/skills/create-ai-avatar.zip -o /tmp/create-ai-avatar.zip && unzip -o /tmp/create-ai-avatar.zip -d ~/.claude/skills

Codex:

curl -fsSL https://fil.design/skills/create-ai-avatar.zip -o /tmp/create-ai-avatar.zip && unzip -o /tmp/create-ai-avatar.zip -d ~/.codex/skills

GitHub:

npx degit MengTo/Skills/agent-skills/media/create-ai-avatar ~/.claude/skills/create-ai-avatar

Or make one in Fil with its workflow: https://fil.design/workflows/create-ai-avatar. Fil is invite-only for now: join the waitlist at https://fil.design/waitlist.

Or tell your agent:

Install the Create AI Avatar skill from https://fil.design/skills/create-ai-avatar: unzip https://fil.design/skills/create-ai-avatar.zip into your skills folder (~/.claude/skills for Claude Code, ~/.codex/skills for Codex), then read its SKILL.md.

The skill’s folder: https://fil.design/skills/create-ai-avatar.zip (zip), GitHub, and each file:

SKILL.md

HeyGen API · ElevenLabs · ffmpeg. Scripts are plain Node 20 and bash, with no packages to install.

An avatar of you is three things, each from its best source. The face and the way you move come from your own footage (a HeyGen digital twin). The voice is your own clone on ElevenLabs, made into an audio file. One engine lip-syncs the two. You then judge the result where likeness breaks first: the mouth, close up, beside your real one.

Boundary. Use html-explainer-video for a film with no face in it, and html-reel to cut your real phone takes into a reel. Use this skill when the person on screen should be you, saying words you didn't record.

Provenance. Built on 2–3 November 2026, making Meng To's twin from the eye-contact takes of his Framer video (2 min 48 s) and his ElevenLabs voice, Meng Voice 2026 Pro on v4. The same 8.8-second line was rendered on all three engines. Avatar V over-acted his mouth, and he picked Avatar IV.

The mechanism

Keep the face, the voice and the lip-sync apart, and only ever change one of them. The twin is trained once. The voice is a file you listen to before it goes anywhere. A render is the twin plus that file on one engine. When something looks wrong you can then tell which part to change. Use the same line and the same audio for every engine you compare: a new line hides what the engine did.

HeyGen can't use an ElevenLabs voice by its id. Make the line on ElevenLabs (scripts/voice.mjs), then send HeyGen the audio as audio_asset_id or audio_url instead of script and voice_id. The video is as long as the audio, up to 30 minutes.

Judge it by the mouth. In a whole frame every engine looks fine. Crop the nose-to-chin box at six moments of each render and of your real footage, and stack them (scripts/mouths.sh). Then look at how wide the lips stretch, how much of the teeth show, the colour of the lips and the corners of the mouth.

Two ways to an avatar

Digital twinTalking photo
From15 s to 10 min of footage, about 2 min bestOne photo
Costs firstAbout $2.13 to train, plus consentNothing
A second of videoAvatar V $0.12, IV $0.0805, III $0.01$0.0385 (Avatar IV)
MovesAs you do: your head, your habitsWhat the engine imagines
Use forAnything that has to pass as youA quick line, or no footage yet

Both take your audio. Fil's Create AI avatar workflow is the talking photo: your photo and a voice, wired into HeyGen Avatar IV.

The workflow

  1. Pick the footage (references/footage.md). Use your best talking takes: you alone, facing the camera with the face in frame throughout, in a quiet room, at 1080p. That's two to three minutes of natural speech. Eye-contact takes are best. Download each once and join them with bash scripts/prep-footage.sh footage.mp4 take-*.mp4.
  2. Upload it. node scripts/upload.mjs footage.mp4 direct-uploads up to 200 MB and keeps the asset id beside the file.
  3. Train it. Say the price ($2.13) and the wallet first. Then run node scripts/train.mjs --footage <asset_id> --name "Ada · March takes", which trains in a few minutes. A new character gets a consent link: the person in the footage opens it within 24 hours and records a short statement. The twin renders only once its look is completed and its consent accepted. To add new footage of the same person, pass --group.
  4. Make the line. Run node scripts/voice.mjs "<one line, about 25 words>" line.mp3 --voice <your clone>. Listen to it, and check its words with node scripts/hear.mjs line.mp3.
  5. Render the same line on each engine you're weighing, with no motion prompt: node scripts/render.mjs --look <look_id> --audio line.mp3 --engine avatar_iv. Each render prints its price first and the wallet after.
  6. Judge. Run bash scripts/mouths.sh mouths.jpg footage.mp4 twin-avatar_v.mp4 twin-avatar_iv.mp4 twin-avatar_iii.mp4 and put the renders side by side with their sound. Show the person both before saying which is best: it's their face (references/judging.md).
  7. Use the one they pick for the real lines, and write it down with the ids: the look, the group, the voice and the engine.

Rules

Each rule names the failure it prevents.

The engines, on one twin and one line

EngineA secondThe mouthEverything else
Avatar V$0.12Lips stretched, both rows of teeth, pinker lipsSmoothed skin; invents the most
Avatar IV$0.0805Small and round, top teeth now and thenHand gestures; the owner's pick
Avatar III$0.01Closest: small openings, natural lip colourYour real head movement; oldest, so check sync by ear

That's one face in one session, so judge your own: it's why step 6 exists.

Numbers

Files

Keys: HEYGEN_API_KEY, ELEVENLABS_API_KEY and ELEVENLABS_VOICE_ID (your clone), from the environment or .env.local. They're never printed.