npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

wlipsync-aego

v1.3.0

Published

MFCC-based lip-sync library using WASM and WebAudio based on uLipSync

Readme

wLipSync

npm version npm version github twitter mastodon ko-fi

This is a compatibility fork specialized for the bolt-cep Adobe extension framework. Unlike the original library, you must manually call the init() function before use (refer to www/index.ts for implementation details), as Top-level Await was removed to ensure compatibility with older CEF/Chromium environments.

A MFCC-based lip sync library for WebAudio using WASM. This is a port of the uLipSync project.

Usage

Either install the package from npm or load it using import maps:

<script type="importmap">
  {
    "imports": {
      "wlipsync": "https://cdn.jsdelivr.net/npm/wlipsync/dist/wlipsync-single.js"
    }
  }
</script>

The main entrypoint is a single file which has the WASM binary and audio worklet processor code inlined, meaning no further steps are required to initialize the library. See the following code on how to use the library:

// Import wLipSync
import { createWLipSyncNode } from 'wlipsync';

// Create Audio context
const audioContext = new AudioContext();

// Load wLipSync profile
const profile = await fetch('./profile.json').then(resp => resp.json());

// Create lip sync node
const lipsyncNode = await createWLipSyncNode(audioContext, profile);

// Connect audio source (e.g. audio file, microphone, etc...) to lipsync node
source.connect(lipsyncNode);

// ...

// Read current phoneme state in update/animation loop
console.log(lipsyncNode.weights, lipsyncNode.volume);

For a full example using Three.js and a VRM avatar, see the ./example/ folder.

[!IMPORTANT]
Since the project uses AudioWorklets it requires a secure context (either localhost or https://).

Creating a profile

A profile is required for wLipSync to work. This project does not come with a way to create these. Instead they can be made in Unity using uLipSync by following their Calibration instructions.

Using binary profiles

By default the profiles are stored in JSON format. While these files tend to compress nicely, a more compact binary representation is also supported by wLipSync. This format not only packs the data, it also stores precomputed values which would otherwise be computed at runtime when loading a profile.

To convert a JSON profile into a binary profile, the json2bin utility in the tools/ directory can be used. This script is also included in the published NPM package, meaning you can run it from your project using the following command:

node ./node_modules/wlipsync/tools/json2bin.js path/to/profile.json profile.bin

To load a binary profile, the following change needs to be made to the code sample above:

// Import wLipSync
-import { createWLipSyncNode } from 'wlipsync';
+import { createWLipSyncNode, parseBinaryProfile } from 'wlipsync';

// ...

// Load wLipSync profile
-const profile = await fetch('./profile.json').then(resp => resp.json());
+const binaryProfile = await fetch('./profile.bin').then(resp => resp.arrayBuffer());
+const profile = parseBinaryProfile(binaryProfile);

// Create lip sync node
const lipsyncNode = await createWLipSyncNode(audioContext, profile);

Building

The project consists of a C part compiled to WASM and corresponding TypeScript code. Everything can be compiled by running bun run build as this will execute all relevant commands in the right order. The following tools are expected to be present on the system:

  • clang
  • wasm-ld
  • wasm-opt (from binaryen)
  • make

Development

For testing during development, perform a full build:

bun run build

Now you can start the dev server, which should listen for changes to any file:

bun run

[!NOTE]
Currently the dev server shows the example which uses the wlipsync-single.js file. As this file inlines the minimized audio-processor.js and optimized wlipsync.wasm a full build is required to observe changes.