Unity has no built-in lip sync, so every talking character needs a plugin or a source of animation. The options split into two families: analyse the audio at runtime, or play precomputed curves. Here's how the main ones compare.
uLipSync: free, open source audio analysis
uLipSync analyses the audio as it plays, computing MFCCs (a representation of the vocal tract), and matches them to phonemes you register in a profile, typically the vowels A, I, U, E, O plus silence.
- Licence: MIT, free.
- Runs: in Unity on any platform, using the Job System and Burst, with no native plugins; WebGL and VRM are supported.
- Strengths: works with any voice, live or recorded, and can bake results to an AnimationClip or a Timeline.
- Limits: it hears vowel-like sounds well, but consonants like "p", "b" and "m" (lip closures) and "f"/"v" are harder to pick up from audio features alone. You calibrate a profile per voice.
SALSA LipSync Suite: the long-running Asset Store choice
SALSA LipSync Suite by Crazy Minnow Studio is a paid package that also includes emotes and head, eye and eyelid control.
- Price: listed at $49.50 on the Asset Store.
- How it works: the developer describes it as lip sync approximation from audio analysis only, with no text input.
- Strengths: a complete "living face" toolkit, popular in VR, with integrations for voice chat systems.
- Limits: approximation rather than phoneme-accurate motion. The developer has also stopped supporting Ready Player Me characters, which matters less now that Ready Player Me itself has closed (see our article on the shutdown).
Oculus Lipsync: retired
Meta's OVRLipSync gave weights for 15 visemes from audio and was the free default for years. Meta now lists it as end-of-life, with no further updates, and points to the Movement SDK for Quest apps. Existing projects keep working while the plugin still builds with your Unity version. The replacements are covered in Oculus Lipsync is end-of-life.
Platform SDKs
Conversational character platforms such as Convai ship Unity SDKs that stream blend shape frames together with the voice. They work well inside their own ecosystem: their characters, their voices and their AI. They aren't a general lip sync tool for your own audio and pipeline.
Precomputed ARKit curves
For the most natural result, compute the mouth motion ahead of playback from the speech itself, with a model that works from phonemes. You get one row of ARKit blend shape weights per frame, and play it in sync with the AudioSource.
- Strengths: real closures, rounding and anticipation. The same curves work in Unity, Unreal and the web, and nothing is analysed on the device at runtime.
- Limits: you need the curves before the line plays. That's natural for TTS and recorded dialogue, and for live AI conversation it means one quick request per sentence.
Applying them in Unity takes a few lines. Note that Unity's blend shape weights run from 0 to 100, while ARKit curves run from 0 to 1:
using UnityEngine;
public class CurvePlayer : MonoBehaviour
{
public SkinnedMeshRenderer face; // head; repeat for teeth and tongue meshes
public AudioSource voice;
public float fps = 30f;
public string[] names; // curve names, e.g. "jawOpen"
public float[][] frames; // weights per frame, 0..1
int[] index;
void Start()
{
index = new int[names.Length];
for (int c = 0; c < names.Length; c++)
index[c] = face.sharedMesh.GetBlendShapeIndex(names[c]); // -1 if the model lacks it
}
void LateUpdate()
{
if (frames == null || !voice.isPlaying) return;
float f = voice.time * fps; // the audio clock, not Time.time
int i0 = Mathf.Min(frames.Length - 1, (int)f), i1 = Mathf.Min(frames.Length - 1, i0 + 1);
float k = f - (int)f;
for (int c = 0; c < names.Length; c++)
{
if (index[c] < 0) continue;
float w = Mathf.Lerp(frames[i0][c], frames[i1][c], k);
face.SetBlendShapeWeight(index[c], w * 100f);
}
}
}
Use LateUpdate so the weights apply after the Animator, or the Animator may overwrite them. Ease in and out of each line rather than snapping to the first frame.
Comparison
| Option | Input | Output | Cost | Best for |
|---|---|---|---|---|
| uLipSync | Audio (runtime) | Vowel weights | Free | Any voice, VTubers, prototypes |
| SALSA LipSync Suite | Audio (runtime) | Approximated shapes + emotes | Paid asset | A complete living-face kit |
| Oculus Lipsync | Audio (runtime) | 15 visemes | Free, retired | Existing projects only |
| Platform SDKs | Their voice | Blend shape frames | Platform plan | Characters built on that platform |
| Precomputed ARKit curves | Text + audio | ARKit weights per frame | API usage | The most natural speech |
Choosing
- Live microphone input, such as a VTuber or voice chat: runtime audio analysis (uLipSync or SALSA).
- TTS or recorded dialogue, where you know the line before it plays: precomputed curves for the best quality.
- An AI character answering visitors: precomputed curves per sentence, which is how our own hosts work.
The Lobbyface Lip sync API returns ARKit curves from text plus audio or phoneme timings, ready for the script above, and calibrated to the blend shapes your model has.