afcorson
I'm using the Sound servo (EZB Playback) robot skill in ARC to control my robot's mouth servos. The audio is played through the EZB's audio output, but the mouth movement is significantly out of sync with the sound I hear from the EZB. I have tried adjusting every parameter in the Sound servo (EZB Playback) skill with no improvement.
I am not using the Talk servo skill because that is intended for spoken text/TTS, not pre-recorded audio. Are there any other options within ARC (other Robot Skills, scripting, or EZB settings) for achieving better synchronization of mouth movement to pre-recorded playback?
Related Hardware (view all EZB hardware)
Related Robot Skills (view all robot skills)
Upgrade to ARC Pro
ARC Pro will give you immediate updates and new features needed to unleash your robot's potential!
While new comments are no longer being accepted, the information here remains available for learning and reference. Check the most recent comment for additional details.

Yes - for pre-recorded audio, you have a couple of better options than trying to force tighter sync from Sound servo (EZB Playback) alone.
Why this happens
The Sound servo (EZB Playback) skill reacts to the audio level being streamed/output by the EZ-B, so it is inherently dependent on:
That means the mouth can lag behind what you hear, even if the settings look correct. This is especially noticeable with pre-recorded speech because the mouth timing needs to feel very exact.
Better options in ARC
1) Drive the mouth with a script instead of live audio amplitude
If you know the audio file being played, the most reliable approach is:
This gives you deterministic sync instead of "audio-reactive" sync.
For example, you can create a JavaScript action that plays the file and moves the servo on a timed loop:
That’s a simple example. For real clips, you’d tune the timing to match the waveform or syllables.
2) Use a sound-triggered script and animate the mouth yourself
If you still want the audio to start the motion, consider:
This is often more controllable than the Sound servo skill.
Skill reference:
3) Use external audio timing markers
If you’re working with a specific collection of audio clips, a good workflow is:
This is much more accurate than using amplitude-following for lip sync.
4) Reduce audio streaming delay
If the mouth is only slightly behind, the issue may be audio transport latency rather than the servo skill itself. ARC audio streaming over Wi-Fi can introduce delay.
Things to try:
ARC’s audio playback is packet-based, so network conditions can absolutely affect sync. More on that here:
5) Use a custom robot skill if you need advanced lip-sync
If you want a dedicated solution for pre-recorded clips, the best long-term answer may be to create your own robot skill that:
If ARC doesn’t already have the exact feature you need, that’s a great case for a custom skill:
What I’d recommend
For pre-recorded audio, I’d rank the options like this:
One important note
If your audio is being played through the EZ-B speaker, and the servo is reacting to the output stream, there will always be some delay because the servo is following the audio pipeline, not the audio source itself.
A couple questions so I can point you to the best setup
If you want, I can help you build a JavaScript lip-sync action in ARC for pre-recorded clips. The ARC AI Assistant built into ARC can also help rewrite the script right in the editor:
OK. I tested EZB audio output using SoundServoEZB versus Bluetooth Audio using SoundServoPC. There was a big difference. The mouth sync was very good using a Bluetooth speaker with the exact same settings. The mouth sync using EZB audio was very poor. My conclusion is to avoid using EZB output audio to control mouth movement.