For years, Oculus Lipsync (OVRLipSync) was the free default for making characters talk in Unity and Unreal. It listened to audio and produced weights for 15 visemes in real time. Meta's developer documentation now marks the plugin as end-of-life: it will not receive further updates or support (Meta developer docs).
Projects keep working as long as the old plugin builds with your engine version, but it won't follow new engine releases, so it's worth planning a replacement.
What Oculus Lipsync produced
Each frame, a weight for 15 visemes: sil (silence), PP (p, b, m), FF (f, v), TH, DD, kk, CH, SS, nn, RR, aa, E, ih, oh and ou. Meta describes the set as language-agnostic and chosen for the widest range of lip movement. Characters built for it have one blend shape per viseme, often named viseme_PP, viseme_aa and so on.
Meta's own path: the Movement SDK
Meta points developers to its Movement SDK, whose audio-based face tracking delivers the same 15 visemes through the XR_META_face_tracking_visemes OpenXR extension. If your app is built for Quest headsets, this is the closest drop-in. It is tied to Meta's platform, so it doesn't help a website or a non-Meta device.
The alternatives
| Option | Input | Output | Runs | Good for |
|---|---|---|---|---|
| Meta Movement SDK | Audio | 15 visemes | Quest (OpenXR) | VR apps on Meta headsets |
| Azure Speech visemes | Text (Azure voices) | 22 viseme IDs, or 55 blend shapes at 60 fps | Azure cloud | Projects already using Azure neural voices |
| Rhubarb Lip Sync | Audio (+ optional text) | 6 basic + 3 extra mouth shapes | Offline, command line | Pre-recorded dialogue, 2D and cartoon characters |
| Web Audio loudness | Audio | Jaw opening only | Browser | Prototypes |
| Lobbyface Lip sync API | Text + audio or phoneme timings | ARKit curves (Oculus visemes coming) | Hosted API | Web, Unity and Unreal characters with your own voice |
A few details worth knowing:
- Azure returns visemes or blend shapes only for speech synthesised by Azure's own voices, so it can't animate a recorded actor or another TTS provider.
- Rhubarb is fast and dependable for scripted lines, but it is offline-first and its mouth set is made for cartoons.
Keeping your viseme characters
You don't have to rebuild your characters to move off Oculus Lipsync:
- Keep the 15 viseme shapes and switch to a source that outputs the same set (Movement SDK, or an API with an Oculus viseme output).
- Or add ARKit shapes to the character. ARKit curves describe the mouth as many independent movements rather than one pose per sound, and read more naturally, especially on fast speech.
If you go with ARKit, a rough starting map from visemes helps when testing:
| Viseme | Main ARKit shapes |
|---|---|
PP |
mouthClose, mouthPressLeft/Right |
FF |
mouthRollLower, mouthUpperUpLeft/Right |
aa |
jawOpen |
ou |
mouthPucker, mouthFunnel, a little jawOpen |
oh |
mouthFunnel, jawOpen |
E, ih |
mouthStretchLeft/Right, a little jawOpen |
On the web
None of the classic plugins run in a browser. For three.js, Babylon.js or any WebGL character, you need curves or visemes from a service, then the playback code from our three.js lip sync guide.
Our Lip sync API is built for that case: send the line's text with its audio (any voice) or the phoneme timings your TTS gives you, and get ARKit curves calibrated to your model, with an Oculus viseme output for existing characters coming during early access.