AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured process for creating a digital twin or photo avatar that mimics a person's appearance and voice. It covers the end-to-end procedure, including preparing and uploading footage, training the model, managing consent, generating audio, and rendering video across different engines. The workflow emphasizes a comparative approach, where users render the same line across multiple engines and evaluate the results by comparing mouth movements against original footage to ensure the best match.
What it does
- Prepares and joins video takes for digital twin training.
- Uploads assets and manages the HeyGen training process.
- Handles consent requirements for digital twin creation.
- Generates audio using ElevenLabs voice cloning.
- Renders video output using different HeyGen engines.
- Provides a method to compare and judge mouth movements across renders.
When to use it
- When you need to create a digital twin or talking head of yourself or a consenting person.
- When you want an avatar to speak using your own cloned voice.
- When you need to generate a lip-synced video from a photo and audio.
- When you need to troubleshoot or improve the mouth movements of an existing avatar.
Advantages
- Uses a systematic, comparative approach to select the best engine for specific facial movements.
- Separates face, voice, and lip-sync components to isolate and fix issues.
- Provides scripts for consistent asset management and rendering.
- Includes a specific method for judging mouth synchronization against real footage.
Usage examples
- “Create a digital twin of myself using my YouTube footage.”
- The agent will guide you through picking eye-contact takes, joining them, uploading the footage, and initiating the training process.
- “My avatar's mouth looks wrong and over-acts.”
- The agent will help you render the same line on different engines (Avatar V, IV, and III) to compare mouth movements and select the most natural one.
Install
3 of its files are not mirrored here, so install it from its source:
https://github.com/MengTo/Skills/tree/5ea1661a0e05d82b054553daaa6baf6d0233c33c/agent-skills/media/create-ai-avatar
Documentation by Meng To
Create AI Avatar
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 in November 2026 on a creator's own twin, trained from the eye-contact takes of one YouTube video (2 min 48 s) and voiced in his ElevenLabs clone on v4. The same 8.8-second line was rendered on all three engines, and the creator picked by the mouth. The demo shows four presenters made from single portraits as HeyGen photo avatars, so nobody's real footage is on show.
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.
Three ways to an avatar
| Digital twin | Photo avatar | Talking photo | |
|---|---|---|---|
| From | 15 s to 10 min of footage, about 2 min best | One photo | One photo |
| Costs first | About $2.13 to train, plus consent | About $1.32 | Nothing |
| Engines | Avatar V, IV, III | Avatar V, IV, III | Avatar IV only |
| Moves | As you do: your head, your habits | What the engine imagines | What the engine imagines |
| Use for | Anything that has to pass as you | A presenter from a portrait, on Avatar V | A quick line |
All three take your audio. Start on Avatar V: it's HeyGen's newest engine and the default here. Judge it by the mouth, and step down to IV or III if it over-acts the person you know. Fil's Create AI avatar workflow is the photo avatar: your photo and a voice, wired into HeyGen Avatar V.
The workflow
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.Upload it.
node scripts/upload.mjs footage.mp4direct-uploads up to 200 MB and keeps the asset id beside the file.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 iscompletedand its consentaccepted. To add new footage of the same person, pass--group.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 withnode scripts/hear.mjs line.mp3.Render the line on Avatar V, with no motion prompt:
node scripts/render.mjs --look <look_id> --audio line.mp3. To compare, render the same line on--engine avatar_ivandavatar_iiitoo. Each render prints its price first and the wallet after. A portrait instead of footage: make it a photo avatar withPOST /v3/avatars{ type: 'photo' }(references/heygen.md) and render its look the same way.Judge. Run
bash scripts/mouths.sh mouths.jpg footage.mp4 twin-avatar_v.mp4 twin-avatar_iv.mp4 twin-avatar_iii.mp4and 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).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.
Check which face goes with which voice before rendering. Two photo avatars' ids were swapped once, and four renders paired each face with the other person's voice. Name every file after its person, and check the look's
namebefore each render.A new render needs a new Idempotency-Key. One render was sent again with the first render's key, and HeyGen handed back the first video.
render.mjsbuilds the key from the subject and the audio.Change the engine, not the prompt, when the mouth over-acts. On Avatar V the lips stretched wide and both rows of teeth showed. A
motion_promptandmore_blinkingchanged almost nothing; Avatar IV and III fixed it.expressivenessis for photo avatars on Avatar IV only. Avatar V rejects it, and a twin doesn't take it.A calm read beats an acted one. A stability-0 read with
[excited]and[laughs]sounded less like the creator than the default. Start calm, and change the voice only after the face is right.A twin is no sharper than its footage. Takes scaled down to 720p gave a 1280×720 look. Train from 1080p.
Say the price and the wallet before every paid call. The wallet is the account's, so anything else on the same key spends from it too. It once dropped $1.76 more than the twin and one render cost.
Consent belongs to a group and to one person. Never add someone else's footage to a group, and never train anyone who hasn't agreed. HeyGen runs no consent check for a photo, so getting the person's agreement is on you.
Download a source once, then work from the local file. Never loop ffmpeg over a signed link.
Training clones a voice too. HeyGen makes
default_voice_idfrom the footage as its own resource. Use it only if your ElevenLabs clone isn't there. Deleting the twin doesn't delete it.Hands can come out wrong. Avatar IV gestures, and in one render a thumb looked rubbery. Watch the whole frame once before using a take.
The engines, on one twin and one line
| Engine | A second | The mouth | Everything else |
|---|---|---|---|
| Avatar V | $0.12 | Lips stretched, both rows of teeth, pinker lips | Smoothed skin; invents the most |
| Avatar IV | $0.0805 | Small and round, top teeth now and then | Hand gestures; the creator's pick for his own face |
| Avatar III | $0.01 | Closest: small openings, natural lip colour | Your 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
Footage: 15–600 s (about 2 min best), long edge 640–4096 px, mp4 or webm, one person, up to 200 MB direct.
Training: about $2.13, about 4 minutes for 2 min 48 s. A photo avatar: about $1.32, ready in about 10 seconds.
Consent link: valid 24 hours.
A line: about 25 words, 8–10 s, the same audio for every engine.
One 8.8 s render: Avatar V $1.05, IV $0.71, III $0.09; 2–3 minutes each.
Audio: mp3 or wav, up to 32 MB as an asset, up to 30 minutes a video.
Mouth sheet: 6 moments a row, a 420 × 300 box of a 1920-wide frame, moved to fit the face.
Files
references/footage.md: picking, joining and checking takesreferences/heygen.md: every HeyGen call the scripts make, and its answersreferences/judging.md: the mouth sheet, what to look for, showing the personscripts/keys.mjs: keys from the environment or.env.local, and the HeyGen clientscripts/prep-footage.sh,upload.mjs,train.mjs,consent.mjs,voice.mjs,hear.mjs,render.mjs,mouths.sh,balance.mjsdemo/index.html: four presenters from single portraits on Avatar V, one on all three engines, with the mouth sheet
Keys: HEYGEN_API_KEY, ELEVENLABS_API_KEY and ELEVENLABS_VOICE_ID (your clone), from the environment or .env.local. They're never printed.
Files
- ATTRIBUTION.mdAdded by AutoGineer849 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md9.3 KiB
- agents/openai.yaml398 B
- demo/PROMPT.md1.3 KiB
- demo/avatar-iii.mp4(opens on GitHub)Not mirrored: opens on GitHub687.0 KiB
- demo/avatar-iii.webp14.2 KiB
- demo/avatar-iv.mp4(opens on GitHub)Not mirrored: opens on GitHub610.2 KiB
- demo/avatar-iv.webp17.7 KiB
- demo/avatar-v.mp4(opens on GitHub)Not mirrored: opens on GitHub620.3 KiB
- demo/avatar-v.webp17.0 KiB
- demo/index.html8.5 KiB
- demo/mouths.jpg118.7 KiB
- demo/preview.jpg68.2 KiB
- references/footage.md2.6 KiB
- references/heygen.md3.2 KiB
- references/judging.md2.4 KiB
- scripts/balance.mjsScript294 B
- scripts/consent.mjsScript843 B
- scripts/hear.mjsScript1.1 KiB
- scripts/keys.mjsScript2.2 KiB
- scripts/mouths.shScript1.9 KiB
- scripts/prep-footage.shScript1.7 KiB
- scripts/render.mjsScript4.0 KiB
- scripts/train.mjsScript3.1 KiB
- scripts/upload.mjsScript2.0 KiB
- scripts/voice.mjsScript1.8 KiB
references/footage.md
The footage
The twin learns your face and how you move from this, so it can't be better than this.
What HeyGen takes
| Must | Best | |
|---|---|---|
| Length | 15 to 600 seconds | About 2 minutes of natural talking |
| Size | Long edge 640 to 4096 px | 1080p |
| Format | mp4 or webm | mp4, H.264 |
| People | One, facing the camera throughout | |
| Sound | Clear speech throughout | A quiet room, no music |
| Framing | The face in frame from the first frame to the last | Head and shoulders, eyes near the top third |
A direct upload takes up to 200 MB; a link HeyGen fetches takes 32 MB. Two to three minutes at CRF 19 is usually 60 to 120 MB.
Picking takes
Use takes where you talk to the camera. Use takes made for a teleprompter or eye contact, not ones where you read off to the side. The twin keeps where you look.
Leave out anything that isn't you talking. That means screen recordings, B-roll, cuts to a second camera, and a hand over the face.
Keep one look. Use one shirt, one room and one light. Use a new group look (
--group) for another outfit, not a mixed clip.Use takes with natural speech, not a script read flat. The twin learns how much your mouth opens. Varied sentences teach it more than one repeated line.
Match the shape you'll use. Landscape takes make a landscape twin.
The twin this skill was built on used the eye-contact takes of one YouTube video (2 min 48 s), all from one session in front of the same shelves. It trained in about 4 minutes.
Where takes come from
A Fil canvas. A video's camera takes are on its canvas. Find them with the Fil MCP (
get_canvaswith a query, orsearch_library) and download each signed link once withcurl -o. Never point ffmpeg at a signed link in a loop.Your own files. Use the original recording, not an export with captions or zooms burned in.
YouTube. Only your own videos, from the original files where you have them. A re-download is compressed and often has music under the voice.
Joining
bash scripts/prep-footage.sh footage.mp4 take-1845.mp4 take-1846.mp4 take-1847.mp4It scales every take to the first one's shape (1920 on the long edge at most), sets 30 fps, joins them with their sound, and says the length and size. A gap between takes doesn't matter: each take should simply start and end on your face.
Check before uploading
Watch the joined clip once at 2× speed: one person, face in frame, nothing burned in.
Make a contact sheet if you're picking between sessions:
ffmpeg -i footage.mp4 -vf "fps=1/10,scale=320:-1,tile=6x3" sheet.jpg.Say the training price and the wallet before
train.mjs.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an API key, Needs Node.js
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Meng To
- Publisher
- Meng To (Community)
- Source
- MengTo/Skills · agent-skills/media/create-ai-avatar · commit 5ea1661
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Meng To or Meng To.
Get it from the source
3 of this skill’s files are not mirrored here, so there is no ZIP. Get the complete skill from its source: MengTo/Skills