The 34KB Web Character Player That Packs Even Camera Tracking Into the Browser
LivLiv Player has open-sourced an approximately 34KB 2.5D web character player that supports lip sync and camera-based facial tracking, and can also load VRM and PNGTuber. The code is Apache-2.0; character licensing is separate.
LivLiv Player has been open-sourced. It is a 2.5D character player that runs in the browser, with a core of about 30 KB gzipped and a full package of about 34 KB. It supports lip sync and camera-based facial tracking, and can be embedded into web pages, livestream overlays, or apps. The author is yeko @LivLiv, and the GitHub repository and examples have both been released.
First, the demo.
The project solves a very specific problem: when you want to put a character on a web page that blinks, breathes, turns its head, and talks, in the past you either had to integrate Live2D/Cubism or handle rendering and asset formats yourself. LivLiv Player uses WebGL2, has no dependencies, provides a unified API, and can load LivLiv's own models as well as VRM 0.x / 1.0 and PNGTuber. Lip sync and facial tracking are imported on demand; the core does not carry these modules.

Technical readers will care about a few points. Lip sync supports three input types: microphone, audio, and video; facial tracking runs in the browser using Google's MediaPipe, and camera images stay on the device. The tracking module and speech module are loaded only when called. The code is Apache-2.0, the core has no dependencies, it is not yet on npm, and currently you need to build from the repository and import dist/index.js. Browser support requires WebGL2 and ES2023: desktop Chrome/Edge 97+, Firefox 104+, Safari 15.4+; mobile has not been tested yet.
For ordinary users, this is a web avatar player. With a few lines of code you can put a character on a page, load 21 built-in characters, or replace them with your own PNGTuber images or VRM models. You can also embed /live/

Licensing is clearly separated. The code is Apache-2.0, so commercial players are fine. The 21 built-in characters do not use the same license as the code. Most are made by LivLiv and can be used for free in personal non-commercial projects with attribution; they cannot be sold, used commercially, or used to train AI models. Kujira, Kujira Q, and Pen come from other people's works, with separate licensing and attribution requirements. When a user asked whether commercial use was allowed, the author replied that the player can be used freely, but for characters you need to email admin@livliv.ai or send a direct message.

There are a few practical friction points in community feedback. Someone asked whether VRM exported from Blender could be loaded; the author said both VRM 0.x and 1.0 are supported, Blender exports should work, but it has not been tested yet, and users can report issues if they encounter problems. Someone was concerned about camera permissions; the author explained that the player does not request the camera when loading—only when the page calls startFaceTracking, usually triggered by a button. After permission is denied, the character still blinks, breathes, and follows the pointer, so the cost of denial is low. There is currently no built-in pre-permission prompt UI. Someone asked about physics-based swaying effects; the author said it is in progress. Someone also asked about Face ID, but there was no author reply under the post at the time.
What is worth noting is the size. 34 KB is very light and suitable for embedding and OBS, but what really determines whether it can be adopted is camera permissions, character licensing, and mobile support. The author leaves permission triggering under page control and separates code and character licensing; these two points affect usage more than compressing to 34 KB. The demo address and repository are below, and VRM exported from Blender still needs a public test; anyone with a model can try it.
<iframe src='https://livliv.ai/live/k01' width='480' height='640' allow='camera; microphone'
style='border:0;background:transparent'></iframe>
import { Player } from '@livliv/player'
const player = new Player(document.querySelector('canvas'))
await player.load('characters/k01/')
player.setExpression('smile')
player.act('nod')
player.params.mouthOpen = 0.6
Repository: https://github.com/livliv-dev/player
Online example: https://livliv-dev.github.io/player/example/gallery.html?demo=1
发布时间: 2026-11-06 03:32