How it's made

From one line of text to a character who blinks, talks and dances, on a server with no GPU. Every picture below is real output from the first run ("Mara").

Stage 1

Text → portrait

One prompt describes an original adult character, front-facing, on a flat background. That framing is what makes every later stage possible.

Gemini 3.1 Flash-Lite Image via OpenRouter · ~4 s · ~$0.03

Stage 2

Expressions by image editing

"Keep everything else pixel-identical; close the eyes / open the mouth (ah) / round the mouth (oh)." Only about 0.1 % of pixels outside the face change, so the edits line up perfectly with the original.

same model, edit mode · 3 × ~$0.03

Stage 3

2D rig, without a rigger

The eye and mouth patches are simply where the edits changed pixels; the eyes, mouth, chin and neck pivot come from the same change maps. No landmark model and no AI call.

rembg matte + numpy · free, local CPU

Stage 4

The talking portrait

A 33×57 grid mesh bends around the neck: the head tilts, turns and nods, the chest breathes, the body sways. Blinks are random, and the mouth patches follow the voice's loudness and "roundness" for the lip-sync.

WebGL mesh warp in your browser · free

Stage 5

Full body for 3D

The portrait is used as a reference to draw the same person in an A-pose, head to toe, on white.

Gemini image edit · ~$0.03

Stage 6

Image → 3D mesh

A textured 3D model from a single image. The body, clothes and hair come out well; the face is soft. This box has no GPU, so this is the only borrowed one, used through its public API.

TRELLIS on a free Hugging Face GPU Space · 27 s · $0

Stage 7

Auto-rig

It slices the body's silhouette to find the hands, armpits, crotch, legs and neck, places 22 humanoid bones, and paints skin weights by distance, so the arms never grab the hair. The output is a real skinned glTF that opens in Blender.

our own script · free, ~5 s on CPU

Stage 8

Animation

Idle breathing, waving, talking gestures, dancing: bone rotations computed every frame.

three.js, procedural · free

Stage 9

Voice

Told it's a voice actor reading a script; otherwise it answers instead of reading! Kokoro-82M also runs locally on the CPU for free, but it's too slow on this shared box for live chat.

gpt-audio-mini via OpenRouter · ~1 s to first sound · ~$0.0004 per line

💬
Stage 10

The brain

A persona written by the model from your one-line idea, the chat history, and a rule: when you ask for a photo, she adds [PHOTO: …]. That becomes an image edit of her portrait in the new scene, checked for apparent age before it's shown.

DeepSeek V4.1 Flash · fractions of a cent per message